Czytałem o XMPP jako potencjalnym protokole komunikacyjnym dla urządzeń IoT, ale po przeczytaniu jednego źródła nie jestem pewien, czy to naprawdę odpowiedni protokół, jeśli obawiasz się narzutu dla każdej wiadomości.
To źródło stanowi:
Jednak XMPP ma wiele problemów, które sprawiają, że jest trochę niepożądany dla PROTOKÓŁ WBUDOWANYCH IOT. Jako protokół oparty na XML, XMPP jest bardzo szczegółowy, nawet bardziej niż HTTP, i ma duże obciążenie danych. Pojedyncza wymiana żądania / odpowiedzi w celu wysłania jednego bajtu danych z URZĄDZENIA PODŁĄCZONEGO IOT do serwera ma rozmiar większy niż 0,5 kB.
Istnieje projekt specyfikacji, który kompresowałby XMPP przy użyciu kodowania XML zwanego wydajną wymianą XML (EXI). Ale nawet w przypadku EXI ten sam bajt danych pobiera setki bajtów narzutu protokołu z samego XMPP. EXI jest również znacznie trudniejszym formatem do przetworzenia niż inne dostępne obecnie opcje. Z powodu tych nieodłącznych problemów na ogół zaleca się unikanie używania XMPP we wbudowanych aplikacjach IoT.
Jednak XMPP promuje się jako odpowiedni do aplikacji IoT (choć nie mówi konkretnie, że ma niski koszt), więc wydaje się dziwne, że tak duży, pozornie szczegółowy protokół byłby zalecany / promowany dla urządzeń IoT.
Czy narzut XMPP naprawdę jest tak duży, jak sugeruje źródło dla niewielkich ilości danych? Na przykład, jaki byłby narzut przy wysyłaniu wiadomości 8-bajtowej?
Czy narzut jest tak świetny, jeśli stosowana jest kompresja EXI (jak wspomniano w źródle)? Czy wiązałoby się to również z pewnymi pułapkami?
źródło
Odpowiedzi:
Chociaż można śmiało powiedzieć, że XML jest gadatliwy, należy go uspokoić, mając świadomość, że ta gadatliwość nie jest „narzutem” w stosunku do treści, ponieważ zawiera semantykę; narzut jest symptomatyczny dla każdego protokołu, który podkreśla dynamikę w przeciwieństwie do struktury statycznej. Na przykład HTML jest tak naprawdę zrelaksowaną formą XML, która przekazuje treść o dynamicznej strukturze, która może być uważana za aspekt zawartości. Możesz odróżnić zawartość tabeli od samej tabeli, ale fakt, że treść jest danymi tabelarycznymi o określonych relacjach, jest integralną częścią treści; gdybym po prostu wziął każdą komórkę i przesłał to wszystko jako jeden długi ciąg, struktura i te relacje zniknęłyby, a więc straciłem informacje i czy to nie treść?
Rozważmy 8-bajtową wiadomość, która może stanowić dane tabluar. Jeśli używam bardzo statycznego protokołu, mógłbym minimalnie przesłać go bez dodatkowych kosztów ogólnych, po prostu definiując taki protokół:
Jeśli wszystkie moje wiadomości są dokładnie takie, używanie XML, HTML lub XMPP może być uważane za głupie - tracę przepustowość na komponenty strukturalne, które są zawsze takie same i z góry określone, i marnuję odpowiedni czas obliczeń na obu końcach, tworząc go i analizując. Minimalna, właściwa strona HTML, która zawiera tylko tabelę 2 x 2 z kilkoma znakami w każdej komórce, prawdopodobnie będzie miała co najmniej 100 bajtów, aby pomieścić koszty związane z formatowaniem i protokołem.
Jeśli jednak nie wszystkie moje wiadomości są dokładnie takie, to określenie, jaki to rodzaj wiadomości, może nie być dosłowną częścią „ładunku”, ale jest niezbędnym komponentem pod względem treści. Mógłbym to zrobić za pomocą zaledwie dwóch dodatkowych bajtów i wprowadzić znacznie większą dynamikę:
Teraz moje 8 bajtów zawartości tabeli wymaga 2 bajtów narzutu, ale istnieje znacznie szerszy zakres możliwości w zakresie tego, jakie rodzaje wiadomości mogą być wysyłane za pomocą tego niestandardowego protokołu.
Nadal nie jest blisko możliwości strony HTML lub specyfikacji przestrzeni nazw XML (lub ich zestawu, którym w istocie jest XMPP ).
Na tej podstawie, jeśli przeważnie wysyłasz proste 8-bajtowe wiadomości, XMPP prawdopodobnie przesadza. Jednak niekoniecznie tak bardzo. Twierdzenie, że „pojedyncza wymiana żądania / odpowiedzi w celu przesłania jednego bajtu danych z URZĄDZENIA PODŁĄCZONEGO IOT do serwera ma więcej niż 0,5 kB”, wydaje mi się, patrząc na odpowiedni RFC , potencjalną przesadę (ale nb, wszystkie Rzuciłem okiem na to, nigdy nie wdrożyłem ani nie używałem XMPP). Nie wątpię, że mógłbyś skonstruować taki przykład, ale prawdopodobnie nie jest to minimalny przykład.
Ponieważ protokół jest zorientowany na TCP, ustanowienie „strumienia XML zakwalifikowanego przez przestrzeń nazw„ jabber: client ”- należy traktować jako część wiadomości tylko wtedy, gdy wykonujemy jedną rzecz - urządzenie kontaktuje się z serwerem, aby wysłać 8 bajtów, wysyła dane rozłączają się. Jeśli relacja jest bardziej trwała, co często bywało w kontekście Internetu Rzeczy, możemy założyć, że urządzenie ma już ustanowione połączenie z miejscem docelowym. W takim przypadku, jeśli ostatecznym miejscem docelowym wiadomości jest serwer (w przeciwieństwie do innego klienta, serwer przekaże wiadomość), wówczas obciążenie protokołu jest potencjalnie minimalne.
Mizerne 33 bajty „narzutu”. Warto tutaj zaznaczyć, że XML jest tekstem, więc jeśli twoje wiadomości są często binarne, stanie się o wiele mniej odpowiednie, ponieważ dane muszą zostać zakodowane (np. Base64 ), co powoduje dodatkowe obciążenie i obliczenia wymagania
Ostatecznie:
Jeśli istnieje trwałe połączenie, a wiadomości są w dużej mierze nieustrukturyzowane, nie sądzę. Jeśli jednak nie potrzebujesz tego, co oferuje (dynamizm w odniesieniu do struktury), prawdopodobnie są bardziej odpowiednie metody.
Kontynuujmy to, jeśli mamy kontekst, w którym pojedynczy serwer centralny przetwarza i / lub polega na komunikatach między różnymi urządzeniami, nawet jeśli to, co robi jedno z tych urządzeń, może być zawsze proste i jednoznaczne, protokół, który może zawierać różnorodne wiadomości byłyby nadal przydatne. Jeśli urządzenie klienckie ma ograniczone zasoby, możemy na stałe zakodować większą część protokołu, a zawijanie każdej wiadomości z tego końca staje się bardzo prostym zadaniem; Wierzę, że robi to wiele urządzeń IoT, które wdrażają serwery HTTP (co jest odwrotnością „prostych klientów, złożonego serwera”). Serwery te nie są w stanie obsłużyć żadnego rodzaju żądania HTTP (z wyjątkiem wstępnie sformatowanego odrzucenia) i mają bardzo dobrze zdefiniowany, skoncentrowany zestaw rzeczy do zrobienia i odpowiedzi, które wyślą, ale ponieważ mimo to działają poprawnie jako serwery HTTP,
źródło
Przede wszystkim powinienem powiedzieć, że XML został z powodzeniem wykorzystany do enkapsulacji wiadomości w czasie rzeczywistym i na dużą skalę, w szczególności do komunikacji IM i obecności w XMPP. Wydaje się również, że niektóre firmy zamierzają wykorzystać swoją wiedzę XML, aby spróbować znaleźć jeszcze jeden obszar zastosowania dla tego systemu reprezentacji danych.
Jednak nie wszyscy są przekonani, że XML jest odpowiedzią na wszystko w systemach przesyłania wiadomości. Na przykład w ostatnich latach nastąpiła zauważalna zmiana na systemy online, które używają JSON jako metody serializacji danych zamiast XML, a gdybym na chwilę włożył kapelusz programisty, powiedziałbym, że narzędzia do kodowania / dekodowania z natywnych reprezentacja (np. w Pythonie, PHP, JavaScript) wydaje się o wiele łatwiejsza w użyciu niż w przypadku JSON niż ich odpowiedniki w XML, nawet jeśli XML miał więcej czasu na prawidłowe odpowiedzi.
XML to trudna reprezentacja dla komputerów, ponieważ wymaga stosunkowo złożonego parsera tekstu, a następnie pewnego rodzaju hierarchicznej reprezentacji, aby umożliwić wyodrębnienie danych w programie. Ponieważ w grę wchodzi tak dużo tekstu, potrzeba sporo pamięci dostępnej do kodowania / dekodowania.
Często wydaje się niejasne, że XML wnosi dużą wartość do reprezentacji danych: jeśli podstawowy komunikat nie jest głęboko zhierarchizowany, wówczas dodawanie dużej ilości plewy tekstowej wydaje się niepotrzebne, ale paradoksalnie, jeśli jest dużo hierarchii, to dekodowanie wiadomości z jego reprezentacja tekstowa będzie ciężką pracą i będzie wymagać wielu zasobów. Ponadto korzyści z reprezentowania w tekście nie są dla mnie jasne: kiedy po raz pierwszy piszemy i debugujemy systemy komunikacyjne, często używamy narzędzi do monitorowania / dekodowania (na przykład Wireshark), aby pomóc nam dowiedzieć się, co się dzieje. W dłuższej perspektywie wszystko działa dobrze i żaden człowiek nie będzie musiał szczegółowo patrzeć na wiadomości w tę iz powrotem (tylko komputery). Komputery preferują reprezentację binarną. Reprezentacja tekstowa nie przynosi korzyści nikomu na żadnym etapie wdrażania.
XML jest trudny do odczytania (i ręcznego skonstruowania) przez ludzi, będąc jednocześnie ciężką pracą dla komputerów; Jest to zatem system, który nie jest odpowiedni dla komputerów i nie jest odpowiedni dla ludzi.
Co ważne, IoT ma pewne specjalne ograniczenia, które sprawiają, że pożądana jest efektywność. Urządzenia IoT będą zazwyczaj miały ograniczoną moc przetwarzania i pamięć (zwykle nie ma pamięci masowej na dużą skalę, tylko niektóre pamięci RAM i EEPROM). Urządzenie IoT może mieć najprostsze możliwe łącza komunikacyjne, a może nawet nie stos TCP / IP. Będzie wiele różnych projektów mikrokontrolerów, nawet na poziomie wyrafinowania, w których byłby używany standardowy system operacyjny (np. Linux, Android); ogranicza to liczbę gotowych narzędzi, które będą się oferować z łatwymi w użyciu interfejsami XML.
Podsumowując, podejrzewam, że dzięki IoT lepiej jest przedstawiać dane indywidualnie dla każdego przypadku, w zależności od ograniczeń sprzętowych, stylu komunikacji (np. Transmisji, datagramu, niezawodności itp.), Częstotliwości komunikacji i tak dalej. XML z pewnością nie powinien być traktowany jako warunek konieczny dla IoT.
źródło
Wiele lat temu analizowałem różnicę dotyczącą używania
XML w sieci płatności do reprezentowania transakcji płatniczych (numer_karty, data, godzina, identyfikator_ terminalu i lista dodatkowych elementów) w porównaniu z tradycyjnym
mapowany bitowo ISO8583
XML ma ogromny narzut. Jeśli weźmiesz pod uwagę wpływ w sieciach z ponad 10000 węzłami, z których każdy wysyła ponad 10 wiadomości co godzinę / codziennie do centralnego hosta, wtedy XML wychodzi i naprawdę potrzebujesz czegoś bardziej wydajnego.
źródło