Inleiding tot het SNAP-protocol
Inleiding
S.N.A.P. is een protocol voor communicatie tussen verschillende verbonden hosts. Het voorziet in:
- adressering
- vlaggen
- ack/nak verzoek
- foutdetectie (verschillende foutdetectiemethoden beschikbaar)
Het kan worden gebruikt via verschillende media, waaronder RS485. Het is geoptimaliseerd voor een kleine voetafdruk (beperkte computer- en geheugencapaciteit), maar is schaalbaar afhankelijk van uw behoeften.
In principe, als je verschillende computersystemen en de toepassingen die erop draaien wilt verbinden, bijvoorbeeld een Raspberry Pi en verschillende Atmel microcontrollers via hun respectievelijke UARTs, met RS485 als media, dan wil je iets om je data te verpakken, het af te leveren bij de juiste hosts, bevestigingen te ontvangen dat de data correct is ontvangen, enz. Dit is waar SNAP voor is. Het is in zekere zin een alternatief voor, bijvoorbeeld, het Modbus protocol.
SNAP is ontwikkeld door HTH, High Tech Horizon, een bedrijf uit ZWEDEN.
De homepage van het protocol is: http://www.hth.com/snap/
Om via het protocol te kunnen communiceren moet je een vendor id krijgen, die je gratis bij HTH kunt aanvragen. Zij vragen u wel om een PDF van het SNAP protocol, of een link naar hun web-site http://www.hth.com/snap/ mee te sturen met de applicaties/producten. De vendor id is NIET opgenomen in de eigenlijke protocol bytes die in uw aanvraag worden gesproken. U kunt dus eerst het protocol evalueren, en dan de evaluatie gebruiken als eigenlijke implementatie, zonder dat u wijzigingen hoeft aan te brengen.
Hier is de lijst van de momenteel geregistreerde verkopers-id's:
http://www.hth.com/snap/vidlist.html
Hier is een link rechtstreeks naar het gegevensblad:
http://www.hth.com/filelibrary/pdffiles/snap.pdf
Enkele basiseigenschappen van SNAP
- binair protocol
- schaalbare functieset, afhankelijk van uw toepassing
- werkt met synchrone en asynchrone communicatie (= b.v. UART)
- gratis voor commercieel en privé-gebruik. Vereist gratis vendor id voor commerciële id's
De communicatie tussen de knooppunten vindt plaats in de vorm van pakketten. Laten we een voorbeeldpakket bespreken, dat gebruik maakt van enkele mogelijkheden van SNAP:
bron: SNAP documentatie, voorbeeld van een eenvoudig SNAP pakket
preambule: De preambule is facultatief, het kan om het even welke karakters gebruiken zolang zij niet de synchronisatiebyte, SYNC, zijn.
- SYNC: unieke byte met de volgende structuur: 01010100, geeft het begin van het pakket aan
- HDB2, HDB1: De header-definitiebytes HDB2 en HDB1 bepalen hoe lang het pakket zal zijn, en welke functies zullen worden gebruikt.
- DAB1: Destination Address Byte
- SAB1: Bron Adres Byte
- DB1: Data Byte 1 - de payload voor uw toepassing
- CRC2: hoge byte van CRC-16
- CRC1: lage byte van CRC-16
adres 0 is gereserveerd als omroepadres en mag voor niets anders worden gebruikt. (DAB / SAB)
Opmerking: apparaten die midden in de communicatie opkomen, kunnen synchroniseren op een "gewone" 01010100 op de verkeerde positie (waar het niet bedoeld was als SYNC). Daarom moet een controlesom worden gebruikt, zodat het apparaat kan herkennen dat de gegevens "niet passen", en het moet blijven luisteren naar het volgende pakket dat begint met de 01010100. (Dit is nodig om te beschermen tegen frame shifts). Uiteraard zal het apparaat alle bytes weggooien voordat het de eerste 01010100 ontvangt, omdat het niet het volledige pakket heeft gekregen.
header definitie bytes
SNAP is modulair opgebouwd en uitbreidbaar. U kunt bestemmingsadressen (DD) definiëren met een lengte van 0 - 3 bytes in de DAB, bestemmingsadresbytes. Met een bestemmingsadres van 3 bytes (DD = 11) krijgt u tot 16 777 215 adresseerbare knooppunten. Met een bestemmingsadres van 1 byte (DD = 01), gebruikt in het bovenstaande voorbeeld, kun je 255 adressen adresseren.
Hetzelfde geldt voor de lengte van het bronadres (SS) in de bronadresbytes (SAB). In het voorbeeld SS = 01 voor adressen van 1 byte.
PFB: protocol specifieke byte lengte. 0 - 3 bytes, zoals hierboven (PP). In het voorbeeld PP = 00. Deze functie is nog niet geïmplementeerd in SNAP, en moet daarom op 0 worden gezet, zoals in het voorbeeld. Een gespecialiseerde implementatie van SNAP zou er waarschijnlijk iets mee kunnen doen (b.v. packet counter, etc) - zie SNAP documentatie voor enkele ideeën.
ACK: dit is een belangrijk gebied van de header definitie. Het geeft aan of het zendende knooppunt een ACK / NAK pakket als antwoord vraagt, en fungeert ook als het eigenlijke ACK / NAK antwoord van het ontvangende knooppunt:
- 0 0 = geen Ack-aanvraag (Tx)
- 0 1 = Ack verzoek (Tx)
- 1 0 = Ack antwoord (Rx)
- 1 1 = NAK antwoord (Rx)
CMD - commandomodus bit. Zet dit op nul, het is een geavanceerde functie van SNAP die u hoogstwaarschijnlijk niet zult gebruiken in uw toepassing.
EDM: methode voor foutdetectie. Met deze drie bits kunt u de foutdetectiemethode definiëren die u wilt gebruiken. Lees de SNAP documentatie voor details. In het voorbeeld is het ingesteld als 1 0 0 = 16 bit CRC, waarbij twee checksum bytes (CRC2, CRC1) worden toegevoegd aan de staart van het pakket.
NDB: vier bits om te bepalen hoeveel gegevensbytes er in het pakket zitten.
1 byte, zoals in ons voorbeeld (één databyte: DB1) wordt ingesteld door 0 0 0 1
ACK / NAK
Als u de ACK op 00 zet in de Header definition byte 2 (HDB2), zal het zendende knooppunt geen ACK of NAK pakket terug verwachten.
Als het ontvangende knooppunt wel een ACK / NAK stuurt, in het voorbeeld op pagina 23, is de databyte aanwezig met dezelfde lengte (1 databyte) als in het oorspronkelijke verzoek van de verzender, en gevuld met 0-en.
Het idee achter ACK / NAK is dat het zendende knooppunt, na een time out, passende actie kan ondernemen.
De databyte KAN gebruikt worden voor verdere informatie over het probleem indien een NAK wordt verzonden, dit valt buiten de SNAP-specificatie.
Dingen waar je aan moet denken
- hoe zullen de knooppunten hun adressen bepalen?
voor de master is dit eenvoudig: hij krijgt een gedefinieerd adres. De slaves moeten adressen krijgen op een voorspelbare manier, zodat het herhaalbaar is. Idealiter gebonden aan enkele hardware kenmerken.
- pakketstructuur
Gebruikt u altijd dezelfde hoeveelheid databytes? Dit zal een meer deterministische timing mogelijk maken, en een gemakkelijkere implementatie, enz.
- foutenopsporing
Welk foutopsporingsalgoritme moet worden gekozen?
Merk op dat de SYNC-byte niet wordt meegenomen in de checksoum-berekening.
CRC is in staat fouten te herkennen, en idealiter zelfs te corrigeren (voor een lager aantal fouten).
pagina 14 van de protocol specificatie geeft een overzicht van vooraf berekende EDM checkvalues om uw eigen checksum implementatie te testen voor de strings "SNAP" en "snap".
- totale pakketlengte
HTH raadt aan om pakketten klein te houden (< 40 bytes) op media zoals power line, RF of IR voor betere prestaties.
- protocol specifieke vlaggen (PFB)
Deze zouden kunnen worden gebruikt in een gespecialiseerde implementatie van uw protocol, waardoor u sommige toepassingslogica hierin kunt schuiven, en de gegevens als werkelijke gegevens kunt gebruiken. (bv. de PFB bits zouden kunnen instellen welk commando het knooppunt moet uitvoeren, en de data zouden de vereiste payload voor de individuele commando's kunnen zijn). of u zou commando + data volledig in de data kunnen verpakken, en enkel SNAP gebruiken voor transport, adressering en ervoor zorgen dat het pakket zonder fouten aankomt.
Python uitvoering
Er is een Python implementatie van SNAP beschikbaar. Merk op dat deze voor Python 2 is.
http://www.hth.com/snap/
Hier is een documentatie voor deze module:
http://diyhpl.us/reprap/trunk/users/stef/pyRepRap/docs/reprap.snap.html
http://diyhpl.us/reprap/trunk/users/stef/pyRepRap/reprap/snap.py
Hier is een voorbeeld van een gebruiksbestand:
http://diyhpl.us/reprap/trunk/users/stef/pyRepRap/examples/demo.py
Waarschijnlijk is het handiger om de code hier te downloaden:
https://github.com/CarlosGS/Cyclone-PCB-Factory/tree/master/Software/PythonScripts/Replath/pyRepRap
Deze Python-implementatie implementeert een deelverzameling van SNAP voor een bepaalde toepassing, maar het is een goed uitgangspunt voor uw eigen implementatie.
Debug-gereedschappen en -bibliotheek
http://www.hth.com/snap/snaplab.html
http://www.hth.com/snap/snaptest.html
Dit is een generieke test applicatie die geschreven is in DELPHI en de COM poort gebruikt om te communiceren. Snaplab kan het SNAP netwerkverkeer bespioneren, en SNAP pakketten genereren met willekeurige data.
Er is een C bibliotheek voor het SNAP protocol:
http://www.hth.com/snap/libdl.html
Het implementeert niet de volledige kenmerkenreeks van SNAP.
Hier is een C++ implementatie:
https://github.com/alx/reprap-arduino-firmware/blob/master/library/SNAP/SNAP.cpp