Introdução ao protocolo SNAP

Introdução

S.N.A.P. é um protocolo de comunicação entre vários hosts conectados. Ele fornece:

- endereçamento

- bandeiras

- pedido deck/nak

- detecção de erros (diferentes métodos de detecção de erros disponíveis)

Pode ser executado em diferentes mídias, incluindo RS485. É otimizado para uma pequena área de trabalho (computação limitada, recursos de memória), mas escalável, dependendo das suas necessidades.

Basicamente, se você quiser conectar vários sistemas de computação e as aplicações rodando neles, por exemplo um Raspberry Pi e vários microcontroladores Atmel sobre suas respectivas UARTs, usando RS485 como mídia, você quer algo para embrulhar seus dados, entregá-los aos hosts corretos, receber reconhecimentos de que os dados foram recebidos corretamente, etc. É para isto que serve o SNAP. É de certa forma uma alternativa, por exemplo, ao protocolo Modbus.

O SNAP foi desenvolvido pela HTH, High Tech Horizon, uma empresa da SWEDEN.

A página inicial do protocolo é: http://www.hth.com/snap/

Para comunicar usando o protocolo, você deve obter uma identificação de fornecedor, para a qual você pode aplicar com HTH gratuitamente. Eles pedem que você inclua um PDF do protocolo SNAP, ou um link para seu web-site http://www.hth.com/snap/ com os aplicativos/produtos. O vendor id NÃO está incluído nos bytes de protocolo reais falados na sua aplicação. Portanto, você pode avaliar primeiro o protocolo e, em seguida, usar a avaliação como implementação real, sem necessidade de alterações.

Aqui está a lista de identificações de fornecedores atualmente registrados:

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

Aqui está um link diretamente para a folha de dados:

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

Algumas propriedades básicas do SNAP

- protocolo binário

- conjunto de recursos escaláveis, dependendo da sua aplicação

- funciona com comunicação síncrona e assíncrona (= por exemplo, UART)

- grátis para uso comercial e privado. Requer identificação gratuita do fornecedor para identificação comercial.

A comunicação entre os nós é feita sob a forma de pacotes. Vamos discutir um pacote de exemplo, que usa algumas das características do SNAP:

clip_image001

fonte: Documentação SNAP, exemplo de um simples pacote SNAP

preâmbulo: O preâmbulo é opcional, pode usar quaisquer caracteres desde que não sejam o byte de sincronização, SYNC.

- SYNC: byte único com a seguinte estrutura: 01010100, indica o início do pacote

- HDB2, HDB1: Os bytes de definição de cabeçalho HDB2 e HDB1 definem quanto tempo será o pacote e quais funcionalidades serão utilizadas.

- DAB1: Byte de Endereço de Destino

- SAB1: Endereço de origem Byte

- DB1: Byte de Dados 1 - a carga útil para a sua aplicação

- CRC2: byte alto de CRC-16

- CRC1: byte baixo de CRC-16

endereço 0 é reservado como endereço de transmissão e não deve ser usado para mais nada. (DAB / SAB)

Nota: os dispositivos que surgem no meio das comunicações podem sincronizar-se em um "regular" 01010100 na posição errada (onde não se pretendia dizer como SYNC). Portanto, deve ser usado um checksum, para que o dispositivo possa reconhecer que os dados "não cabem", e ele deve continuar ouvindo para o próximo pacote, começando com o 01010100. (Isto é necessário para proteger contra mudanças de quadros). Obviamente o dispositivo irá descartar todos os bytes antes de receber o primeiro 01010100, já que não recebeu o pacote completo.

bytes de definição do cabeçalho

clip_image003

O SNAP é construído de uma forma modular e extensível. Você pode definir (DD) endereços de destino com comprimento de 0 - 3 bytes no DAB, bytes de endereço de destino. Com um endereço de destino de 3 bytes (DD = 11), você receberá até 16 777 215 nós endereçáveis. Com um endereço de destino de 1 byte (DD = 01), usado no exemplo acima, você poderá endereçar 255 endereços.

O mesmo é válido para o comprimento de endereço de origem (SS) nos bytes de endereço de origem (SAB). No exemplo SS = 01 para endereços de 1 byte.

PFB: comprimento do byte específico do protocolo. 0 - 3 bytes, como acima (PP). No exemplo PP = 00. Esta característica ainda não está implementada no SNAP, e portanto deve ser definida como 0, como no exemplo. Uma implementação especializada do SNAP provavelmente poderia fazer algo com eles (por exemplo, contador de pacotes, etc) - veja a documentação do SNAP para algumas idéias.

ACK: esta é uma área importante da definição do cabeçalho. Ela indica se o nó remetente solicita um pacote ACK / NAK em troca, e também atua como a resposta real ACK / NAK do nó receptor:

- 0 0 = Sem pedido de Ack (Tx)

- 0 1 = Pedido de Ack (Tx)

- 1 0 = Resposta de Ack (Rx)

- 1 1 = Resposta do NAK (Rx)

CMD - bit do modo de comando. Defina este para zero, é um recurso avançado do SNAP que você provavelmente não irá usar em sua aplicação.

EDM: método de detecção de erros. Estes três bits permitem definir o método de detecção de erros que você gostaria de usar. Leia a documentação SNAP para obter detalhes. No exemplo ele foi definido como 1 0 0 = CRC de 16 bits, adicionando dois bytes de checksum (CRC2, CRC1) na cauda do pacote.

NDB: quatro bits para determinar quantos bytes de dados existem no pacote.
1 byte, como no nosso exemplo (uma base de dados: DB1) é definido por 0 0 0 1

ACK / NAK

Se você configurar o ACK para 00 no byte de definição de cabeçalho 2 (HDB2), o nó transmissor não esperará nenhum pacote ACK ou NAK em troca.

Se você enviar um ACK / NAK do nó receptor, no exemplo da página 23, o byte de dados está presente com o mesmo comprimento (1 byte de dados) que no pedido original do remetente, e preenchido com 0es.

A idéia por trás do ACK / NAK é que o nó de envio pode, após um tempo fora, tomar as medidas apropriadas.

O byte de dados COULD deve ser utilizado para mais informações sobre o problema se for enviado um NAK, isto está fora da especificação SNAP.

Coisas em que você deve pensar

- como é que os nós vão determinar os seus endereços?

para o mestre isto é fácil: ele receberá um endereço definido. Os escravos devem receber endereços de uma forma previsível, para que seja repetível. Idealmente ligado a algumas características de hardware.

- estrutura da embalagem

Você usará sempre a mesma quantidade de bytes de dados? Isto permitirá um timing mais determinístico, e uma implementação mais fácil, etc.

- detecção de erros

Que algoritmo de detecção de erros deve ser escolhido?

Por favor note que o byte SYNC não está incluído no cálculo do checksoum.

O CRC é capaz de reconhecer erros, e idealmente até corrigi-los (para uma menor quantidade de erros).

A página 14 da especificação do protocolo dá uma visão geral dos valores de verificação EDM pré-calculados para testar sua própria implementação do checksum para as cordas "SNAP" e "snap".

- comprimento total do pacote

HTH recomenda manter os pacotes pequenos (< 40 bytes) em mídias como linha de energia, RF ou IR para um melhor desempenho.

- bandeiras de protocolo específico (PFB)

Estes poderiam ser utilizados numa implementação especializada do seu protocolo, permitindo-lhe mudar alguma lógica de aplicação dentro deste, e utilizar os dados como dados reais. (por exemplo, os bits PFB poderiam definir qual comando você quer que o nó execute, e os dados poderiam ser a carga útil necessária para os comandos individuais). ou você poderia empacotar o comando + dados completamente nos dados, e apenas usar o SNAP para transporte, endereçando & assegurando que o pacote chegue sem erros.

implementação do Python

Há uma implementação Python do SNAP disponível. Note que isto é para o Python 2.

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

Aqui está uma documentação 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

Aqui está um exemplo de ficheiro de utilização:

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

Provavelmente é mais conveniente fazer o download do código aqui:

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

Esta implementação Python implementa um subconjunto de SNAP para uma determinada aplicação, mas é um bom ponto de partida para a sua própria implementação.

Ferramentas de depuração & Biblioteca

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

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

Estes são um aplicativo de teste genérico que é escrito em DELPHI e usa a porta COM para comunicar. O Snaplab pode espionar o tráfego da rede SNAP, e gerar pacotes SNAP com dados aleatórios.

Existe uma biblioteca C para o protocolo SNAP:

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

Ele não implementa o conjunto completo de recursos do SNAP.

Aqui está uma implementação em C++:

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