SNAP协议介绍

简介

S.N.A.P.是一个在几个连接的主机之间进行通信的协议。它提供。

- 处理

- 旗帜

- ack/nak请求

- 错误检测(有不同的错误检测方法)。

它可以通过不同的媒介运行,包括RS485。它被优化为小尺寸(有限的计算、内存资源),但可根据你的需要进行扩展。

基本上,如果你想连接几个计算系统和运行在它们上面的应用程序,例如Raspberry Pi和几个Atmel微控制器通过它们各自的UART,使用RS485作为媒介,你需要一些东西来包装你的数据,把它送到正确的主机,接收数据被正确接收的确认,等等。这就是SNAP的作用。在某些方面,它是Modbus协议的替代品。

SNAP是由瑞典的HTH(High Tech Horizon)公司开发的。

该协议的主页是:http://www.hth.com/snap/

为了使用该协议进行通信,你应该得到一个供应商ID,你可以免费向HTH申请。他们确实要求你包括SNAP协议的PDF文件,或者与应用程序/产品一起提供他们网站的链接http://www.hth.com/snap/。供应商ID不包括在你的申请中所说的实际协议字节中。因此,你可以先评估该协议,然后将评估结果作为实际执行,不需要做任何改动。

以下是目前注册的供应商ID列表。

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

这里有一个直接指向数据表的链接。

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

SNAP的一些基本属性

- 二进制协议

- 可扩展的功能集,取决于你的应用

- 适用于同步和异步通信(=如UART)。

- 免费供商业和私人使用。商业ID需要免费的供应商ID

节点之间的通信是以数据包的形式进行的。让我们来讨论一个样本数据包,它使用了SNAP的一些功能。

clip_image001

源。SNAP文档,一个简单的SNAP数据包的例子

序言。序言是可选的,它可以使用任何字符,只要它们不是同步字节SYNC。

- SYNC:唯一的字节,结构如下。01010100,表示数据包的开始

- HDB2、HDB1。头部定义字节HDB2和HDB1定义了数据包的长度,以及将使用哪些功能。

- DAB1:目的地地址字节

- SAB1:源地址字节

- DB1。数据字节1 - 你的应用程序的有效载荷

- CRC2:CRC-16的高字节

- CRC1:CRC-16的低字节

地址 0 是作为广播地址保留的,不应该用于其他用途。(DAB / SAB)

注意:在通信过程中出现的设备可能会在错误的位置上同步于 "常规 "的01010100(它并不打算作为SYNC)。因此,应该使用校验和,这样设备就能识别出数据 "不合适",它应该继续监听从01010100开始的下一个数据包。(这是为了防止帧转移所必需的)。显然,设备会在收到第一个01010100之前丢弃所有字节,因为它没有得到完整的数据包。

头部定义字节

clip_image003

SNAP是以一种模块化和可扩展的方式建立的。你可以在DAB中定义(DD)目的地址,长度为0-3字节,目的地址字节。用一个3字节的目标地址(DD = 11),你将得到多达16个777 215可寻址的节点。用一个1字节的目标地址(DD = 01),在上面的例子中使用,你将能够寻址255个地址。

源地址字节(SAB)中的源地址长度(SS)也是如此。在例子中,SS=01为1字节的地址。

PFB:协议特定的字节长度。0-3个字节,同上(PP)。在例子中PP=00。这个功能还没有在SNAP中实现,因此它应该被设置为0,就像例子中一样。一个专门的SNAP实现可能会对它们做一些处理(例如数据包计数器等)--见SNAP文档中的一些想法。

ACK:这是头定义的一个重要区域。它表明发送节点是否要求回报一个ACK/NAK包,也作为接收节点的实际ACK/NAK响应。

- 0 0 = 没有Ack请求(Tx)。

- 0 1 = Ack请求(Tx)

- 1 0 = Ack响应(Rx)。

- 1 1 = NAK响应(Rx)。

CMD - 命令模式位。将此设置为零,这是SNAP的一个高级功能,你很可能不会在你的应用程序中使用。

EDM:错误检测方法。这三个位允许你定义你想使用的错误检测方法。详细情况请阅读SNAP文档。在这个例子中,它被设置为1 0 0 = 16位CRC,在数据包的尾部增加两个校验字节(CRC2,CRC1)。

NDB:四个比特,用于确定数据包中有多少个数据字节。
1个字节,如我们的例子(一个数据字节:DB1)是由0 0 0 1设置的。

ACK / NAK

如果你在头定义字节2(HDB2)中把ACK设置为00,那么发送节点将不期待任何ACK或NAK数据包的返回。

如果你确实从接收节点发送了ACK / NAK,在第23页的例子中,数据字节的长度与发送者的原始请求中的长度相同(1个数据字节),并填充了0es。

ACK/NAK背后的想法是,发送节点可以在超时后,采取适当的行动。

如果发送了NAK,数据字节可用于有关问题的进一步信息,这超出了SNAP的规范。

你应该考虑的事情

- 节点将如何确定它们的地址?

对于主站来说,这很容易:它将收到一个确定的地址。从机应该以一种可预测的方式获得地址,这样就可以重复。最理想的是与一些硬件特性绑定。

- 数据包结构

你会一直使用相同数量的数据字节吗?这将使时间更加确定,而且更容易实现,等等。

- 错误检测

应该选择哪种错误检测算法?

请注意,SYNC字节不包括在checksoum计算中。

CRC能够识别错误,理想情况下甚至能够纠正错误(对于较低的错误量)。

协议规范的第14页给出了一个预先计算的EDM校验值的概述,以测试你自己对字符串 "SNAP "和 "snap "的校验实现。

- 数据包总长度

HTH建议在电力线、射频或红外等媒介上保持小的数据包(<40字节)以提高性能。

- 协议专用标志(PFB)

这些可以在你的协议的专门实现中使用,允许你在这里面转移一些应用逻辑,并将数据作为实际数据使用。(例如,PFB位可以设置你希望节点执行的命令,而数据可以是各个命令所需的有效载荷)。或者你可以将命令+数据完全打包到数据中,只用SNAP进行传输,寻址并确保打包后的数据没有错误。

Python的实现

有一个SNAP的Python实现可用。注意这是针对Python 2的。

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

下面是这个模块的文档。

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

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

下面是一个使用文件的例子。

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

可能在这里下载代码更方便。

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

这个Python实现为某个应用实现了SNAP的一个子集,但它是你自己实现的一个好的起点。

调试工具和库

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

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

这些是用DELPHI编写的通用测试程序,使用COM端口进行通信。Snaplab可以窥探SNAP的网络流量,并生成带有随机数据的SNAP数据包。

有一个用于SNAP协议的C库。

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

它并没有实现SNAP的完整功能集。

下面是一个C++的实现。

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