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:
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
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