关于KNX/IP 网关协议报文解析以及几个注意事项
最新在调试KNX/IP网关协议,所以分享下KNX/IP网关协议的一点理解,KNX/IP协议是在KNX协议的第三章,03_08_01开始到03_08_10。可以自行参考源文档
1、搜索网关
协议里定义了客户端搜索IP网关的ID,0x0201,和IP网关回复的ID,0x0202,报文显示如下
客户端发送搜索网关命令后,在同一网络的所有IP网关会上报回复自己的详细信息。
2、建立连接
协议里定义了客户端发送建立连接请求,0x0205,和IP网关回复的ID,0x0206,报文显示如下
客户端发送建立连接请求后,正常情况下在10s内收到IP网关回复的连接回复,如果10s内收不到,客户端应该忽视后面的连接回复报文,等待下一次连接请求发出。IP网关的连接回复报文里面有一个字段很重要,就是Communication Channel ID,比如上面的CID就是03,每一次IP网关与客户端建立连接后都有一个特定的CID,用来表示建立的通道号,这个通道号是后面所有数据通信的ID。
3、心跳包
在KNX/IP协议里有定义了客户端与IP网关之间的心跳报文机制,用来作为有效连接的判断
客户端发送连接状态请求报文0x0207,正常IP网关应该在10s内回复连接状态回复0x0208,如果IP网关未在10s内回复,则客户端重复发送3遍请求报文,如果都没有收到回复,则客户端应该主动断开与IP网关之间的连接。IP网关在120s内如果未收到任何状态请求报文,则客户端发送断开连接请求。协议如下
4、断开连接
大多数情况下应该由客户端主动发送断开连接请求,在内部错误或者收到无效数据包情况下,IP网关也可能会发送断开请求给客户端,不过协议还是建议客户端发送断开请求。在调试过程中我发现,客户端如果跟IP网关建立连接成功以后,如果客户端没有发送断开连接请求,再建立一个连接的话,会发生IP网关发送的断开请求,导致出错,错误报文如下:
后来分析后发现,如果正常建立连接后客户端跟IP网关之间有一个指定的通道号,但是未正常断开的IP网关再跟客户端建立连接后,连接成功的通道号会跟之前的不一样,之前的通道号又会存在,这时候客户端往IP网关发数据就会产生这样的错误报文,从而导致IP网关自动断开连接。
5、数据收发通讯
这一章协议在03_08_04有详细说明
协议里定义的数据发送方式如下
报文如下:
客户端往一个组地址写值,可以看出每一次发送请求后都有一个Ack帧回复,这是协议规定的,同时注意到这里有一个字段也很重要,就是Sequence Counter,这里报文的序号计数器值的从0变到1,协议如下有说明,在每一次成功数据通讯过程中这个计数值应该加1。
关于Ack帧,这里应该注意如果没有在1s内收到Ack帧,客户端应该再发一次请求帧,然后断开连接
所以Ack帧的回复应该保证在1s内,这样才不会出错。
以上就是关于KNX/IP 网关协议里面的一些基本操作和重点。