Einführung in das SNAP-Protokoll

Einführung

S.N.A.P. ist ein Protokoll für die Kommunikation zwischen mehreren verbundenen Hosts. Es bietet:

- adressierend

- Flaggen

- ack/nak-Anfrage

- Fehlererkennung (verschiedene Fehlererkennungsmethoden verfügbar)

Es kann über verschiedene Medien, einschließlich RS485, betrieben werden. Es ist für einen geringen Platzbedarf optimiert (begrenzte Rechen- und Speicherressourcen), aber je nach Bedarf skalierbar.

Wenn Sie mehrere Computersysteme und die darauf laufenden Anwendungen miteinander verbinden wollen, z. B. einen Raspberry Pi und mehrere Atmel-Mikrocontroller über ihre jeweiligen UARTs und unter Verwendung von RS485 als Medium, brauchen Sie etwas, das Ihre Daten verpackt, sie an die richtigen Hosts weiterleitet, Bestätigungen für den korrekten Empfang der Daten erhält usw. Dafür gibt es SNAP. Es ist in gewisser Weise eine Alternative zu z. B. dem Modbus-Protokoll.

SNAP wurde von HTH, High Tech Horizon, einem schwedischen Unternehmen, entwickelt.

Die Homepage des Protokolls lautet: http://www.hth.com/snap/

Um über das Protokoll kommunizieren zu können, sollten Sie eine Anbieterkennung erhalten, die Sie bei HTH kostenlos beantragen können. 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 übermitteln. Die Anbieterkennung ist NICHT in den eigentlichen Protokollbytes enthalten, die Sie in Ihrer Bewerbung angeben. Sie können daher das Protokoll zunächst evaluieren und dann die Evaluierung als tatsächliche Implementierung verwenden, ohne dass Änderungen erforderlich sind.

Hier finden Sie die Liste der derzeit registrierten Anbieterkennungen:

http://www.hth.com/snap/vidlist.html

Hier ist ein Link direkt zum Datenblatt:

http://www.hth.com/filelibrary/pdffiles/snap.pdf

Einige grundlegende Eigenschaften von SNAP

- Binärprotokoll

- Skalierbarer Funktionsumfang, abhängig von Ihrer Anwendung

- arbeitet mit synchroner und asynchroner Kommunikation (= z.B. UART)

- kostenlos für kommerzielle und private Nutzung. Erfordert kostenlose Vendor-ID für kommerzielle Id's

Die Kommunikation zwischen den Knoten erfolgt in Form von Paketen. Lassen Sie uns ein Beispielpaket besprechen, das einige der Funktionen von SNAP nutzt:

clip_image001

Quelle: SNAP-Dokumentation, Beispiel für ein einfaches SNAP-Paket

Präambel: Die Präambel ist optional, sie kann beliebige Zeichen enthalten, solange es sich nicht um das Synchronisationsbyte SYNC handelt.

- SYNC: eindeutiges Byte mit folgendem Aufbau: 01010100, zeigt den Beginn des Pakets an

- HDB2, HDB1: Die Header-Definitionsbytes HDB2 und HDB1 legen fest, wie lang das Paket sein wird und welche Merkmale verwendet werden.

- DAB1: Zieladressbyte

- SAB1: Quelladressbyte

- DB1: Datenbyte 1 - die Nutzlast für Ihre Anwendung

- CRC2: hohes Byte von CRC-16

- CRC1: niederwertiges Byte von CRC-16

Adresse 0 ist als Rundfunkadresse reserviert und sollte nicht für etwas anderes verwendet werden. (DAB / SAB)

Hinweis: Geräte, die mitten in der Kommunikation auftauchen, könnten sich auf eine "normale" 01010100 an der falschen Stelle synchronisieren (wo sie nicht als SYNC gedacht war). Daher sollte eine Prüfsumme verwendet werden, damit das Gerät erkennen kann, dass die Daten "nicht passen", und es sollte weiter auf das nächste Paket warten, das mit der 01010100 beginnt. (Dies ist zum Schutz vor Frame-Verschiebungen notwendig). Natürlich verwirft das Gerät alle Bytes, bevor es die erste 01010100 erhält, da es nicht das gesamte Paket erhalten hat.

Header-Definitions-Bytes

clip_image003

SNAP ist modular und erweiterbar aufgebaut. Sie können Zieladressen (DD) mit einer Länge 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önnen Sie 255 Adressen adressieren.

Das Gleiche gilt für die Länge der Quelladresse (SS) in den Quelladressbytes (SAB). Im Beispiel ist SS = 01 für 1-Byte-Adressen.

PFB: Protokollspezifische Bytelänge. 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önnte wahrscheinlich etwas damit anfangen (z.B. Paketzähler, etc.) - siehe SNAP-Dokumentation für einige Ideen.

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:

- 0 0 = Keine Ack-Anforderung (Tx)

- 0 1 = Ack-Anforderung (Tx)

- 1 0 = Ack-Antwort (Rx)

- 1 1 = NAK-Antwort (Rx)

CMD - Befehlsmodus-Bit. Setzen Sie dieses Bit auf Null. Es handelt sich um eine erweiterte Funktion von SNAP, die Sie in Ihrer Anwendung höchstwahrscheinlich nicht verwenden werden.

EDM: Fehlererkennungsmethode. Mit diesen drei Bits können Sie die gewünschte Fehlererkennungsmethode festlegen. Lesen Sie die SNAP-Dokumentation für weitere Einzelheiten. Im Beispiel wurde sie auf 1 0 0 = 16 Bit CRC gesetzt, wobei zwei Prüfsummenbytes (CRC2, CRC1) am Ende des Pakets hinzugefügt werden.

NDB: vier Bits, um festzustellen, wie viele Datenbytes im Paket enthalten sind.
1 Byte, wie in unserem Beispiel (ein Datenbyte: DB1) wird durch 0 0 0 1 gesetzt

ACK / NAK

Wenn Sie das ACK im Header-Definitionsbyte 2 (HDB2) auf 00 setzen, erwartet der sendende Knoten kein ACK- oder NAK-Paket als Antwort.

Wenn Sie ein ACK / NAK vom empfangenden Knoten senden, wie im Beispiel auf Seite 23, ist das Datenbyte mit der gleichen Länge (1 Datenbyte) wie in der ursprünglichen Anfrage des Absenders vorhanden und mit 0en gefüllt.

Die Idee hinter ACK / NAK ist, dass der sendende Knoten nach einer Zeitüberschreitung entsprechende Maßnahmen ergreifen kann.

Das Datenbyte KÖNNTE für weitere Informationen über das Problem verwendet werden, wenn ein NAK gesendet wird; dies steht jedoch nicht in der SNAP-Spezifikation.

Dinge, an die Sie denken sollten

- Wie werden die Knoten ihre Adressen ermitteln?

Für den Master ist das einfach: Er erhält 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.

- Paketstruktur

Werden Sie immer die gleiche Anzahl von Datenbytes verwenden? Dies ermöglicht eine deterministischere Zeitplanung, eine einfachere Implementierung usw.

- Fehlererkennung

Welcher Fehlererkennungsalgorithmus sollte gewählt werden?

Bitte beachten Sie, dass das SYNC-Byte nicht in die Prüfsummenberechnung einbezogen wird.

CRC ist in der Lage, Fehler zu erkennen und im Idealfall sogar zu korrigieren (bei einer geringeren Anzahl von Fehlern).

Seite 14 der Protokollspezifikation gibt einen Überblick über vorberechnete EDM-Prüfwerte, mit denen Sie Ihre eigene Prüfsummenimplementierung für die Zeichenketten "SNAP" und "snap" testen können.

- Gesamtlänge des Pakets

HTH empfiehlt, die Pakete auf Medien wie Powerline, RF oder IR klein zu halten (< 40 Byte), um die Leistung zu verbessern.

- protokollspezifische Flaggen (PFB)

Diese könnten in einer speziellen Implementierung Ihres Protokolls verwendet werden, so dass Sie einige Anwendungslogik darin unterbringen und die Daten als eigentliche Daten verwenden können. (z.B. könnten die PFB-Bits festlegen, welchen Befehl der Knoten ausführen soll, und die Daten könnten die erforderliche Nutzlast für die einzelnen Befehle sein). oder Sie könnten Befehl + Daten vollständig in die Daten verpacken und SNAP nur für den Transport, die Adressierung und die Sicherstellung, dass das Paket ohne Fehler ankommt, verwenden.

Python-Implementierung

Es ist eine Python-Implementierung von SNAP verfügbar. Beachten Sie, dass diese für Python 2 ist.

http://www.hth.com/snap/

Hier finden Sie eine Dokumentation zu diesem Modul:

http://diyhpl.us/reprap/trunk/users/stef/pyRepRap/docs/reprap.snap.html

http://diyhpl.us/reprap/trunk/users/stef/pyRepRap/reprap/snap.py

Hier ist ein Beispiel für eine Verwendungsdatei:

http://diyhpl.us/reprap/trunk/users/stef/pyRepRap/examples/demo.py

Wahrscheinlich ist es bequemer, den Code hier herunterzuladen:

https://github.com/CarlosGS/Cyclone-PCB-Factory/tree/master/Software/PythonScripts/Replath/pyRepRap

Diese Python-Implementierung implementiert eine Teilmenge von SNAP für eine bestimmte Anwendung, aber sie ist ein guter Ausgangspunkt für Ihre eigene Implementierung.

Fehlersuchwerkzeuge & Bibliothek

http://www.hth.com/snap/snaplab.html

http://www.hth.com/snap/snaptest.html

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.

Es gibt eine C-Bibliothek für das SNAP-Protokoll:

http://www.hth.com/snap/libdl.html

Es implementiert nicht den gesamten Funktionsumfang von SNAP.

Hier ist eine C++-Implementierung:

https://github.com/alx/reprap-arduino-firmware/blob/master/library/SNAP/SNAP.cpp