BACnet MS/TP协议解析(3)

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 Is15 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.rhkb.cn/news/432235.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测

TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测 目录 TCN预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料预测效果

武汉正向科技 格雷母线检测方式 :车检,地检

正向科技|格雷母线原理运用-车检,地检 地上检测方式 地址编码器和天线箱安装在移动站上,通过天线箱发射地址信号,地址解码器安装在固定站(地面)上,在固定站完成地址检测。 车上检测方式 地址编码器安装在…

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南?怎么优化 MySQL发邮件性能? MySQL Mail服务器的集成,使得数据库可以直接触发邮件发送,极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器,以实现邮件发送功能。 MySQL Mail&…

SegFormer网络结构的学习和重构

因为太多的博客并没有深入理解,本文是自己学习后加入自己深入理解的总结记录,方便自己以后查看。 segformer中encoder、decoder的详解。 学习前言 一起来学习Segformer的原理,如果有用的话,请记得点赞关注哦。 一、Segformer的网络结构图 网络结构&…

JavaWeb 12.Tomcat10

希望明天能出太阳 或者如果没有太阳的话 希望我能变得更加阳光一点 —— 24.9.25 一、常见的JavaWeb服务器 Web服务器通常由硬件和软件共同构成 硬件:电脑,提供服务供其他客户电脑访问 软件:电脑上安装的服务器软件,安装后能提…

TIOBE 编程指数 9 月排行榜公布 VB.Net第七

原文地址:百度安全验证 IT之家 9 月 8 日消息,TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,今天 TIOBE 官网公布了 2024 年 9 月的编程语言排行榜&#xf…

介绍 Agent Q:迎接下一代 AI 自动化助手

引言 在科技领域,随着人工智能的不断进步,自动化工具日益成为提升效率的重要手段。今天,我将向大家介绍一款名为 Agent Q 的 AI 自动化助手。这款工具不仅能够完成复杂的任务,还支持交互式命令行操作,使得用户体验更为…

飞驰云联亮相电子半导体数智化年会 获”数据交换领域最佳厂商”

2024年9月20日,“2024第二届电子半导体/智能制造数智化年会暨品牌出海论坛”于上海隆重开幕,Ftrans飞驰云联作为国内领先的数据安全交换厂商,应邀携半导体全场景产品和解决方案亮相此次峰会。会上进行了“智象奖”评选,Ftrans飞驰…

java并发之并发关键字

并发关键字 关键字一:volatile 可以这样说,volatile 关键字是 Java 虚拟机提供的轻量级的同步机制。 功能 volatile 有 2 个主要功能: 可见性。一个线程对共享变量的修改,其他线程能够立即得知这个修改。普通变量不能做到这一点&a…

从零开始学习PX4源码5(遥控器数据)

#目录 文章目录 摘要1.PX4 遥控器控制整体流程2.PX4 遥控器输入程序3.PX4 遥控器数据外部调用接口4.PX4 遥控器手动(姿态控制)变量5.遥控器数据整体流程摘要 本节主要记录PX4代码中如何获取遥控器数据,遥控器数据如何被外界调用的过程,欢迎批评指正。 1.PX4 遥控器控制整…

JAVA-StringBuilder和StringBuffer

一、认识String类 1.认识 String在Java中是字符串类型,但与其他类型不同。它是一个类,可以创建对象的类。与int、char等自待类型有些许不同。但它仍然是java提供的一种类型。 类中有4个属性,这里主要认识一下value属性。它是实际存放字符串…

2024 IDEA软件 部署tomcat 十二步 运行web页面(html类似的)(中英文对照版本)新手小白易上手

目录 一、准备工作(三必备): 1、自己的web项目 2、idea软件(我是2023.1.2版本) 3、tomcat X.X版本 二 、正式开始步骤,不废话!! 1、 点击菜单栏中 “File”(文件&…

NASA数据集:ATLAS/ICESat-2 L3A 海洋地表高度 V006

ATLAS/ICESat-2 L3A Ocean Surface Height V006 目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 简介 该数据集(ATL12)包含全球开阔洋(包括无冰季节冰区和近海岸地区)的沿轨海面高度。 还提供了高度…

C++ 9.25

手动实现栈、和队列 stack #include <iostream> using namespace std; class Stack { private: int* arr; // 存储栈元素的数组 int top; // 栈顶索引 int capacity; // 栈的容量 public: Stack(int size) { arr new int[size]; c…

FLStudio21Mac版flstudio v21.2.1.3430简体中文版下载(含Win/Mac)

给大家介绍了许多FL21版本&#xff0c;今天给大家介绍一款FL Studio21Mac版本&#xff0c;如果是Mac电脑的朋友请千万不要错过&#xff0c;当然我也不会忽略掉Win系统的FL&#xff0c;链接我会放在文章&#xff0c;供大家下载与分享&#xff0c;如果有其他问题&#xff0c;欢迎…

基于Python大数据的音乐推荐及数据分析可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【吊打面试官系列-MySQL面试题】MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量&#xff0c;预计运维三年,怎么优化&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 数据库作发布系统的存储&#xff0c;一天五万条以上的增量…

二模--解题--101-110

文章目录 10.沟通管理101、 [单选] 在项目执行阶段&#xff0c;项目经理意识到项目干系人一直延迟答复敏感性电子邮件。项目经理应该怎么做&#xff1f; 4.整合管理102、 [单选] 在编制项目章程用于批准时&#xff0c;项目经理发现有两名干系人对关键可交付成果的期望有冲突。若…

【读写分离?聊聊Mysql多数据源实现读写分离的几种方案】

文章目录 一.什么是MySQL 读写分离二.读写分离的几种实现方式(手动控制)1.基于Spring下的AbstractRoutingDataSource1.yml2.Controller3.Service实现4.Mapper层5.定义多数据源6.继承Spring的抽象路由数据源抽象类&#xff0c;重写相关逻辑7. 自定义注解WR&#xff0c;用于指定当…