前面文章总结了NDPU,
此文章总结APDU
1、BACnet-Confirmed-Request-PDU
注解
PDU Type :无符号(0..15),-- 0 表示此 PDU 类型
SEG:分段信息(segmented-message),如果这是一条分段消息,则为 TRUE,否则为 FALSE。
MOR:more-follows BOOLEAN,如果这是一条分段消息,并且这不是最终分段,则为 TRUE。否则为 FALSE。
SA:分段消息接受(segmented-message-accepted)BOOLEAN,如果请求者接受分段 BACnet-Complex-ACK-PDU 作为响应,则为 TRUE,否则为 FALSE。
Max Segs:接受的最大响应段数。
Max Resp:可接受的最大 ADPU 大小。
Invoke ID :请求者用来将响应与请求关联的消息“序列号”。分段请求的所有段必须具有相同的invokeID。invokeID 应该为每个新的 BACnet-Confirmed-Request-PDU 递增。这便于调试,因为它允许将响应与导致响应的请求相关联。
Sequence Number:包序号,标识分段的 BACnet-Confirmed-Request-PDU 的段。不存在于未分段的请求中,只有当SEG=1,才会有这个值。
Proposed Window Size:指定发送分段 BACnet-Confirmed-Request-PDU 的请求者可接受的最大分段窗口大小。未分段的请求中不存在该值;只有当SEG=1,才会有这个值。
Service Choice:服务选择被定义为 BACnetConfirmedServiceChoice 类型,该类型在第 21 条中被定义为枚举。readProperty 的值为十进制的 12。
Service Request:
ReadProperty-Request ::= SEQUENCE {
objectIdentifier | [0] BACnetObjectIdentifier, |
}
这些项目包括“objectIdentifier”,带有上下文标签 0,类型为
BACnetObjectIdentifier;
“propertyIdentifier”,带有上下文标签 1,类型为 BACnetPropertyIdentifier;“propertyArrayIndex”,一个可选的无符号整数,带有上下文标签 2。由于模拟输入对象的当前值不是数组,因此本例中不会出现“propertyArrayIndex”。
2、BACnet-ComplexACK-PDU
APDU数据结构
注解
PDU Type :无符号(0..15),-- 0 表示此 PDU 类型
SEG:分段信息(segmented-message),如果这是一条分段消息,则为 TRUE,否则为 FALSE。
MOR:more-follows BOOLEAN,如果这是一条分段消息,并且这不是最终分段,则为 TRUE。否则为 FALSE。
Original Invoke ID:与请求包一致
Sequence Number:包序号,标识分段的 BACnet-Confirmed-Request-PDU 的段。不存在于未分段的请求中,只有当SEG=1,才会有这个值。
Proposed Window Size:指定发送分段 BACnet-Confirmed-Request-PDU 的请求者可接受的最大分段窗口大小。未分段的请求中不存在该值;只有当SEG=1,才会有这个值。
Service ACK Choice:service-ACK-choice 定义为 BACnetConfirmedServiceChoice 类型,该类型在第 350 页定义为枚举。readProperty 的值为十进制 12。
service-ACK
ReadProperty-ACK ::= SEQUENCE {
objectIdentifier propertyIdentifier propertyArrayIndex propertyValue | [0] BACnetObjectIdentifier, [1] BACnetPropertyIdentifier, [2] Unsigned OPTIONAL, --used only with array datatype -- if omitted with an array the entire array is referenced [3] ABSTRACT-SYNTAX.&Type |
}
3、PDU Type
Types of PDU
APDU Type (Code) (First nibble) | APDU (Structure) | 注解 | |
---|---|---|---|
0x0X | BACnet-Confirmed-Request-PDU | 确认请求 | |
0x1X | BACnet-Unconfirmed-Request-PDU | 不确认请求 | |
0x2X | BACnet-SimpleACK-PDU | 简单回复 | |
0x3X | BACnet-ComplexACK-PDU | 复杂回复 | |
0x4X | Segment ACK | 段确认 | |
0x5X | Error PDU | 错误 | |
0x6X | Reject-PDU | PDU 由于语法原因被拒绝,包含 BACnet 拒绝原因 | |
0x7X | Abort PDU | 包含 BACnet 中止原因 | |
0x8X~0xfX | Reserved |
4、常用的APDU
(1)BACnet-Confirmed-Request-PDU
(2)BACnet-Unconfirmed-Request-PDU
(3)BACnet-Simple-ACK-PDU
(4)BACnet-ComplexACK-PDU
5、APDU 中的重要数据结构
基本数据结构如下:
class区分BACnet 标签
标签有两种类型,每种类型的标签号用法各有不同。
- 应用程序标签(class = 0)
- 这些有固定的类型 - 布尔值、整数、日期等等。
- 上下文特定标签(class = 1)
- 这些标签的类型取决于它们在 APDU 变量部分中的位置。仅通过检查无法确定它们的类型。
- 它们具有相关的上下文编号,用于指定数据的含义。
- 上下文标签还允许创建构造标签(列表)。
应用程序标签(class = 0)下的Tag Number对应的数据类型
Tag Number | Description |
---|---|
0 | NULL(空) |
1 | Boolean(布尔值) |
2 | Unsigned Integer*(无符号值) |
3 | Signed Integer(有符号值) |
4 | Real(32位浮点数float) |
5 | Double(64位浮点数double) |
6 | Octet String(表示字节字符串,通常用于存储原始二进制数据) |
7 | Character String(表示文本字符串,通常用于字符数据) |
8 | Bit String(表示位字符串,通常用于存储位集合) |
9 | Enumerated(表示枚举类型,具有预定义的离散值。) |
10 | Date(表示日期数据,通常格式为年-月-日。) |
11 | Time(表示时间数据,通常格式为时:分:秒。) |
12 | BACnetObjectIdentifier(表示BACnet对象的唯一标识符) |
13 | Reserved(保留) |
14 | Reserved(保留) |
15 | Reserved - Indicates that the following Octect contains an 8-bit Tag Number(保留,表示后续的字节包含一个8位标签编号。) |
(1)对象标识符
对象可以通过其对象标识符与设备的对象标识符相结合来唯一标识。此唯一性仅限于给定设备,不适用于整个网络。需要注意的是,不允许使用 4194303 作为对象标识符,这表明包含的对象尚未初始化。
设备的对象标识符在整个网络范围内必须是唯一的。这实际上意味着设备实例在任何给定的 BACnet 互联网网络中都是唯一的。
对象标识符的应用标签号为12。
.... 1... = Tag Class: Context Specific Tag
0000 .... = Context Tag Number: 0
Length Value Type: 4
0000 0010 00.. .... .... .... .... .... = Object Type: device (8)
.... .... ..11 0101 0000 0000 0001 1011 = Instance Number: 3473435
31~22 | 21~0 |
---|---|
对象类型(10 位) | 对象实例(22 位) |
(2)属性标识符
属性标识符
这些是协议中的枚举值。另外,一定要了解标记值。
总共有 192 多个属性。以下是其中一些:
Value | Hex | Description | Encoded As |
---|---|---|---|
12 | 0x0C | Application Software Version | Character String |
77 | 0x4E | Object Name | Character String |
85 | 0x55 | Present Value |
(3)读取属性
Read Property Request
Encoding | Argument | Required |
---|---|---|
Context 0 | Object Identifier | Mandatory |
Context 1 | Property Identifier | Mandatory |
Context 2 | Property Array Index | User |
Confirmed Service ACK Read Property
Encoding | Argument | Required | Comment |
---|---|---|---|
Context 0 | Object Identifier | Mandatory Equal | |
Context 1 | Property Identifier | Mandatory Equal | |
Context 2 | Property Array Index | User Equal (Must match request) | Note that if this value is 0, then the following item will be the an array length |
Context 3 | Property Value(s) | Mandatory Equal | This could be a single field, or multiple fields, depending on Encoding choices. There will be an Opening Tag (Value 0x3f, for context 3, opening tag), one or more values, and a Closing Tag. Variable Encoding per Section 20.3 of the specification. |
(4)写属性
Write Property
Encoding | Argument | Required |
---|---|---|
Context 0 | Object Identifier | Mandatory |
Context 1 | Property Identifier | Mandatory |
Context 2 | Property Array Index | User |
Context 3 | Property Value | Mandatory |
Context 4 | Priority | Commandable |
参考文章
BACnet Protocol: Basic Concepts, Structure, and Object Model Explained | EMQ