{"id":9531,"date":"2019-04-23T18:46:27","date_gmt":"2019-04-23T16:46:27","guid":{"rendered":"https:\/\/pi3g.com\/?p=9531"},"modified":"2019-04-23T18:46:27","modified_gmt":"2019-04-23T16:46:27","slug":"introduction-to-the-snap-protocol","status":"publish","type":"post","link":"https:\/\/pi3g.com\/de\/introduction-to-the-snap-protocol\/","title":{"rendered":"Einf\u00fchrung in das SNAP-Protokoll"},"content":{"rendered":"<p><\/p>\n<h3>Einf\u00fchrung<\/h3>\n<p>S.N.A.P. ist ein Protokoll f\u00fcr die Kommunikation zwischen mehreren verbundenen Hosts. Es bietet:<\/p>\n<p>- adressierend<\/p>\n<p>- Flaggen<\/p>\n<p>- ack\/nak-Anfrage<\/p>\n<p>- Fehlererkennung (verschiedene Fehlererkennungsmethoden verf\u00fcgbar)<\/p>\n<p>Es kann \u00fcber verschiedene Medien, einschlie\u00dflich RS485, betrieben werden. Es ist f\u00fcr einen geringen Platzbedarf optimiert (begrenzte Rechen- und Speicherressourcen), aber je nach Bedarf skalierbar.<\/p>\n<p>Wenn Sie mehrere Computersysteme und die darauf laufenden Anwendungen miteinander verbinden wollen, z. B. einen Raspberry Pi und mehrere Atmel-Mikrocontroller \u00fcber ihre jeweiligen UARTs und unter Verwendung von RS485 als Medium, brauchen Sie etwas, das Ihre Daten verpackt, sie an die richtigen Hosts weiterleitet, Best\u00e4tigungen f\u00fcr den korrekten Empfang der Daten erh\u00e4lt usw. Daf\u00fcr gibt es SNAP. Es ist in gewisser Weise eine Alternative zu z. B. dem Modbus-Protokoll.<\/p>\n<p>SNAP wurde von HTH, High Tech Horizon, einem schwedischen Unternehmen, entwickelt.<\/p>\n<p>Die Homepage des Protokolls lautet: http:\/\/www.hth.com\/snap\/<\/p>\n<p>Um \u00fcber das Protokoll kommunizieren zu k\u00f6nnen, sollten Sie eine Anbieterkennung erhalten, die Sie bei HTH kostenlos beantragen k\u00f6nnen. Sie werden gebeten, eine PDF-Datei des SNAP-Protokolls oder einen Link zu ihrer Website http:\/\/www.hth.com\/snap\/ mit den Anwendungen\/Produkten zu \u00fcbermitteln. Die Anbieterkennung ist NICHT in den eigentlichen Protokollbytes enthalten, die Sie in Ihrer Bewerbung angeben. Sie k\u00f6nnen daher das Protokoll zun\u00e4chst evaluieren und dann die Evaluierung als tats\u00e4chliche Implementierung verwenden, ohne dass \u00c4nderungen erforderlich sind.<\/p>\n<p>Hier finden Sie die Liste der derzeit registrierten Anbieterkennungen:<\/p>\n<p>http:\/\/www.hth.com\/snap\/vidlist.html<\/p>\n<p>Hier ist ein Link direkt zum Datenblatt:<\/p>\n<p>http:\/\/www.hth.com\/filelibrary\/pdffiles\/snap.pdf<\/p>\n<h3>Einige grundlegende Eigenschaften von SNAP<\/h3>\n<p>- Bin\u00e4rprotokoll<\/p>\n<p>- Skalierbarer Funktionsumfang, abh\u00e4ngig von Ihrer Anwendung<\/p>\n<p>- arbeitet mit synchroner und asynchroner Kommunikation (= z.B. UART)<\/p>\n<p>- kostenlos f\u00fcr kommerzielle und private Nutzung. Erfordert kostenlose Vendor-ID f\u00fcr kommerzielle Id's<\/p>\n<p>Die Kommunikation zwischen den Knoten erfolgt in Form von Paketen. Lassen Sie uns ein Beispielpaket besprechen, das einige der Funktionen von SNAP nutzt:<\/p>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/04\/clip_image001.png\"><img loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"92\" title=\"clip_image001\" style=\"display: inline; background-image: none;\" alt=\"clip_image001\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/04\/clip_image001_thumb.png\" border=\"0\"><\/a><\/p>\n<p>Quelle: SNAP-Dokumentation, Beispiel f\u00fcr ein einfaches SNAP-Paket<\/p>\n<p>Pr\u00e4ambel: Die Pr\u00e4ambel ist optional, sie kann beliebige Zeichen enthalten, solange es sich nicht um das Synchronisationsbyte SYNC handelt. <\/p>\n<p>- SYNC: eindeutiges Byte mit folgendem Aufbau: 01010100, zeigt den Beginn des Pakets an<\/p>\n<p>- HDB2, HDB1: Die Header-Definitionsbytes HDB2 und HDB1 legen fest, wie lang das Paket sein wird und welche Merkmale verwendet werden.<\/p>\n<p>- DAB1: Zieladressbyte<\/p>\n<p>- SAB1: Quelladressbyte<\/p>\n<p>- DB1: Datenbyte 1 - die Nutzlast f\u00fcr Ihre Anwendung<\/p>\n<p>- CRC2: hohes Byte von CRC-16<\/p>\n<p>- CRC1: niederwertiges Byte von CRC-16<\/p>\n<p>Adresse <b>0<\/b> ist als Rundfunkadresse reserviert und sollte nicht f\u00fcr etwas anderes verwendet werden. (DAB \/ SAB)<\/p>\n<p>Hinweis: Ger\u00e4te, die mitten in der Kommunikation auftauchen, k\u00f6nnten sich auf eine \"normale\" 01010100 an der falschen Stelle synchronisieren (wo sie nicht als SYNC gedacht war). Daher sollte eine Pr\u00fcfsumme verwendet werden, damit das Ger\u00e4t erkennen kann, dass die Daten \"nicht passen\", und es sollte weiter auf das n\u00e4chste Paket warten, das mit der 01010100 beginnt. (Dies ist zum Schutz vor Frame-Verschiebungen notwendig). Nat\u00fcrlich verwirft das Ger\u00e4t alle Bytes, bevor es die erste 01010100 erh\u00e4lt, da es nicht das gesamte Paket erhalten hat. <\/p>\n<h4>Header-Definitions-Bytes<\/h4>\n<p><a href=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/04\/clip_image003.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"886\" height=\"243\" title=\"clip_image003\" style=\"display: inline; background-image: none;\" alt=\"clip_image003\" src=\"https:\/\/pi3g.com\/wp-content\/uploads\/2019\/04\/clip_image003_thumb.jpg\" border=\"0\"><\/a><\/p>\n<p>SNAP ist modular und erweiterbar aufgebaut. Sie k\u00f6nnen Zieladressen (DD) mit einer L\u00e4nge von 0 bis 3 Byte in den DAB (destination address bytes) definieren. Mit einer 3-Byte-Zieladresse (DD = 11) erhalten Sie bis zu 16 777 215 adressierbare Knoten. Mit einer 1-Byte-Zieladresse (DD = 01), wie im obigen Beispiel verwendet, k\u00f6nnen Sie 255 Adressen adressieren.<\/p>\n<p>Das Gleiche gilt f\u00fcr die L\u00e4nge der Quelladresse (SS) in den Quelladressbytes (SAB). Im Beispiel ist SS = 01 f\u00fcr 1-Byte-Adressen.<\/p>\n<p><b>PFB: Protokollspezifische Bytel\u00e4nge. 0 - 3 Bytes, wie oben (PP). Im Beispiel ist PP = 00. Diese Funktion ist in SNAP noch nicht implementiert, daher sollte sie wie im Beispiel auf 0 gesetzt werden. Eine spezialisierte Implementierung von SNAP k\u00f6nnte wahrscheinlich etwas damit anfangen (z.B. Paketz\u00e4hler, etc.) - siehe SNAP-Dokumentation f\u00fcr einige Ideen.<\/b><\/p>\n<p>ACK: Dies ist ein wichtiger Bereich der Header-Definition. Er gibt an, ob der sendende Knoten ein ACK-\/NAK-Paket anfordert, und dient auch als die eigentliche ACK-\/NAK-Antwort des empfangenden Knotens:<\/p>\n<p>- 0 0 = Keine Ack-Anforderung (Tx)<\/p>\n<p>- 0 1 = Ack-Anforderung (Tx)<\/p>\n<p>- 1 0 = Ack-Antwort (Rx)<\/p>\n<p>- 1 1 = NAK-Antwort (Rx)<\/p>\n<p>CMD - Befehlsmodus-Bit. Setzen Sie dieses Bit auf Null. Es handelt sich um eine erweiterte Funktion von SNAP, die Sie in Ihrer Anwendung h\u00f6chstwahrscheinlich nicht verwenden werden.<\/p>\n<p>EDM: Fehlererkennungsmethode. Mit diesen drei Bits k\u00f6nnen Sie die gew\u00fcnschte Fehlererkennungsmethode festlegen. Lesen Sie die SNAP-Dokumentation f\u00fcr weitere Einzelheiten. Im Beispiel wurde sie auf 1 0 0 = 16 Bit CRC gesetzt, wobei zwei Pr\u00fcfsummenbytes (CRC2, CRC1) am Ende des Pakets hinzugef\u00fcgt werden.<\/p>\n<p>NDB: vier Bits, um festzustellen, wie viele Datenbytes im Paket enthalten sind. <br \/>1 Byte, wie in unserem Beispiel (ein Datenbyte: DB1) wird durch 0 0 0 1 gesetzt<\/p>\n<h3>ACK \/ NAK<\/h3>\n<p>Wenn Sie das ACK im Header-Definitionsbyte 2 (HDB2) auf 00 setzen, erwartet der sendende Knoten kein ACK- oder NAK-Paket als Antwort.<\/p>\n<p>Wenn Sie ein ACK \/ NAK vom empfangenden Knoten senden, wie im Beispiel auf Seite 23, ist das Datenbyte mit der gleichen L\u00e4nge (1 Datenbyte) wie in der urspr\u00fcnglichen Anfrage des Absenders vorhanden und mit 0en gef\u00fcllt.<\/p>\n<p>Die Idee hinter ACK \/ NAK ist, dass der sendende Knoten nach einer Zeit\u00fcberschreitung entsprechende Ma\u00dfnahmen ergreifen kann.<\/p>\n<p>Das Datenbyte K\u00d6NNTE f\u00fcr weitere Informationen \u00fcber das Problem verwendet werden, wenn ein NAK gesendet wird; dies steht jedoch nicht in der SNAP-Spezifikation.<\/p>\n<h3>Dinge, an die Sie denken sollten<\/h3>\n<p>- Wie werden die Knoten ihre Adressen ermitteln? <\/p>\n<p>F\u00fcr den Master ist das einfach: Er erh\u00e4lt eine bestimmte Adresse. Die Slaves sollten Adressen in einer vorhersehbaren Weise erhalten, so dass sie wiederholbar sind. Idealerweise sind sie an bestimmte Hardware-Eigenschaften gebunden.<\/p>\n<p>- Paketstruktur<\/p>\n<p>Werden Sie immer die gleiche Anzahl von Datenbytes verwenden? Dies erm\u00f6glicht eine deterministischere Zeitplanung, eine einfachere Implementierung usw. <\/p>\n<p>- Fehlererkennung <\/p>\n<p>Welcher Fehlererkennungsalgorithmus sollte gew\u00e4hlt werden?<\/p>\n<p>Bitte beachten Sie, dass das SYNC-Byte nicht in die Pr\u00fcfsummenberechnung einbezogen wird.<\/p>\n<p>CRC ist in der Lage, Fehler zu erkennen und im Idealfall sogar zu korrigieren (bei einer geringeren Anzahl von Fehlern).<\/p>\n<p>Seite 14 der Protokollspezifikation gibt einen \u00dcberblick \u00fcber vorberechnete EDM-Pr\u00fcfwerte, mit denen Sie Ihre eigene Pr\u00fcfsummenimplementierung f\u00fcr die Zeichenketten \"SNAP\" und \"snap\" testen k\u00f6nnen.<\/p>\n<p>- Gesamtl\u00e4nge des Pakets<\/p>\n<p>HTH empfiehlt, die Pakete auf Medien wie Powerline, RF oder IR klein zu halten (&lt; 40 Byte), um die Leistung zu verbessern.<\/p>\n<p>- protokollspezifische Flaggen (PFB)<\/p>\n<p>Diese k\u00f6nnten in einer speziellen Implementierung Ihres Protokolls verwendet werden, so dass Sie einige Anwendungslogik darin unterbringen und die Daten als eigentliche Daten verwenden k\u00f6nnen. (z.B. k\u00f6nnten die PFB-Bits festlegen, welchen Befehl der Knoten ausf\u00fchren soll, und die Daten k\u00f6nnten die erforderliche Nutzlast f\u00fcr die einzelnen Befehle sein). oder Sie k\u00f6nnten Befehl + Daten vollst\u00e4ndig in die Daten verpacken und SNAP nur f\u00fcr den Transport, die Adressierung und die Sicherstellung, dass das Paket ohne Fehler ankommt, verwenden.<\/p>\n<h3>Python-Implementierung<\/h3>\n<p>Es ist eine Python-Implementierung von SNAP verf\u00fcgbar. Beachten Sie, dass diese f\u00fcr Python 2 ist.<\/p>\n<p>http:\/\/www.hth.com\/snap\/<\/p>\n<p>Hier finden Sie eine Dokumentation zu diesem Modul:<\/p>\n<p>http:\/\/diyhpl.us\/reprap\/trunk\/users\/stef\/pyRepRap\/docs\/reprap.snap.html<\/p>\n<p>http:\/\/diyhpl.us\/reprap\/trunk\/users\/stef\/pyRepRap\/reprap\/snap.py<\/p>\n<p>Hier ist ein Beispiel f\u00fcr eine Verwendungsdatei:<\/p>\n<p>http:\/\/diyhpl.us\/reprap\/trunk\/users\/stef\/pyRepRap\/examples\/demo.py<\/p>\n<p>Wahrscheinlich ist es bequemer, den Code hier herunterzuladen:<\/p>\n<p>https:\/\/github.com\/CarlosGS\/Cyclone-PCB-Factory\/tree\/master\/Software\/PythonScripts\/Replath\/pyRepRap<\/p>\n<p>Diese Python-Implementierung implementiert eine Teilmenge von SNAP f\u00fcr eine bestimmte Anwendung, aber sie ist ein guter Ausgangspunkt f\u00fcr Ihre eigene Implementierung.<\/p>\n<h3>Fehlersuchwerkzeuge &amp; Bibliothek<\/h3>\n<p>http:\/\/www.hth.com\/snap\/snaplab.html<\/p>\n<p>http:\/\/www.hth.com\/snap\/snaptest.html<\/p>\n<p>Dabei handelt es sich um eine generische Testanwendung, die in DELPHI geschrieben ist und den COM-Port zur Kommunikation nutzt. Snaplab kann den SNAP-Netzwerkverkehr ausspionieren und SNAP-Pakete mit Zufallsdaten erzeugen.<\/p>\n<p>Es gibt eine C-Bibliothek f\u00fcr das SNAP-Protokoll:<\/p>\n<p>http:\/\/www.hth.com\/snap\/libdl.html<\/p>\n<p>Es implementiert nicht den gesamten Funktionsumfang von SNAP.<\/p>\n<p>Hier ist eine C++-Implementierung:<\/p>\n<p>https:\/\/github.com\/alx\/reprap-arduino-firmware\/blob\/master\/library\/SNAP\/SNAP.cpp<\/p>","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung S.N.A.P. ist ein Protokoll f\u00fcr die Kommunikation zwischen mehreren verbundenen Hosts. Es bietet: - Adressierung - Flags - ack\/nak-Abfrage - Fehlererkennung (verschiedene Fehlererkennungsmethoden verf\u00fcgbar) Es kann \u00fcber verschiedene Medien, einschlie\u00dflich RS485, betrieben werden. Es ist f\u00fcr einen kleinen Footprint optimiert (begrenzte Rechen- und Speicherressourcen), aber je nach Bedarf skalierbar. Grunds\u00e4tzlich,...<\/p>","protected":false},"author":830,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[402],"tags":[588,572,586,587,585],"class_list":["post-9531","post","type-post","status-publish","format-standard","hentry","category-development","tag-protocol","tag-python","tag-rs485","tag-serial","tag-snap"],"_links":{"self":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/9531","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/users\/830"}],"replies":[{"embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/comments?post=9531"}],"version-history":[{"count":1,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/9531\/revisions"}],"predecessor-version":[{"id":9532,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/posts\/9531\/revisions\/9532"}],"wp:attachment":[{"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/media?parent=9531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/categories?post=9531"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pi3g.com\/de\/wp-json\/wp\/v2\/tags?post=9531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}