BACnet协议详解——应用层说明一

news2024/11/16 9:21:07

文章目录

  • 写在前面
  • 1. 应用层模型
      • 1.1 需确认的应用层服务
      • 1.2 无需确认的应用层服务
  • 2 BACnet报文的分段
      • 2.1 报文分段规则
          • 2.1.1 APDU数据流的分段规则
          • 2.1.2 APDU最大长度的确定
          • 2.1.3 可接受的最大分段数
      • 2.2 分段协议控制信息(PCI)

写在前面

年关将至,事情有点多,耽误了原本定好的每两周更新一次的任务。本来也想着把应用层用一章的blog来说的,不过太多的,分开来讲吧!最后祝大家新年快乐,身体健康,学啥会啥。年后见啦~

1. 应用层模型

建立这个模型的目的是为了清楚地描述应用层与应用程序之间的交互(interaction)、应用层与协议栈中下面各层次的关系、以及应用层与远程设备中应用层的对等交互。

一个应用进程(Application Process)是指在一个系统中,针对某个应用而进行信息处理的功能模块。如上图所示,在应用进程中有一部分位于应用层之外,它们与通信功能无关,这些部分都不属于BACnet标准的规范范围。我们将应用进程中位于应用层内的部分称为应用实体(Application Entity)。换句话说,一个应用实体是应用进程中与BACnet通信功能相关的部分。一个应用程序(application program)通过应用编程接口API(Application Program Interface)与应用实体进行交互。编程接口不在BACnet中定义,但是在具体的实现中它总是一个函数、过程或子程序的调用。在上图中,阴影部分是应用进程位于BACnet应用层中的部分。
一个应用实体由两部分组成,分别是BACnet用户元素(User Element)和BACnet应用层服务元素ASE(Application Service Element)。BACnet应用层服务元素描述了应用服务或功能的集合。BACnet用户元素执行多种功能,并且支持本地的API,它描述每个应用服务中“服务过程(service procedure)”的实现。BACnet用户元素负责三个方面的事务,第一,保存事务处理的上下文信息,包括产生请求标识符(ID),记录哪个标识符是与哪个设备发出的应用服务响应(或对哪个设备的应用服务请求)相对应的;第二,保存超时重传机制所需的超时计时器;第三,将一个设备的行为映射成为BACnet对象。
,BACnet中两个对等应用进程间的信息交换,被表示成抽象服务原语的交换。这些服务原语用来传递一些特定的服务参数。本协议定义四种服务原语:请求(request)、指示(indication)、响应(response)和证实(confirm)。包含在这些原语中的信息,由本标准中定义的各种协议数据单元(PDU:Protocol Data Unit)传递。
有证实(confirmed)服务的符号标记是CONF_SERV,指明使用BACnet的有证实服务PDU。无证实(unconfirmed)服务的符号标记是UNCONF_SERV,指明使用BACnet的无证实服务PDU。分段确认(segment acknowledge)服务的符号标记是SEGMENT_ACK,指明使用BACnet的分段确认PDU。差错(error)服务的符号标记是ERROR,指明使用BACnet的差错PDU。拒绝(reject)服务的符号标记是REJECT,指明使用BACnet的拒绝PDU。中止(abort)服务的符号标记是ABORT,指明使用BACnet的中止PDU。
当应用程序需要同远程的应用进程通讯时,它所要进行的操作是通过API访问本地的BACnet用户元素。一些 API 参数,例如服务请求要发送到的设备的身份(地址)和协议控制信息,直接向下传递到网络或数据链路层。 其余的参数组成了一个应用程序服务原语,它从 BACnet 用户元素传递到 BACnet ASE。从概念上来讲,由应用层服务原语产生的应用层协议数据单元APDU(application protocol data unit),构成了网络层服务原语的数据部分,并通过网络层服务访问点NSAP(Network Service Access Point)下传到网络层。按照这样的方式,这个请求进一步下传到本地设备协议栈的以下各层。整个过程如下图所示。于是,报文就这样被传送到远程的设备,并在远程设备协议栈中逐级上传,最后指示原语看起来似乎是直接从远程的BACnet应用层服务元素上传到远程的BACnet用户元素。同样,任何从远程设备发回的响应,也是以这样的方式回传给请求设备的。

应用实体通过API与应用程序除了交换服务原语和服务参数之外,还交换接口控制信息ICI(interface control information)参数。ICI的具体内容取决于服务原语的类型。应用实体将接收到的ICI参数下传至下面各层,从而使得各层可以构建自己的PDU。而由应用实体回传给应用程序的ICI参数,则包含了下面各层从各自PDU中得到的信息。
通过API与各种服务原语交换信息的ICI参数包括:

  • “目的地址DA(destination_address)”:将要接收服务原语设备的地址。
  • “源地址SA(source_address)”:发送服务原语的设备的地址。
  • “网络优先级NP(network_priority)”
  • “期待回复数据DER(data_expecting_reply)”:一个逻辑值参数,用来指明某个服务是否需要一个回复的服务原语。

BACnet设备(BACnetDevice)是指任何一种支持用BACnet协议进行数字通信的真实的或者虚拟的设备。每一个BACnet设备必须且只能包含一个设备(Device)对象。每一个BACnet设备,都由一个NSAP唯一定位。在NASP中,包含了一个网络编号和一个MAC地址。
在多数情况下,一个BACnet设备就是一个物理设备。然而在某些情况下,一个单一的物理设备也可以形成多个“虚拟的” BACnet设备。

1.1 需确认的应用层服务

BACnet基于客户/服务器通信模型定义了需确认的应用层服务。客户方通过具体的服务请求实例向服务器方请求服务,服务器方通过响应请求来为客户方提供服务,这种关系如下图所示。在交互过程中,担当客户角色的BACnet 用户,称为请求方BACnet 用户;担当服务器角色的BACnet 用户,称为响应方BACnet 用户。
在这里插入图片描述
需确认应用层服务的具体过程如下:

  1. 由请求方BACnet用户发出一个需确认服务请求原语(CONF_SERV.request),形成请求PDU,发送给响应方BACnet用户。
  2. 当这个请求PDU到达响应方BACnet用户时,响应方BACnet用户则收到一个需确认服务指示原语(CONF_SERV.indication)
  3. 同时,由响应方BACnet用户发出的一个需确认服务响应原语(CONF_SERV.response),形成响应PDU回传给请求方BACnet用户。

1.2 无需确认的应用层服务

在无需确认的应用层服务中,只有“发送方BACnet用于”和“接收方BACnet用户”,BACnet标准用它们来定义无需确认应用层的服务过程。

2 BACnet报文的分段

为了实现长报文(长度大于通信网络、收/发设备所支持的长度)的传输,BACnet采取了应用层报文分段的机制来对报文进行分段。在BACnet中只有需确认请求(Confirmed-Request)和复杂确认(Complex-ACK)报文可能需要分段,因此分段还是BACnet的一个可选特性。报文分段这块内容其实不需要太多深入,如果用BACnet协议栈的话,协议栈在内部就包含这部分内容,而不需要你去单独的了解实现,但是在使用的过程中,如果遇到这方面的问题,需要一些皮毛性的知识去调试就可以了。

2.1 报文分段规则

2.1.1 APDU数据流的分段规则
  • 一个完整的报文尽可能作为一个APDU发送
  • 当一个完整的报文不可能作为一个APDU发送时,则应分段成最少个数的多个APDU发送
  • 对报文进行分段时,必须以字节作为最小的分割单位
2.1.2 APDU最大长度的确定

在BACnet中,APDU的最大长度不是固定的,其具体值是下列各长度值中的最小值:

  1. 设备所能发送的APDU的最大长度。这个长度一般与本地设备的缓冲区大小等因素有关
  2. BACnet互联网所能传输到远程设备的APDU的最大长度。这个长度一般由本地、远程、以及中间传输网络的数据链路所允许的网络层协议数据单元(NPDU)的最大长度所决定
  3. 远程设备所能接收的APDU的最大长度,其值不能小于50个字节
    如果报文的发送设备是请求方BACnet用户,也就是说要发送的APDU是BACnet需确认请求PDU(BACnet-Confirmed-Request-PDU) 或者是BACnet无需确认请求PDU ( BACnet-Unconfirmed-Request-PDU), 这时远程设备所能接受APDU的最大长度,由远程设备对象的最大APDU长度支持(Max_APDU_Length_Accepted)属性所确定。这个属性值可以通过ReadProperty服务来读取该属性值;也可以向远程设备发送一个Who-Is服务请求,使其回复一个I-Am服务响应,通过读取其中的通过读取其中的‘最大APDU长度支持(Max APDU Length Accepted)’参数来获得该属性值。
    如果报文的发送设备不是请求方BACnet用户,也就是说要发送的APDU是BACnet 复杂确认PDU(BACnet-Complex-ACK-PDU),这时远程设备所能接受的APDU的最大长度,由本报文所响应的那个BACnet需确认请求PDU中的‘最大APDU长度支持’参数所确定。
    上述的各种约束值最终决定了最大可传输长度的大小。需要注意的是,除非各个约束值都取最小值,否则最大可传输长度(maximum-transmittable-length)不会是一个常数。
2.1.3 可接受的最大分段数

在Confirmed-Request或者ComplexACK消息中可以传输的分段的最大值应该是以下情况中的最小值:

  1. 由于受到本地资源和本地事务限制而导致的可以在设备中能传输的分段的最大值
  2. 可以被远程对等设备接受的最大分段数

2.2 分段协议控制信息(PCI)

为了支持报文分段,BACnet 规定BACnet需要确认的PDU和BACnet复杂确认PDU的头部,包含两个布尔型参数,分别是‘报文分段(Segmented Message)’和‘后继(More Follows)’。
如果报文经编码处理后生成的APDU的长度,小于或等于2.1节所确定的最大可传输长度的值,则‘报文分段’和‘后继’两个参数都应设置为FALSE。
反之,如果报文经编码处理后生成的APDU的长度,大于2.1节所确定的最大可传输长度的值,则所有的分段中‘报文分段’参数都应设置为TRUE;并且除了最后一个分段,其它所有分段中的‘后继’参数也应设置为TRUE。
此外,由有需要确认报文或复杂确认报文的每个分段所生成APDU的头部,还有两个条件参数。第一个条件参数是‘序号(Sequence Number)’,这个八位二进制无符号整数被报文分段的发送方用来指定当前分段在整个报文分段序列中的位置。另一个条件参数是‘预设窗口尺寸(Proposed Window Size)’,它同样是一个八位二进制无符号整数。报文分段的发送方用该参数来指明,在收到一个分段确认(SegmentAck)报文之前,它预备发送的最大报文分段数。这两个参数在分段报文发送中的具体用法将在下一节中进一步说明。
起始分段中的‘序号’参数应设置为0。报文分段接收方在收到一个或一组报文后,会向发送方发送一个包含有‘序号’参数的分段确认PDU。序号的大小,等于最近一次成功接收到的分段的‘序号’参数值。这样,这个分段确认PDU不但用来请求发送方继续发送后一个或一组分段,还用来对先前一个分段或者是先前所有未被确认的分段(当Window Size值大于1时)的确认。
当然,在分段传输交互过程中的任何一方如果想中止交互过程,只要发送一个中止PDU(Abort-PDU)即可。

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

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

相关文章

分享77个PHP源码,总有一款适合您

PHP源码 分享77个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 77个PHP源码下载链接:https://pan.baidu.com/s/12hh-lhIVPL1bZw-d2sfVlQ?pwdvhqj 提取码&#xff…

selenium 操作已经打开的浏览器

有时通过selenium打开网站时,发现有些网站需要扫码登录,就很头疼,导致爬虫进展不下去。 如果继续想使用selenium进行数据抓取,下一步应该怎么办呢? 步骤一:创建文件夹 在电脑的D盘或者F盘或者合适的盘创建…

《Python数据分析基础教程:NumPy学习指南:第二版》读书笔记

内容 主要介绍了NumPy库中的函数。 组成方式 用非常零散的知识点串联成章节。 内容摘要 极简地展示了章节中所运用的函数。 第一章 arrange函数创建NumPy数组。 第二章 NumPy特性 在NumPy中,复数的虚部是用j表示的。如果数组中包含复数元素,则…

VMware vSphere 中 Clone 与 Template 的区别

VMware vSphere 中 Clone 与 Template 的区别 Clone(克隆)Template(模板)克隆在克隆过程中为正在运行的虚拟机创建一个精确的副本模板作为具有根据组织标准预先定义的配置的虚拟机的基线映像。克隆虚拟机使用相同的配置和安装的软…

【C语言初阶】指针

文章目录1.指针是什么2.指针和指针类型2.1指针的解引用2.1指针类型的意义3.野指针3.1野指针成因3.2如何规避野指针4.指针运算4.1指针-整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针数组1.指针是什么 指针理解的2个要点: 指针是内存中一个最小单元…

【GD32F427开发板试用】+使用USBFS轻松实现HID键盘应用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:不锈钢铁侠 前言 最近有项目需要用到键盘自动输入功能,提升工作效率。故使用该开发板实现自定义输入内容并通过按键控制自动通过u…

STM32——外部中断

目录 外部中断简述 什么是外部中断 传统单片机与新型单片机外部中断区别 STM32外部中断请求 STM32中断线与IO口的对应 STM32 中断服务函数 外部中断与中断服务函数的对应 中断服务函数列表 STM32外部中断程序编写 常用的库函数 外部中断的一般配置步骤 外部中断简…

【ArcGIS微课1000例】0058:波段合成(CompositeBands)工具的使用

波段合成工具常见于遥感软件,例如Envi和Erdas等,用于将多个单波段数据合成为一个多波段数据集,在ArcGIS中也提供了波段合成的工具,使用灵活方便。 文章目录 一、波段合成工具介绍二、波段合成工具案例1. 输出Esri Grid格式2. 输出tif格式3. 输出jgp格式4. 输出其它格式一、…

sqlite 使用distinct时组合索引可能不是你想的那样

目录先来唠唠嗑吧~那一探究竟吧!表结构及索引信息我的查询场景到底命中什么索引了?简单小结下~先来唠唠嗑吧~ 在使用sqlite作为词条数据库查询数据,发现有的sql执行很快,有的sql执行很慢,你以为是没有走索引吗&#x…

深入浅出进程控制

文章目录进程控制浅谈fork写时拷贝fork调用失败的原因进程终止进程退出的场景进程常见退出方法查看进程退出码echo $? :查看进程退出码exit和_exit进程等待进程等待的方法waitwaitpid获取子进程status宏定义查看进程是否正常退出,查看退出码再谈僵尸进程浅谈阻塞等…

基于.Net Core开发的支付SDK,简化支付功能开发

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 在我们做项目中,不管是电商系统、外卖系统、还是上门维修系统等等,都需要支付功能,这就需要我们与第三方支付平台进行对接,但是第三方平台文档,往往都存…

05语法分析——自下而上分析

文章目录一、自下而上分析基本问题二、算符优先分析构造FIRSTVT(P)的算法构造LASTVT(P)的算法构造优先表的算法三、LR分析法1.LR(0)构造LR(0)项目集规范族构造识别活前缀的DFA构造LR(0)分析表2.SLRSLR解决冲突办法SLR(1)分析表的构造算法3.LR(1)【规范LR】LR(1)项目集I的闭包状…

【MySQL基础】运算符及相关函数详解

序号系列文章3【MySQL基础】MySQL基本数据类型4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解文章目录前言MySQL运算符1,算术运算符1.1,算术运算符的基本使用1.2,常用数学函数的基本使用2…

iOS:OpenGLES 实验室之2D篇 第一弹 の 智能弹幕

本文字数:3046字预计阅读时间:15 分钟iOS:OpenGLES 实验室之2D篇 第一弹 の 智能弹幕笔者之前发表的音视频文章,有图像的处理,音频的重采样等等,都属于入门级别。通过阅读它们,读者能对音视频有…

【复习 自用】JavaScript知识汇总(DOM)

注:之前学过JavaScript,本贴仅用于复习(自用),建议没基础的朋友先学基础。会混入typescript! 更新中~~~~~ Dom核心内容 创建节点 ① document.write() 是直接将内容写入页面的内容流,但是文档流执行完毕&#xff0c…

云原生技能树-docker caontainer 操作

运行 一个Docker镜像(image)运行后,就是一个容器实例,称为container 以镜像hello-world为例,启动容器: docker container run -it hello-world 可以看到输出了Hello World 信息: 以下描述错误的是? 答…

数字逻辑理论——从卡诺图到门电路

卡诺图化简 卡诺图化简 第一步:在卡诺图中圈出相邻为1的小方格(方格的个数为2m2^{m}2m),圈里面的1越多越好,并且这个小方格可以重复使用。 第二步:上一步中的方格或者圈出来的方框——每一个都代表一个与…

Linux软件安装及管理程序

Linux安装及管理程序Linux软件安装及管理程序一、Linux应用程序基础二、RPM软件包管理工具2.1、RPM介绍2.2、RPM命令三、源码编译安装四、yum安装Linux软件安装及管理程序 一、Linux应用程序基础 应用程序与系统命令的关系 角色系统命令应用程序文件位置般在/bin和/sbin目录…

linux系统中实现智能家居的基本方法

大家好,今天主要和大家分享一下,智能家居物联网的基本实现与操作方法。 目录 第一:智能家居基本简介 第二:测试WIFI模块功能 第三:智能家居物联UI界面开发 第四:核心代码的具体实现 第五:最…

【阅读笔记】《重构》 第三四章

第三章 代码的味道 DuplicatedCode(重复代码) 同一个类的两个函数含有相同的表达式两个互为兄弟的子类含有相同表达式两个毫不相干的类出现重复代码 LongMethod(过长函数) 函数不宜过长,函数越长越难理解如果想利用单个类做太多事情,其内往往就会出现…