下文开始具体分析BACNET协议中几种基本的指令结构,本篇是分析最基本的WHO IS指令。WHO IS指令是BACNET主机向BACNET设备询问基本信息的指令。
由于BACNET/IP协议是封装在UDP协议当中,因此整个数据包的从低层到高层的结构如下图所示:
在经过以太网帧、IP帧、UDP帧后,就是BACNET的数据帧。
BACNET数据帧又分为BACNET Virtual Link Control(BACNET虚拟链接控制层)、Network Protocol Data Unit ( 网络协议数据单元 )、Application Protocol Data Unit(应用协议数据单元 )。
BVLC是说明BACNET协议的类型、指令、以及BVLC自身的长度,总长度为4字节。
NPDU是说明版本及一些相关的控制信息,如下图示:
APDU是说明用户的指令信息。
以下解析一下who is 指令的数据包结构,一些关于各个控制字节的详细说明需要大家参考BACNET的官方说明书,因此一个控制字节往往是8个位都有意义,在博文中解析起来相当难,大家原谅哈。
who is数据包(只含BACNET协议,UDP协议已去除)
-----BVLC-------
81 代表BACNET/IP
0B 广播
00 包长度
0C
----NPDU------
01 协议版本号
20 控制信息
FF 目的网络地址
FF
00 目的MAC层地址长度
FF 包长度
-----APDU-----
10 APDU类型:不确认应答(unconfirmed REQ)
08 who is指令
与who is对应的i am指令数据包:
-----BVLC-------
81 代表BACNET/IP
0A 单播
00 包长度
0C
----NPDU------
01 协议版本号
00 控制信息
-----APDU-----
10 APDU类型:不确认应答(unconfirmed REQ)
00 i am指令
C4 APPLICATION TAG(这个标识会留在以后的章节讲,连BACNET协议的起草人都在博客中说APPLICATION TAG和CONTEXT TAG是整个协议最难以明白的部分)
02 以下4字节为对象类型以及其ID号,在这里的对象类型为“设备(DEVICE)",ID号(INSTANCE NUMBER)是各设备独有的ID号
00
01
C8
22 APPLICATION TAG
04 最大可接收的数据长度
00
91 APPLICATION TAG
00 是否支持数据分段
21 APPLICATION TAG
7B 生产商ID