BACnet协议详解————MS/TP物理层,数据链路层和网络层
文章目录
- 写在前面
- 1 物理层
- 2 数据链路层
- MSTP的流程如下
- note
- MS/TP帧格式
- 3 网络层
写在前面
这周加更一篇,来弥补一下之前落下的进度。简单的说两句,之前讲应用层的时候,只是跟官方的手册来同步一下,但是从个人理解来说,自下而上的讲解和理解是更有好处的。因此,今天我就把物理层,数据链路层和网络层放在一起来讲,这样形成一个自下而上的知识体系,应该更适合各位看官的理解。
物理层有很多,比如MS/TP, IP等等,在产品中比较常用也是这两种,尤其是MS/TP,因此,在这里我就以MS/TP为例进行讲解。IP的东西如果有时间或者精力的话,我再加进来。这里强调一下,数据链路层也就是MS/TP还是很有用的,肯定要弄懂。它是整个BACnet通信的基础,也就是BACnet正常运行起来的前提条件就是MS/TP通信是正常的。调试BACnet的时候,先是确定物理层的RS485是否正常,然后用抓包工具看整个总线的MS/TP是否正常工作,最后再看BACnet运行的service或者object是否正常。
1 物理层
其实,正常说来,MS/TP是数据链路层,而物理层是RS485。RS485其实就是串口改成差分信号,因此传输距离相对于串口有了很大的提升。作为firmware工程师,我就不在这里说硬件隔离什么的东西,我也不是很懂的。但是,从firmware工程师的角度来,物理层就是RS485或者说串口加使能引脚。
2 数据链路层
在这里的数据链路层,就是在整个RS485拓扑里面的设备能够共同完整地进行通信。它采用的方式就MS/TP(MASTER-SLAVE/TOKEN-PASS),字面的意思就是主从设备的令牌传输。在整个RS485的总线中,令牌是在主设备之间进行传输的,而从设备只是对总线中的数据进行侦听而已。
在MS/TP的总线中,每个设备都必须有一个唯一的地址来标识自己。这个地址是一个无符号的8bit数据,其中以0xFF为目的地址的数据代表广播数据,而0xFF不能作为源地址出现在MS/TP协议中。0-127都可以作为主节点和从节点的地址,而128-254只能作为从节点的地址。
MSTP的流程如下
假如在整个MS/TP总线中存在地址分别为1、3、5的三个设备。我们分别叫它们为阿大,阿二,阿三。
- 阿大、阿二、阿三都在总线上等着收消息。
- 三个人等了半天都没收到消息,也不知道总线上都有谁
- 阿大等不及了(阿大先等不及的原因是address越小,timeout的时间越小),阿大就开始问2地址有人不(用的是Poll for Master消息)?没人回复
- 阿大又开始问,3地址有人不?这时候,阿二开始回复我在啊!(用的是Reply Poll for Master消息)
- 阿大知道阿二在了,就告诉阿二,我用完总线了,你可以用总线了(也就是把token传给了3地址)
- 阿二这时候也不知道他的令牌传给谁,因此也需要在总线上问4地址的人在不在?
- 5地址的人在不在?阿三开始回复说,我在了。
- 阿二就告诉阿三,你可以说话了
- 阿三按照同样的方法找到了阿大,此时,阿大、阿二、阿三就都知道它们的下一个设备了
- 阿三就把令牌传给了阿大,在阿大拥有令牌的这段时间,阿大可以主动发起对话,其它设备只能进行回复
- 这样阿大说完话,就让阿二说,再让阿三说,周而复始
- 同时阿大、阿二、阿三还会周期的在总线上问其它的地址在不在,这样就能保证新设备也能加入这个对话流程
note
需要注意的是:
- 当总线上没有令牌的时候,超时时间=Tno_token + 地址 * Tslot,其中Tno_token是500ms,Tslot是10ms。因此,阿大最先发现没有令牌。
- 当阿三问地址在不在的时候,肯定有一个最大值,才能问道阿大,这个最大值是device object的一个property,需要在初始化的时候进行设定(max_master)
- 阿大、阿二、阿三每个人在自己的对话窗口期或者说令牌持有期能说多少话,也是有限制的,也是device的一个property,需要在初始化的时候进行设定
- 需要说明的是,阿大、阿二、阿三都是MASTER,这里面没有SLAVE,首先在BACnet里面基本上没有SLAVE的使用了;其次,从字义上也可以理解,SLAVE是无法获取令牌的,也就是SLAVE无法主动发起对话,只能等待其他人的问询,从而进行回复
- 阿大、阿二、阿三这种传递话语权和询问加入者的过程,就是MS/TP的过程,也就是数据链路层的过程,它保证了总线上的节点或者设备能够相互完整顺畅的通信起来
- 看到这里,各位看官基本上应该理解了整个链路层或者说MS/TP的工作过程,但是就会有看官问了,BACnet的通信是在哪里的呢?就是在阿大、阿二、阿三获取令牌之后,每个人说的话就是BACnet相关的通信了
MS/TP帧格式
前导码 | 帧类型 | 目的地址 | 源地址 | 长度 | 帧头CRC | 数据 | 数据CRC |
---|---|---|---|---|---|---|---|
2*U8 | 1*U8 | 1*U8 | 1*U8 | 2*U8 | 1*U8 | 可以没有 | 2*U8(可以没有) |
-
前导码由0x55和0xFF组成
-
帧类型包括
- 00 ———— Token:用于将总线的主导权传递给目的地址
- 01 ———— Poll For Master:用于发现总线上的MASTER设备,并决定令牌环上的后续设备
- 02 ———— Reply To Poll For Master:用于表示发送设备想加入到令牌环
- 03 ———— Test_Request:用于回环测试
- 04 ———— Test_Response:用于回环测试
- 05 ———— BACnet Data Expecting Reply:用于发送需确认的BACnet消息,消息长度可以使0-501
- 06 ———— BACnet Data Not Expecting Reply:用于发送不需要确认的BACnet消息,消息长度可以是0-501
- 07 ———— Reply PostPoned:当设备接收到需确认的消息的时候,来不及处理这个消息,就会回复Reply PostPoned用于告诉发送者,回复的设备需要等一会才能回复
- 32 ———— BACnet Extended Data Expecting Reply
- 33 ———— BACnet Extended Data Not Expecting Reply
- 8-21和34-127预留下来
- 128-255是为开发者用作非BACnet的私有帧用的,数据区的前两个字符必须填写唯一的开发者的id,所以数据的长度最少应该是2个字节,最大到501个字节
3 网络层
从上图中可以看到,物理层和数据链路层有很多选择,比如IP, RS485, LonTalk等等。但是网络层就一个选择,那么网络层是干什么的呢?网络层就是将具有多种物理硬件和数据链路层的设备整合起来进行通信的层。咱们在数据链路层也就是第2部分简单讲述了MS/TP的通信过程,但这个MS/TP的通信过程能够完成的条件就是所有的设备都是以RS485为硬件进行通信。如果整个网络中,既有IP设备,又有RS485设备,那怎么进行通信呢?这时就需要BACnet的网络层的功能了。这部分的具体实现,我就不在这里说明了。首先,在开发的过程,这部分的功能基本都是在协议栈中包含,对于开发者来说就是个黑盒,不需要太多关注;其次,我对这方面的研究还不足以通俗地把它讲解出来,因为它的分支很多,不像一个MS/TP一样,能一个逻辑的把整套东西讲完。所以呢,有兴趣的同学可以去研究一下协议本身。但是我建议你还是不要了,除非开发的时候遇到什么问题,因为就单单是它的帧头就会因为不同的情况有很多种形态,看的时候有点难。
相关文章:

BACnet协议详解————MS/TP物理层,数据链路层和网络层
文章目录写在前面1 物理层2 数据链路层MSTP的流程如下noteMS/TP帧格式3 网络层写在前面 这周加更一篇,来弥补一下之前落下的进度。简单的说两句,之前讲应用层的时候,只是跟官方的手册来同步一下,但是从个人理解来说,自…...

Tomcat
Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。 Web服务器是安…...

创客匠人直播:构建公域到私域的用户增长模型
进入知识付费直播带货时代,很多拥有知识技能经验的老师和培训机构吃到了流量红利。通过知识付费直播,老师们可以轻松实现引流、变现,还可以突破时间、地域的限制,为全国各地的学员带来优质的教学服务,因此越来越受到教…...

机试指南
文章目录零、绪论和IDE安装int取值范围常犯的编程小错误一、枚举和模拟 (暴力求解)(一) 枚举1.Reverse函数 求 反序数2.程序出错的原因1.编译错误 (compile):基本语法错误2.链接错误 (link):函数名写错了3.运行错误 (run):结果与预期不符&…...

Android CTA认证设定首选网络类型
需求 硬件只支持4G,过CTA认证时打网络电话,会出现3G网络的选择,会导致过不了,需要禁用3G网络选择功能。 Android 8.1.0 分析 可adb命令查看当前的网络类型 getprop | grep “network” 打印如下: [gsm.network.type]: [LTE,LTE] [ro.telephony.default_network]: [9] …...

Android 动态切换应用图标方案
经常听到大家讨论类似的需求,怀疑大厂是不是用了此方案,据我个人了解,多数头部 app 其实都是发版来更新节假日的 icon。当然本方案也是一种可选的方案,以前我也调研过,存在问题和作者所述差不多,此外原文链…...
SMART PLC斜坡函数功能块(梯形图代码)
斜坡函数Ramp的具体应用可以参看下面的文章链接: PID优化系列之给定值斜坡函数(PLC代码+Simulink仿真测试)_RXXW_Dor的博客-CSDN博客很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1…...

不那么认真的linux复习
这是个不那么认真的linux总结,可能有一些错误 1、linuxkernel(内核)shell(外壳)fs(文件系统)pro/uti/tol(应用程序) 2、ls(列出文件) -a…...

Redis系列文章总纲
跟着老万学Redis 前言 从事开发工作这么久,很多核心技术其实都还只是局限在满足日常开发工作中的基础使用,并没有完整的总结研究。今年的目标之一是完成几个技术栈的系列博客,系统的总结一下知识体系,目前计划是从Redis开始。 Re…...

更新丨三大模块升级,助力高效交付商业项目!
功能更新!本文将介绍最新升级的步进漫游、行业方案、VR漫游三个模块,让您更快更好的了解系统能力,为您带来更加便捷、高效的使用体验。步进漫游 离线导出步进式漫游系统,是基于全景图自动生成三维建模的解决方案,实现大…...

C++回顾(二)——const和引用
2.1 C中的const 2.1.1 C与C中const的比较 (1)C语言中的const C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间。 (2)C中的const 1、C中 const 变量声明的是一个真正的常量ÿ…...

MXNet中使用双向循环神经网络BiRNN对文本进行情感分类<改进版>
在上一节的情感分类当中,有些评论是负面的,但预测的结果是正面的,比如,"this movie was shit"这部电影是狗屎,很明显就是对这部电影极不友好的评价,属于负类评价,给出的却是positive。…...

DNS 域名解析
介绍域名 网域名称(英语:Domain Name,简称:Domain),简称域名、网域。 域名是互联网上某一台计算机或计算机组的名称。 域名可以说是一个 IP 地址的代称,目的是为了便于记忆。例如,…...

Spring MVC 源码- ViewResolver 组件
ViewResolver 组件ViewResolver 组件,视图解析器,根据视图名和国际化,获得最终的视图 View 对象回顾先来回顾一下在 DispatcherServlet 中处理请求的过程中哪里使用到 ViewResolver 组件,可以回到《一个请求响应的旅行过程》中的 …...

【Hello Linux】初识冯诺伊曼体系
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍冯诺伊曼体系 冯诺伊曼体系 冯诺伊曼体系结构的合理性 我们在Linux的第一篇博客中讲解了第一台计算机的发明是为了解决导弹的…...

mysql索引,主从多个核心主题去探索问题。
网上收集不错的优化方案 事务 mvcc 详讲 详讲 索引 索引概念 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据 库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数 据…...

前端一面必会面试题(边面边更)
哪些情况会导致内存泄漏 以下四种情况会造成内存的泄漏: 意外的全局变量: 由于使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收。被遗忘的计时器或回调函数: 设置了 setInterval…...

【Hello Linux】初识操作系统
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍下操作系统的概念 操作系统 操作系统是什么? 操作系统是管理软硬件资源的软件 为什么要设计操作系统 为什么要设…...

完美的vue3动态渲染菜单路由全程
前言: 首先,我们需要知道,动态路由菜单并非一开始就写好的,而是用户登录之后获取的路由菜单再进行渲染,从而可以起到资源节约何最大程度的保护系统的安全性。 需要配合后端,如果后端的值不匹配࿰…...

2023年CDGA考试模拟题库(301-400)
2023年CDGA考试模拟题库(301-400) 300.无附加价值的信息通常也不会被删除,因为:[1分] A.它不应该被移除,所有数据都是有价值的 B.我们可能在以后的某个阶段需更这些信息 C.规程中不明确是否应该保留 D.数据是一种资产它很可能在未来被认为是有价值的 E.规程中不明确哪些是…...

Linux-常见命令
🚜关注博主:翻斗花园代码手牛爷爷 🚙Gitee仓库:牛爷爷爱写代码 目录🚒xshell热键🚗Linux基本命令🚗ls指令🚕pwd指令🚖cd指令🚌touch指令🚍mkdir指…...

2.25测试对象分类
一.按照测试对象划分1.界面测试又称UI测试,按照界面的需求(一般是ui设计稿)和界面的设计规则,对我们软件界面所展示的全部内容进行测试和检查.对于非软件来说:颜色,大小,材质,整体是否美观对于软件来说:输入框,按钮,文字,图片...的尺寸,颜色,形状,整体适配,清晰度等等,2.可靠性…...

【Zabbix实战之部署篇】Zabbix客户端的安装部署方法
【Zabbix实战之部署篇】Zabbix客户端的安装部署方法 一、Zabbix-agent2介绍1.Zabbix-agent2简介2.Zabbix-agent2优点3.主动模式和被动模式二、环境规划1.Zabbix服务器部署链接2.IP规划三、配置客户端系统环境1.关闭selinux2.放行端口或关闭防火墙四、安装zabbix-agent21.下载za…...

【CSS】CSS 层叠样式表 ② ( CSS 引入方式 - 内嵌样式 )
文章目录一、CSS 引入方式 - 内嵌样式1、内嵌样式语法2、内嵌样式示例3、内嵌样式完整代码示例4、内嵌样式运行效果一、CSS 引入方式 - 内嵌样式 1、内嵌样式语法 CSS 内嵌样式 , 一般将 CSS 样式写在 HTML 的 head 标签中 ; CSS 内嵌样式 语法如下 : <head><style …...

MySQL事务与索引
MySQL事务与索引 一、事务 1、事务简介 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务用来管理 insert,update,delete 语句 事务特性…...

【编程入门】应用市场(php版)
背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目,使…...

文化:你所在的团队,有多少人敢讲真话?
你好,我是叶芊。 今天我们要讨论的话题是文化,说“文化”这个词你可能会觉得很虚,那我们换个词——“做事风格”,这就和你们团队平时的协作习惯密切相关了。 做事风格,往小了讲,会影响团队成员对开会的认知…...

Linux | 项目自动化构建工具 - make/Makefile
make / Makefile一、前言二、make/Makefile背景介绍1、Makefile是干什么的?2、make又是什么?三、demo实现【见见猪跑🐖】三、依赖关系与依赖方法1、概念理清2、感性理解【父与子】3、深层理解【程序的翻译环境 栈的原理】四、多学一招&#…...

Spring源码该如何阅读?十年架构师带来的Spring源码解析千万不要错过!
写在前面最近学习了一句话,感觉自己的世界瞬间明朗,不再那么紧张焦虑恐慌,同样推荐给大家,希望我们都终有所得。“如果一个人不是发自内心地想要做一件事情,那么,他是无法改变自己的人生的。” 同样这句话用…...

sonarqube 外部扫描器 go vet golangci-lint 无法导入问题
首先,请看[外部分析报告]各种语言的报告生成 go vet 2> govet-report.out#没有golangci-lint,我从网上找到了 golangci-lint run --out-format checkstyle ./... > golangci-lint-report.xml值得注意的是,貌似不支持目录,仅…...