Kluczowymi czynnikami są:
- jakie możliwości mają swoich klientów? (np. Czy potrafisz wybrać parser XML z półki - bez wykluczania większości z nich ze względu na wydajność? Czy możesz kompresować pakiety w locie?)
- Jaka jest złożoność twoich danych ("płaska" lub głęboko structured?)
- Czy potrzebujesz aktualizacji o wysokiej częstotliwości? Częściowe aktualizacje?
Z mojego doświadczenia:
Prosty protokół tekst (które klasyfikują się jako DSL) z interfejsem
string RunCommand(string commandAndParams)
// e.g. RunCommand("version") returns "1.23"
sprawia wielu aspektach łatwiejsze: debugowania, rejestrowanie i śledzenie, rozszerzenie protokołu itp. Posiadanie prostego terminalu/konsoli do urządzenia jest nieocenione w wykrywaniu problemów, uruchomianiu testów itp.
Let's d Ogranicza szczegółowo ograniczenia, jako punkt odniesienia dla innych formatów:
- Klient musi uruchomić mikroprocesor. To nie jest tak skomplikowane, jak mogłoby się wydawać (rdzeniem mojej "biblioteki mikroprocesorów" jest 10 funkcji z około 200 liniami kodu całkowitego), ale podstawowe przetwarzanie ciągów powinno być możliwe
- Źle napisany parser to duża powierzchnia ataku. Jeśli urządzenia są krytyczne/wrażliwe lub oczekuje się, że będą działać w nieprzyjaznym środowisku, wdrożenie wymaga najwyższej staranności. (Dotyczy to również innych protokołów, ale szybko zhakowany parser tekstowy łatwo się pomylił)
- Koszty ogólne. Może być ograniczony przez mieszany protokół tekstowy/binarny lub base64 (który ma narzut 37%).
- Opóźnienie. Przy typowym opóźnieniu sieci, nie będziesz chciał wydać wielu małych komend, sposób żądania grupowania i ich zwroty pomagają.
- Kodowanie. Jeśli musisz przesłać łańcuchy, które nie są reprezentowalne w ASCII, i nie mogą używać czegoś takiego jak UTF-8 do tego na obu końcach, zaleta protokołu tekstowego szybko spada.
bym użyć binarny protokół tylko jeśli wymagane na urządzeniu, możliwości przetwarzania urządzenia są szalenie niska (powiedzmy, kontrolery USB z 256 bajtów RAM) lub szerokości pasma jest poważnie ograniczona. Większość protokołów, z którymi pracowałem, używa tego, i to jest ból.
Google protBuf to podejście, które ułatwia uczynienie protokołu binarnego. Dobry wybór, jeśli możesz uruchamiać biblioteki po obu stronach i mieć wystarczającą swobodę, aby zdefiniować format.
CSV to sposób na spakowanie dużej ilości danych w łatwo przetwarzanym formacie, co stanowi rozszerzenie formatu tekstowego. Ma jednak bardzo ograniczoną strukturę. Używałbym tego, jeśli wiesz, że twoje dane pasują.
XML/YAML/... będę używać tylko wtedy, gdy moc obliczeniowa nie jest problemem, przepustowość albo nie jest kwestia czy można kompresować w locie, a dane ma bardzo złożoną strukturę . JSON wydaje się być nieco lżejszy pod względem wymagań obliczeniowych i parsera, może być dobrym kompromisem.
"najmniejsza ładowność" ma oznaczać "najmniejszy narzut"? Odpowiedź zależy od danych i nieco od częstotliwości aktualizacji. "Tak duże, jak powinno być", przenosi zerową informację. – peterchen
@peterchen: To dlatego, że nadal nie mam. Wiem tylko, że nie otrzymam zbiorów danych powyżej 1 MB. Najmniejszy ładunek oznacza format, który będzie miał mniej bajtów do przeniesienia, a następnie do innych. –
Byłoby dobrze, gdybyś rzucił okiem na dane - lub przynajmniej dokonał jakichś wykształconych przypuszczeń. ---- btw.W moim rozumieniu, ładunek jest ilością netto rzeczywistych informacji, przez które przechodzisz (zakładam, że chcesz najwięcej ładunku w najmniejszej łącznej kwocie). – peterchen