BACnet MS/TP协议解析(3)

news2024/9/29 23:04:34

1、MS/TP帧格式

例如数据(hex):55 FF 01 03 02 00 00 D7 

0x550xff0x010x030x020x000x000xD7BACnet数据BACnet数据CRC
帧头帧类型目的地址源地址BACnet数据长度,大端CRC

2、帧类型

帧类型目前定义为 0-7,8-127 为 ASHRAE 保留。帧类型 128-255 可供供应商用于非 BACnet 帧,数据的前两个字节表示供应商标识符。

当前定义的帧为

令牌 (0)、

主站轮询 (1)、

主站轮询回复 (2)、

测试请求 (3)、

测试响应 (4)、

BACnet 数据等待回复 (5)、

BACnet 数据不等待回复 (6)

回复推迟 (7)。


目标站地址可以是 0-127(用于发送到主节点)、0-254(用于发送到从属节点)和 255(用于向所有节点广播)

3、令牌传递过程

测试环境:
在win10,使用模拟工具Yabe BACnet 模拟设备。
使用正点原子开发板,移植了BACnet的mstp。
监控的485上的数据,逐条分析。

55 FF 01 00 02 00 00 4F   //设备地址02轮询,源地址02  问目的地 00  在不在  没回复  
55 FF 01 01 02 00 00 C6   //设备地址02轮询,源地址02  问目的地 01  在不在  没回复  
55 FF 01 03 02 00 00 D7   //设备地址02轮询,源地址02  问目的地 03  在 
55 FF 02 02 03 00 00 4F   //设备地址03回复,源地址03 回复给 02  
55 FF 00 03 02 00 00 51   //传递令牌,源地址02,02把令牌传递给03
55 FF 06 FF 03 00 08 B6 01 20 FF FF 00 FF 10 08 15 B6 //BACnet数据不等待回复,03广播数据 Who-Is
55 FF 01 00 03 00 00 D7   //设备地址03轮询,源地址03  问目的地 00  在不在  没回复  
55 FF 01 01 03 00 00 5E   //设备地址03轮询,源地址03  问目的地 01  在不在  没回复 
55 FF 01 02 03 00 00 C6   //设备地址03轮询,源地址03  问目的地 02  在 
55 FF 02 03 02 00 00 5E   //设备地址02轮询回复,源地址02 回复给 03   
55 FF 00 02 03 00 00 40   //传递令牌,源地址03,把令牌传递给02
55 FF 06 FF 02 00 15 25 01 20 FF FF 00 FF 10 00 C4 02 00 00 67 22 01 E0 91 03 22 01 04 DA EE //BACnet数据不等待回复,02广播数据I-Am

4、Who-Is 数据结构

如下:

//Who-Is
55 FF  //帧头
06     //帧类型  BACnet数据,不等待回应
FF     //目的地值  FF广播数据
03     //源地址    
00 08  //BACnet数据长度
B6     //帧头CRC
       //NPDU
01     //协议版本号
20     //网络控制八位字节(第 6.2.2 条)
		bit7=0: 指示 NPDU 是否包含 BACnet APDU。此值为 0,表示该 NPDU 包含 APDU。
		bit6=0: 保留位,必须为 0。
		bit5=1: 目的地址标识符为 DNET、DLEN 和 Hop Count,这表明该帧有目的网络信息。
		bit4=0: 保留位,必须为 0。
		bit3=0: 源地址字段缺失。
		bit2=0: 无需期待应答。
		bit1=0: 该消息的优先级为普通消息。
		bit0=0: 此位为优先级控制字段,值为 0,表示这不是一个生命安全或关键设备消息。
FF FF   //目的地址  65535 广播数据
00      //目的mac 长度  0
FF      //Hop Count
        //APDU
10      //APDU 类型 1:未确认的请求
08      //服务选择 8: Who Is

15 B6   //Data CRC-16

5、I-Am 数据结构

如下:

I-Am
55 FF   //帧头
06      //帧类型  BACnet数据,不等待回应
FF      //目的地值  FF广播数据
02      //源地址   
00 15   //BACnet数据长度
25      //帧头CRC
        //NPDU
01      //协议版本号
20      //网络控制八位字节(第 6.2.2 条)
		bit7=0: 指示 NPDU 是否包含 BACnet APDU。此值为 0,表示该 NPDU 包含 APDU。
		bit6=0: 保留位,必须为 0。
		bit5=1: 目的地址标识符为 DNET、DLEN 和 Hop Count,这表明该帧有目的网络信息。
		bit4=0: 保留位,必须为 0。
		bit3=0: 源地址字段缺失。
		bit2=0: 无需期待应答。
		bit1=0: 该消息的优先级为普通消息。
		bit0=0: 此位为优先级控制字段,值为 0,表示这不是一个生命安全或关键设备消息。
FF FF   //目的地址  65535 广播数据
00      //目的mac 长度  0
FF      //Hop Count
		//APDU	
10      //APDU 类型 1:未确认的请求
00      //服务选择 0: I-Am
C4      //应用程序标记 12(对象标识符),长度 4;高4bit是对象标识符,低4bit是长度4,
      //1100 .... = Application Tag Number: BACnetObjectIdentifier (12)
	  //.... 0... = Tag Class: Application Tag
	  //.... .100 = 4 Length Value Type: 4
02 00 00 67 // 对象标识符指示了设备对象,
高10bit是类型,=0b0000 0010 00 = 8 为 类型device,
低22bit为实例号,为=0b00 0000 0000 0000 0110 0111 = 0x67 = 103 该标识符用于唯一标识网络中的设备。
22    //Application Tag 2 (Unsigned Integer), length 2,高4bit表示数据类型(Unsigned Integer),低4bit数据长度
01 E0 //最大 APDU 长度: 480
91    //Application Tag 9 (Enumerated), length 1,高4bit表示数据类型(Enumerated枚举),低4bit数据长度
03    //segmentation: no-segmentation
22    //Application Tag 2 (Unsigned Integer), length 2,高4bit表示数据类型(Unsigned Integer),低4bit数据长度
01 04 //Vendor Identifier 为 260,标识符表示该设备的供应商为 BACnet Stack at
DA EE //Data CRC-16

6、BACnet-Confirmed-Request-PDU

NPDU数据结构

      //NPDU
01    //协议版本号
04 	  //网络控制八位字节(第 6.2.2 条)
		bit7=0: 指示 NPDU 是否包含 BACnet APDU。此值为 0,表示该 NPDU 包含 APDU。
		bit6=0: 保留位,必须为 0。
		bit5=0: 目的地说明符:DNET、DLEN、DADR 和跳数不存在。
		bit4=0: 保留位,必须为 0。
		bit3=0: 源地址字段缺失。
		bit2=1: 期待答复:BACnet-Confirmed-Request-PDU,BACnet-ComplexACK-PDU 或网络消息的一个片段,期待答复。
		bit1=0: 该消息的优先级为普通消息。
		bit0=0: 此位为优先级控制字段,值为 0,表示这不是一个生命安全或关键设备消息。


APDU数据结构


注解
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
propertyIdentifier
propertyArrayIndex

[0] BACnetObjectIdentifier,
[1] BACnetPropertyIdentifier,
[2] Unsigned OPTIONAL --used only with array datatype
-- if omitted with an array the entire array is referenced

}
这些项目包括“objectIdentifier”,带有上下文标签 0,类型为
BACnetObjectIdentifier;

“propertyIdentifier”,带有上下文标签 1,类型为 BACnetPropertyIdentifier;“propertyArrayIndex”,一个可选的无符号整数,带有上下文标签 2。由于模拟输入对象的当前值不是数组,因此本例中不会出现“propertyArrayIndex”。

BACnet-Confirmed-Request
55 FF //帧头
05    //帧类型  BACnet数据,等待回应
02    //目的地值02
03    //源地址  
00 0D //BACnet数据长度
22    //帧头CRC
      //NPDU
01    //协议版本号
04 	  //网络控制八位字节(第 6.2.2 条)
		bit7=0: 指示 NPDU 是否包含 BACnet APDU。此值为 0,表示该 NPDU 包含 APDU。
		bit6=0: 保留位,必须为 0。
		bit5=0: 目的地说明符:DNET、DLEN、DADR 和跳数不存在。
		bit4=0: 保留位,必须为 0。
		bit3=0: 源地址字段缺失。
		bit2=1: 期待答复:BACnet-Confirmed-Request-PDU,BACnet-ComplexACK-PDU 或网络消息的一个片段,期待答复。
		bit1=0: 该消息的优先级为普通消息。
		bit0=0: 此位为优先级控制字段,值为 0,表示这不是一个生命安全或关键设备消息。
	  //APDU	
02    //PDU Type = 0,  SEG=0,MOR=0, SA=1
73    //Max Segs = 7,Max Resp =3;
00    //Invoke ID = 0
0C    //Service Choice = 12,表示readProperty
      //ObjectIdentifier: device, 103
0C    
      //0000 .... = Context Tag Number: 0;bit3 =1;
	  //.... 1... = Tag Class: Context Specific Tag
	  //.... .100 = 4 Length Value Type: 4
02 00 00 67 // 对象标识符指示了设备对象,
            // 高10bit是类型,=0b0000 0010 00 = 8 为 类型device,
            // 低22bit为实例号,为=0b00 0000 0000 0000 0110 0111 = 0x67 = 103 该标识符用于唯一标识网络中的设备。
19    //Context Tag 1, length 1: BACnetPropertyIdentifier
D1    //数据:属性 209:现值
8C B1 //Data CRC-16

7、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

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 vite模式配置测试,开发、生产环境以及代理配置

1、首先在根目录下创建三个文本文件:.env.development,.env.production,.env.test .env.development中的内容为: // 开发环境 .env.development NODE_ENV development VITE_APP_MODE development VITE_OUTPUTDIR dist_dev /…

基于Java的宠物之家小程序 宠物服务小程序【源码+调试】

精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻 💖🔥作者主页:计算机毕设木哥🔥 💖 文章目录 一、宠物之家小程…

FPGA第 11 篇,Verilog 系统函数( Verilog 中的系统函数)

前言 Verilog 作为一种强大的硬件描述语言,不仅提供了用于设计和仿真数字电路的基础语法,还包含了丰富的系统函数,帮助我们高效地完成复杂的硬件操作。系统函数是 Verilog 语言中预定义的特殊函数,通常以 $ 开头,它们…

【深度学习】(7)--神经网络之保存最优模型

文章目录 保存最优模型一、两种保存方法1. 保存模型参数2. 保存完整模型 二、迭代模型 总结 保存最优模型 我们在迭代模型训练时,随着次数初始的增多,模型的准确率会逐渐的上升,但是同时也随着迭代次数越来越多,由于模型会开始学…

今日不错的讲企业架构的好图

今日不错的讲企业架构的好图,来源B站不错的UP主:企业架构知识体系-业务技术管理的知识框架_哔哩哔哩_bilibili

grafana频繁DataSourceError问题

背景 随着 Grafana 数据量的不断增加,逐渐暴露出以下问题: Grafana 页面加载缓慢;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题,大家可以参考这篇文章:Grafana 加载缓慢的解决方案。 不过&#xf…

【Unity踩坑】Textmesh Pro是否需要加入Version Control?

问题:如果Unity 项目中用到了Textmesh pro,相关的文件是否也需要签入呢? 回答: 在使用 Unity 的 Version Control(例如 Plastic SCM 或 Git)时,如果你的项目中使用了 TextMesh Pro&#xff0c…

条件字段有索引,为什么查询也这么慢?

如果我们想在某一本书中找到特定的主题,一般最快的方法是先看索引,找到对应的主题在哪个页码。 而对于 MySQL 而言,如果需要查找某一行的值,可以先通过索引找到对应的值,然后根据索引匹配的记录找到需要查询的数据行。…

家政服务预约系统小程序的设计

管理员账户功能包括:系统首页,个人中心,客户管理,员工管理,家政服务管理,服务预约管理,员工风采管理,客户需求管理,接单信息管理 微信端账号功能包括:系统首…

Java | Leetcode Java题解之第430题扁平化多级双向链表

题目: 题解: class Solution {public Node flatten(Node head) {dfs(head);return head;}public Node dfs(Node node) {Node cur node;// 记录链表的最后一个节点Node last null;while (cur ! null) {Node next cur.next;// 如果有子节点&#xff0…

后端(实例)08

设计一个前端在数据库调取数据的表格&#xff0c;并完成基础点击增删改查的功能&#xff1a; 1.首先写一个前端样式&#xff08;空壳&#xff09; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here&l…

VUE条件树查询

看如下图所示的功能&#xff0c;是不是可高级了&#xff1f;什么&#xff0c;你没看懂&#xff1f;拜托双击放大看&#xff01; 是的&#xff0c;我最近消失了一段时间就是在研究这个玩意的实现&#xff0c;通过不懈努力与钻研并参考其他人员实现并加以改造&#xff0c;很好&am…

人工智能时代的网络空间战略稳定及其挑战

文章目录 前言一、人工智能时代的网络空间战略稳定及其挑战(一)国内政治与官僚主义二、大国竞争与溯源政治三、国际法规与治理限制总结前言 人工智能的武器化应用在短期内将同时强化网络空间中进攻方和防御方的能力,但从长期看将有利于防御方。这种态势将令传统威慑逻辑重新…

[数据库实验三]安全性

目录 一、实验目的与要求&#xff1a; 二、实验内容&#xff1a; 三、实验小结 一、实验目的与要求&#xff1a; 1、设计用户子模式 2、根据实际需要创建用户角色及用户&#xff0c;并授权 3、针对不同级别的用户定义不同的视图&#xff0c;以保证系统的安全性 二、实验内…

Springboot jPA+thymeleaf实现增删改查

项目结构 pom文件 配置相关依赖&#xff1a; 2.thymeleaf有点类似于jstlel th:href"{url}表示这是一个链接 th:each"user : ${users}"相当于foreach&#xff0c;对user进行循环遍历 th:if进行if条件判断 {变量} 与 ${变量}的区别: 4.配置好application.ym…

【SemeDrive】【X9H】如何修改 SAFETY_FAULT 输出 PWM 频率

前言&#xff1a; SAFETY_FAULT 也是 SEM_FAULT&#xff0c;在原理图上会有不同的标注&#xff0c;但意义一样。 默认的 SAFETY_FAULT 正常时输出 PWM 频率为 100 MHz&#xff0c;过高的频率有时会导致无法通过 EMI 测试&#xff0c;需要降低频率。以下描述如何将正常时的 S…

ssh 命令详解

一、命令简介 ​ssh ​命令用于安全登录远程主机&#xff0c;以便在远程机上执行命令或传输数据。 ‍ 例如登录远程主机 169.10.222.23 ​上的 soulio ​用户&#xff1a; ssh soulio169.10.222.23更多示例参考第三章。 ‍ 了解背景知识&#xff1a;ssh 加密 1. 加密类型…

C++之Person类中调用Date类

main.cpp #include <iostream> #include "Person.h" using namespace std;int main() {Person myPerson;// Person myPerson("S.M.Wang", 070145, "莲花路200号");cout << "请输入姓名:" ;string name;cin >> name…

【文档智能 RAG】浅看开源的同质化的文档解析框架-Docling

前言 RAG的兴起&#xff0c;越来越多的人开始关注文档结构化解析的效果&#xff0c;这个赛道变得非常的同质化。 关于文档智能解析过程中的每个技术环节的技术点&#xff0c;前期文章详细介绍了很多内容&#xff1a; 下面我们简单的看看Docling这个PDF文档解析框架里面都有什…

尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)

目录&#xff1a; 自动化持续集成 &#xff08;1&#xff09;环境准备 &#xff08;2&#xff09;初始化 Jenkins 插件和管理员用户 &#xff08;3&#xff09;工作流程 &#xff08;4&#xff09;配置 Jenkins 构建工具 自动化持续集成 互联网软件的开发和发布&#xf…