Bacnet协议报文格式详解(一)

       系统实现基于BACnet/IP(又称B/IP)网络进行通讯。BACnet虚拟链路层(BVLL)提供了BACnet网络层和某指定的通讯子系统的接口,本文指定了BACnet虚拟链路控制(BVLC)要求支持的定向和广播信息。本实现关于BACnet协议定义主要可分为三层:B/IP网络虚拟层,BACnet网络层和BACnet应用层。B/IP提供了TCP/IP一样的通讯结构,采用UDP的通讯方式。本文接下来将对此三层结构进行详细的讲解。

其文本协议的大致格式如下:

BACnet/IP

BACnet网络层

BACnet 应用层

BVLC Type

BVLC Function

Length

NPDU

APDU

BVLC Type: 0x81,代表BACnet/IP网络

BVLC Function: 指定报文的类型,何种作用;本应用使用的报文类型分为两种:

                             0A:点对点通讯

                             0B:广播通信

Length: 指定报文的长度,包括BVLC Type、BVLC Function以及本身在内

 BACnet  NPDU结构

1.协议版本号

每个NPDU的第一个字节是一个8比特的无符号整数,标识BACnet协议的版本号。目前的BACnet协议的版本号是(1)。

2.网络层协议控制信息

NPDU的第二个字节是控制字节,表示后面的某个特殊NPCI域的存在。控制字节中每个比特的作用如下:

比特位

意义

比特值

比特值的含义

比特7

标志报文类型

0

表示NPDU传送的是一个包含BACnet APDU的数据报文,报文类型域不存在。

1

表示NPDU传送的是一个网络层报文,报文类型域存在。

比特6

保留

0

目前置0。

比特5

目标指示器

0

DNET, DLEN, DADR, Hop Count 不存在

1

DNET, DLEN, Hop Count 存在

DLEN = 0表示广播MAC,DADR不存在

DLEN > 0规定了DADR域的长度

比特4

保留

0

目前置为0。

比特3:

 

源指示器

0

SNET, SLEN, SADR 不存在

1

SNET, SLEN, SADR 存在

SLEN = 0无效

SLEN > 0规定了SADR域的长度

比特2

N-UNITDATA 中的data_expecting_reply

参数

0

存在一个网络层报文期待的应答(除BACnet-Confirmed-Request-PDU,BACnet-ComlexACK-PDU段外)。

1

存在一个BACnet-Confirmed-Request-PDU,一个BACnet-ComlexACK-PDU段,或者一个网络层报文期待的应答。

比特1,0

网络优先级

11

关于楼宇安全性的报文。

10

关于楼宇关键设备的报文。

01

紧急报文。

00

一般报文。

 

3.特殊域的内容

DNET:最终目标网络号,2个字节。

DLEN:最终目标的MAC层地址的长度,1个字节,0表示对目标网络的广播。

DADR:最终目标的MAC层地址。

SNET:初始源网络号,2个字节。

SLEN:初始源的MAC层地址的长度,1个字节。

SADR:初始源的MAC层地址。

Hop Count:递减计数器值,用来防止报文不被循环路由。1个字节,初始化为X‘FF’。当报文通过每个路由器时,其值被至少减一。如果路由器发现该值已为0,则丢弃此报文。

4.网络层报文类型

如果控制域中的比特7为1,这表示此报文是一个网络层报文,其报文类型域存在。这是个1字节的域,其内容表示报文携带的各种网络层的控制信息。

5.生产商专有网络层报文

如果控制域的比特7为1和报文类型域的值为X‘80’至X‘FF’时,Vendor ID域存在,生产商可以有2个字节来编码自己的专有网络层报文类型。

6.   网络层协议报文

在BACnet中,有十种网络层协议报文,它们的作用是进行路由器自动配置,路由表的维护,和网络层拥塞控制。下面介绍这十种报文。

  • Who-Is-Router-To-Network报文

格式为:网络报文类型域是X‘00’,后面有2个字节的网络号。作用是:①节点用来确定通达某目标网络的下一个路由器;②帮助路由器更新路由表。当省略2字节的网络号时,接收此报文的路由器要返回其所有可通达的目标网络的列表。

  • I-Am-Router-To-Network报文

格式为:网络报文类型域是X‘01’,后面有2个字节的网络号。作用是列出通过发送此报文的路由器可以到达的网络号。

  • I-Could-Be-Router-To-Network报文

格式为:网络报文类型域是X‘02’,后面有2个字节的网络号和1个字节的性能指标。作用是响应包含有特定网络号的Who-Is-Router-To-Network报文,由能够建立到达特定目标网络的点到点连接的半路由器使用,其网络号就是所响应的报文中包含的特定网络的网络号。性能指标表明这种连接的质量。

  • Reject-Message-To-Network报文

格式为:网络报文类型域是X‘03’,后面有1个字节的原因说明和2个字节的网络号。作用是一个拒绝报文,直接发给生成被拒绝的报文的节点,网络号就是被拒绝报文中的网络号。在拒绝原因字节中是一个无符号的整数,其值所表示的意义如下:

(0):其它差错。

(1):本路由器不能直接连接到所指示的目标网络以及不能发现任何一个能够连接到所指示的目标网络。

(2):本路由器忙,目前不能接收关于所指示目标网络的报文。

(3):这是一个不可识别的网络层报文类型。

(4):报文太长,不能路由到所指示的目标网络。

  • Router-Busy-To-Network报文

格式为:网络报文类型域是X‘04’,后面是可选择的2个字节的网络号。作用是被路由器用来通知停止接收通过本路由器向某特定目标网络或者所有网络发送的报文。此报文通常用广播MAC地址发向相应的网络。如果没有可选择的2个字节的网络号,则表示到所有网络的报文都不接收。

  • Router-Available-To-Network报文

格式为:网络报文类型域是X‘05’,后面是可选择的2个字节的网络号。作用是被路由器用来通知开始或者重新开始接收通过本路由器向某特定目标网络或者所有网络发送的报文。此报文通常用广播MAC地址发向相应的网络。如果没有可选择的2个字节的网络号,则表示到所有网络的报文都可接收。

  • Initialize-Router-Table报文

格式为:网络报文类型域是X‘06’。作用是初始化一个路由器的路由表或者查询当前路由表的内容。此报文有一个数据段,包含有初始化路由表的信息。

  • Initialize-Router-Table-Ack报文

格式为:网络报文类型域是X‘07’。作用是对初始化路由表报文的应答,表示路由器的路由表已经改变,或者已被查询。此报文的数据段具有与它应答的初始化路由表报文相同的格式。

  • Establish-Connection-To-Network报文

格式为:网络报文类型域是X‘08’, 后面有2个字节的网络号和1个字节的“中止时间值”。作用是命令一个半路由器创建一个通达指定网络的点到点连接。2个字节的网络号指出要半路由器连接的目标网络。1个字节的“中止时间值”规定了在没有NPDU到达的情况下,连接保留的时间。当此值为0时,表示连接永久保留。                                                                                                    

  •   Disconnect-Connection-To-Network报文

格式为:网络报文类型域是X‘09’, 后面有2个字节的网络号。作用是命令一个路由器释放所建立的点到点连接。

 

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: BACNET协议是一种用于建筑自动化和控制领域的通信协议,它使设备、系统和应用程序能够互相通信。下面是一个简单的BACNET协议解析脚本的例子,该脚本可以解析来自BACNET设备的数据帧: ``` # 导入所需的模块 import struct # 定义一个函数,用于解析BACNET协议数据帧 def parse_bacnet_frame(data): # 定义一个字典,用于存储解析出的数据 bacnet_data = {} # 对数据帧进行解析 # 前4个字节表示BACNET协议版本 (bacnet_data['version'],) = struct.unpack('!H', data[0:2]) # 接下来的2个字节表示报文类型 (bacnet_data['type'],) = struct.unpack('!H', data[2:4]) # 以此类推,继续解析其他字段 # 返回解析出的数据 return bacnet_data ``` 在上面的脚本中,我们使用了Python的struct模块来解析数据帧中的二进制数据。根据BACNET协议的规定,我们可以使用特定的格式字符串来指定要解析的数据类型。例如,'!H'表示要解析一个无符号短整型数(2个字节)。 希望这个例子能对你有所帮助。 ### 回答2: BACnet(Building Automation and Control Networking)是一种用于建筑自动化和控制系统的通信协议。编写一个BACnet协议解析脚本需要以下步骤: 1. 导入必要的库:编写脚本时需要导入一些库来处理网络通信和数据解析。常用的库有socket和struct库,用于处理网络通信和二进制数据解析。 2. 建立网络连接:使用socket库建立与BACnet设备之间的网络连接。可以指定设备的IP地址和端口号来进行连接。 3. 发送请求:通过连接发送BACnet请求报文。根据BACnet协议规范,可以构造不同类型的请求报文,如读取数据、写入数据或请求设备信息等。 4. 接收响应:等待目标设备的响应消息。使用socket库的recv函数接收并解析响应数据。 5. 解析数据:使用struct库等工具解析二进制数据,将其转换成可读的BACnet数据格式,如对象类型、属性名称、属性值等。 6. 处理结果:根据协议规范,处理解析后的数据,例如输出设备的状态信息、存储数据到数据库等。 7. 关闭连接:当完成数据解析和处理后,使用socket库的close函数关闭与BACnet设备的连接。 编写BACnet协议解析脚本的关键是理解BACnet协议规范,根据规范构造请求报文,并解析响应数据。此外,需要理解二进制数据的结构和编码规则,来正确解析BACnet数据。 总之,通过建立网络连接、发送请求、接收响应、解析数据和处理结果,可以编写一个BACnet协议解析脚本来与BACnet设备进行通信,并获取和解析设备的状态信息。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值