Introducción al protocolo SNAP

Introducción

S.N.A.P. es un protocolo de comunicación entre varios hosts conectados. Proporciona:

- dirección

- banderas

- solicitud de ack/nak

- detección de errores (existen diferentes métodos de detección de errores)

Puede funcionar a través de diferentes medios, incluido el RS485. Está optimizado para ocupar poco espacio (recursos informáticos y de memoria limitados), pero es escalable en función de sus necesidades.

Básicamente, si quieres conectar varios sistemas de cómputo y las aplicaciones que se ejecutan en ellos, por ejemplo una Raspberry Pi y varios microcontroladores Atmel a través de sus respectivas UARTs, usando RS485 como medio, quieres algo que envuelva tus datos, los entregue a los hosts correctos, reciba acuses de recibo de que los datos fueron recibidos correctamente, etc. Para eso está SNAP. Es en cierto modo una alternativa a, por ejemplo, el protocolo Modbus.

SNAP fue desarrollado por HTH, High Tech Horizon, una empresa sueca.

La página web del protocolo es: http://www.hth.com/snap/

Para poder comunicarse mediante el protocolo, debe obtener una identificación de proveedor, que puede solicitar a HTH de forma gratuita. Le piden que incluya un PDF del protocolo SNAP, o un enlace a su sitio web http://www.hth.com/snap/ con las aplicaciones/productos. El identificador del proveedor NO se incluye en los bytes del protocolo real que se mencionan en su solicitud. Por lo tanto, puede evaluar el protocolo primero, y luego utilizar la evaluación como implementación real, sin necesidad de realizar cambios.

Esta es la lista de identificadores de proveedores registrados actualmente:

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

Aquí hay un enlace directo a la hoja de datos:

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

Algunas propiedades básicas de SNAP

- protocolo binario

- conjunto de características escalables, en función de su aplicación

- funciona con comunicación sincrónica y asincrónica (= por ejemplo, UART)

- gratuito para uso comercial y privado. Requiere un identificador de proveedor gratuito para los identificadores comerciales

La comunicación entre los nodos se realiza en forma de paquetes. Analicemos un paquete de ejemplo, que utiliza algunas de las características de SNAP:

clip_image001

fuente: Documentación de SNAP, ejemplo de un paquete SNAP sencillo

preámbulo: El preámbulo es opcional, puede utilizar cualquier carácter siempre que no sea el byte de sincronización, SYNC.

- SYNC: byte único con la siguiente estructura: 01010100, indica el inicio del paquete

- HDB2, HDB1: Los bytes de definición de cabecera HDB2 y HDB1 definen la longitud del paquete y las características que se utilizarán.

- DAB1: Byte de dirección de destino

- SAB1: Byte de dirección de origen

- DB1: Byte de datos 1: la carga útil de su aplicación

- CRC2: byte alto de CRC-16

- CRC1: byte bajo de CRC-16

dirección 0 está reservada como dirección de emisión y no debe utilizarse para nada más. (DAB / SAB)

nota: los dispositivos que se acercan en medio de las comunicaciones podrían sincronizar en un 01010100 "regular" en la posición incorrecta (donde no estaba destinado como SYNC). Por lo tanto, se debe utilizar una suma de comprobación, para que el dispositivo pueda reconocer que los datos "no encajan", y debe continuar escuchando el siguiente paquete que comienza con el 01010100. (Esto es necesario para protegerse de los cambios de trama). Obviamente el dispositivo descartará todos los bytes antes de recibir el primer 01010100, ya que no recibió el paquete completo.

bytes de definición de cabecera

clip_image003

SNAP está construido de forma modular y extensible. Puede definir (DD) direcciones de destino con 0 - 3 bytes de longitud en el DAB, bytes de dirección de destino. Con una dirección de destino de 3 bytes (DD = 11) obtendrá hasta 16 777 215 nodos direccionables. Con una dirección de destino de 1 byte (DD = 01), utilizada en el ejemplo anterior, podrá direccionar 255 direcciones.

Lo mismo ocurre con la longitud de la dirección de origen (SS) en los bytes de dirección de origen (SAB). En el ejemplo SS = 01 para direcciones de 1 byte.

PFB: longitud de bytes específica del protocolo. 0 - 3 bytes, como en el caso anterior (PP). En el ejemplo PP = 00. Esta característica aún no está implementada en SNAP, y por lo tanto debe establecerse como 0, como en el ejemplo. Una implementación especializada de SNAP probablemente podría hacer algo con ellos (por ejemplo, contador de paquetes, etc.) - vea la documentación de SNAP para algunas ideas.

ACK: es un área importante de la definición de la cabecera. Indica si el nodo emisor solicita un paquete ACK / NAK a cambio, y también actúa como la respuesta ACK / NAK real del nodo receptor:

- 0 0 = Sin solicitud de acuse de recibo (Tx)

- 0 1 = Solicitud de acuse de recibo (Tx)

- 1 0 = Respuesta Ack (Rx)

- 1 1 = respuesta NAK (Rx)

CMD - bit de modo de comando. Póngalo a cero, es una característica avanzada de SNAP que probablemente no utilizará en su aplicación.

EDM: método de detección de errores. Estos tres bits le permiten definir el método de detección de errores que desea utilizar. Lea la documentación de SNAP para más detalles. En el ejemplo se ha configurado como 1 0 0 = CRC de 16 bits, añadiendo dos bytes de suma de comprobación (CRC2, CRC1) en la cola del paquete.

NDB: cuatro bits para determinar cuántos bytes de datos hay en el paquete.
1 byte, como en nuestro ejemplo (un databyte: DB1) se establece por 0 0 0 1

ACK / NAK

Si se establece el ACK en 00 en el byte de definición de cabecera 2 (HDB2), el nodo transmisor no esperará ningún paquete ACK o NAK a cambio.

Si se envía un ACK / NAK desde el nodo receptor, en el ejemplo de la página 23, el byte de datos está presente con la misma longitud (1 byte de datos) que en la petición original del emisor, y rellenado con 0es.

La idea detrás de ACK / NAK es que el nodo emisor puede, después de un tiempo de espera, tomar la acción apropiada.

El byte de datos PODRÍA utilizarse para obtener más información sobre el problema si se envía un NAK, esto está fuera de la especificación SNAP.

Cosas en las que debe pensar

- ¿cómo determinarán los nodos sus direcciones?

Para el maestro esto es fácil: recibirá una dirección definida. Los esclavos deben recibir las direcciones de forma predecible, para que sea repetible. Lo ideal es que estén vinculadas a algunas características del hardware.

- estructura de paquetes

¿Utilizará siempre la misma cantidad de bytes de datos? Esto permitirá una sincronización más determinista, y una implementación más fácil, etc.

- detección de errores

¿Qué algoritmo de detección de errores debe elegirse?

Tenga en cuenta que el byte SYNC no se incluye en el cálculo del checksoum.

El CRC es capaz de reconocer los errores, e incluso, en el mejor de los casos, de corregirlos (para una menor cantidad de errores).

La página 14 de la especificación del protocolo ofrece un resumen de los valores de comprobación precalculados de EDM para probar su propia implementación de la suma de comprobación para las cadenas "SNAP" y "snap".

- longitud total del paquete

HTH recomienda mantener los paquetes pequeños (< 40 bytes) en medios como la línea eléctrica, RF o IR para mejorar el rendimiento.

- banderas específicas del protocolo (PFB)

Estos podrían ser usados en una implementación especializada de su protocolo, permitiéndole desplazar alguna lógica de aplicación dentro de esto, y usar los datos como datos reales. (por ejemplo, los bits PFB podrían establecer qué comando quieres que ejecute el nodo, y los datos podrían ser la carga útil requerida para los comandos individuales). o podrías empaquetar comando + datos completamente en los datos, y sólo usar SNAP para el transporte, el direccionamiento y asegurar que el paquete llegue sin errores.

Implementación de Python

Hay una implementación en Python de SNAP disponible. Tenga en cuenta que es para Python 2.

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

Aquí hay una documentación para este módulo:

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

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

Aquí hay un ejemplo de archivo de uso:

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

Probablemente sea más conveniente descargar el código aquí:

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

Esta implementación de Python implementa un subconjunto de SNAP para una determinada aplicación, pero es un buen punto de partida para su propia implementación.

Herramientas de depuración y biblioteca

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

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

Se trata de una aplicación de prueba genérica que está escrita en DELPHI y utiliza el puerto COM para comunicarse. Snaplab puede espiar el tráfico de red SNAP, y generar paquetes SNAP con datos aleatorios.

Existe una biblioteca en C para el protocolo SNAP:

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

No implementa el conjunto completo de características de SNAP.

Aquí hay una implementación en C++:

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