分析BACnet协议栈1

合集下载

BACnet协议的体系结构

BACnet协议的体系结构

B AC n e t协议的体系结构Revised by Petrel at 2021B AC n e t 协议的体系结构 国际标准化组织在制定计算机网络通讯协议标准时定义了一个模型,称为开放系统互联参考模型(OSI )(ISO7498)。

模型的目的是解决计算机与计算机之间普遍的通信问题。

在这个模型中,将计算机通信这样一个复杂的问题分解成7个小的、容易解决的子问题,每个子问题只与某些通信功能相关,并且把这些子问题称为协议体系结构的一层,整个模型是一个七层的体系结构。

在图4-1中给出这七层的体系结构图。

层。

信的单个计算机之间可能相距很远,因此报文要通过一系列中间点才能到达。

而这些中间点相应地可能需要实现路由选择功能、某种解析功能,以及复杂的同步和差错恢复功能。

实现OSI 模型协议所需的费用较高,在绝大部分楼宇自动控制系统中,并不需要实现OSI 模型的所有内容。

不过只从OSI 的功能性方面来考虑,经过简化,OSI 模型仍然是楼宇自动控制协议的一个很好的参考。

如果只选择OSI 模型中需要的层次,形成一个简化的模型,作为楼宇自动控制系统的协议体系结构,就可以减少报文的长度,降低通信处理的开销,并且也满足楼宇自动控制系统的需要。

这个简化的体系结构降低了楼宇自动控制工业的生产成本,同时处理器的大批量生产、局域网技术的发展,也为过程控制和办公自动化工业的发展起到了推动作用。

另一方面,可以充分利用现有的、易用的、应用广泛的局域网技术,如以太网、ARCNET 和LonTalk 。

这样不但可以降低成本,而且也有利于提高性能,为系统集成开辟新的途径。

用户1用户2 图4-1开放系统互联基本参考模型4.1BACnet 简化的体系结构BACnet 建立在包含四个层次的简化分层体系结构上,这四层相当于OSI 模型中的物理层、数据链路层、网络层和应用层,如图4-2所示。

BACnet 标准定义了自己的应用层和简单的网络层,对于其数据链路层和物理层,提供了以下五种选择方案。

《BACnet协议》课件

《BACnet协议》课件

02 BACnet协议的组成和原理
BACnet协议的组成结构
BACnet对象
定义了建筑物中各种 物理设备的抽象表示 ,如传感器、执行器 等。
服务
提供了对象之间通信 所需的各种操作,如 读取、写入、事件通 知等。
应用层
包含了实现BACnet 协议所需的各种应用 层服务,如APDU( 应用数据单元)的封 装与解析等。
BACnet协议的发展历程
总结词
BACnet协议经历了多个版本的发展,从最初的BACnet 1.0到现在的BACnet 2021。
详细描述
BACnet协议的发展历程可以追溯到1990年代初期,经过多年的发展,BACnet协议不断升级和完善。从最初的 BACnet 1.0版本,到现在的BACnet 2021版本,BACnet协议的功能和性能得到了极大的提升。随着物联网技术 的发展,BACnet协议将继续发挥重要作用,推动建筑物自动化的普及和发展。
详细描述
BACnet协议是一种应用于建筑物自动化的通信协议,旨在实现楼宇自控系统中 的设备之间的数据交换和互操作性。它具有开放性、互操作性和标准化的特点, 使得不同厂商生产的设备能够相互通信,实现信息共享和协同工作。
BACnet协议的应用场景
总结词
BACnet协议广泛应用于楼宇自控系统、 智能建筑、智能家居等领域。
安全性增强
随着网络安全威胁的增加,BACnet协 议将更加注重安全性设计和实施,包 括数据加密、访问控制和安全审计等 方面的技术发展。
BACnet协议的应用前景和趋势
智能建筑集成管理
随着智能建筑的发展,BACnet协议将在建筑集成管理领 域发挥更大的作用,实现楼宇自控、安防监控、能源管理 等多种系统的集成和统一管理。

BACnet协议原理

BACnet协议原理

BACnet协议原理BACnet(Building Automation and Control Networks)是一种用于建筑自动化和控制网络的通信协议。

本文将详细介绍BACnet协议的原理、功能及其在建筑自动化中的应用。

一、BACnet协议概述BACnet协议是一种开放的通信协议,旨在通过各种设备和系统之间的数据交换来实现建筑物自动化与控制管理。

它提供了一种标准化的方式来集成不同的建筑设备和系统,如照明、空调、能源管理等。

BACnet协议基于ISO/OSI模型的应用层,使用标准的网络传输层协议(如TCP/IP或UDP)进行数据传输。

二、BACnet协议的工作原理BACnet协议采用了分布式结构,其中包括多个网络设备和控制器。

这些设备通过网络进行通信,并共享数据以实现对建筑设备的监控和控制。

下面将介绍BACnet协议的几个重要原理:1. 对象模型:BACnet协议使用了一种称为BACnet对象模型的结构,以表示和组织建筑设备和系统的数据。

每个对象都有唯一的标识符和一组属性,用于描述设备的特定方面。

例如,一个空调对象可以有属性表示温度、湿度等。

这种对象模型的使用使得不同设备和系统能够互相理解和交互。

2. 通信机制:BACnet协议使用了不同的通信机制来实现设备之间的数据交换。

其中包括广播、点对点和多播通信。

广播通信用于向整个网络发送数据,点对点通信用于在两个特定设备之间进行通信,而多播通信则用于向一组设备发送数据。

这些通信机制的使用使得BACnet网络可以高效地传输数据。

3. 层级结构:BACnet网络采用了层级结构,其中包括多个网关和子网。

网关用于连接不同的子网,以便实现跨网络的通信。

每个子网可以包含多个设备和控制器,使得建筑自动化系统可以灵活地扩展和管理。

三、BACnet协议的功能BACnet协议提供了丰富的功能,以支持建筑自动化与控制管理的需求。

以下是BACnet协议的一些主要功能:1. 监控和控制:BACnet协议允许对建筑设备进行实时监控和控制。

bacnet协议

bacnet协议

bacnet协议BACnet(建筑自动控制网络)是一个通信协议,用于建筑自动控制系统中的设备之间的数据交换和通信。

它是一种开放的标准协议,最初由美国建筑自动化协会(ASHRAE)于1995年开发,并成为美国国家标准(ANSI / ASHRAE 135-1995)。

BACnet协议的目标是促进建筑设备的互操作性和通信。

BACnet协议采用面向对象的方法,设备以对象的方式进行表示和交互。

每个BACnet设备都有一个唯一的设备标识符(Device ID),用于标识设备在网络中的位置。

设备可以是传感器、执行器、控制器或其他类型的设备。

BACnet协议定义了一组标准对象类型,如输入、输出、变量和日志等。

每个对象都有属性,用于描述对象的特性和状态。

BACnet协议支持多种通信媒介,包括以太网、RS-485、LonWorks和其他串行接口。

设备可以通过这些媒介之一进行通信,并使用BACnet协议进行数据交换。

BACnet协议定义了一组通信服务,包括读取属性、写入属性、订阅属性和报警等。

这些服务允许设备之间进行数据的读取、写入和通知。

BACnet协议还定义了一套通信模型,用于描述设备之间的交互方式。

其中最常见的模型是主从模型,其中一个设备作为主节点,其他设备作为从节点。

主节点可以向从节点发送命令,并接收从节点的响应。

这种通信模型允许设备之间进行数据的传递和控制。

BACnet协议还支持安全通信,以保证通信的机密性和完整性。

通过使用加密技术和数字签名,设备可以确保通信过程中数据的安全性。

此外,BACnet协议还提供了一套权限管理机制,用于控制设备之间的访问和操作。

BACnet协议在建筑自动控制系统中得到了广泛应用。

它可以与各种设备和系统集成,包括暖通空调系统、照明系统、安全系统和能源管理系统等。

通过使用BACnet协议,建筑自动控制系统的设备可以相互通信和协调工作,实现对建筑的智能化控制和管理。

总之,BACnet协议是一个用于建筑自动控制系统的通信协议。

bacnet协议

bacnet协议

bacnet协议BACnet协议。

BACnet(Building Automation and Control Networks)是一种用于建筑自动化和控制网络的通信协议,它是一种开放的、通用的协议,被广泛应用于建筑系统中,包括供暖、通风、空调、照明和安全等方面。

BACnet协议的出现,使得不同厂家生产的设备可以实现互联互通,为建筑系统的集成提供了可能。

BACnet协议的特点之一是其开放性和通用性。

它是一种开放的协议,任何厂家都可以基于BACnet协议开发符合标准的设备和系统。

这种开放性使得用户可以更加灵活地选择设备和系统,而不用受限于某一特定厂家的产品。

同时,BACnet 协议的通用性也使得不同类型的设备可以通过统一的协议进行通信,实现数据的共享和交互,从而提高了建筑系统的整体效率。

另一个重要特点是BACnet协议的灵活性和可扩展性。

建筑系统的需求经常会发生变化,新的设备和功能需要不断地被集成进来。

BACnet协议可以满足这种需求,它支持多种不同的通信方式和网络拓扑结构,可以适应不同规模和复杂度的建筑系统。

同时,BACnet协议也支持多种不同的数据类型和对象类型,可以灵活地扩展和定制,以满足特定的应用需求。

此外,BACnet协议还具有高效性和可靠性。

建筑系统对于数据的实时性和稳定性要求较高,BACnet协议采用了一系列的通信机制和协议规范,以确保数据的及时传输和可靠交换。

同时,BACnet协议还支持数据的优先级和访问控制,可以保障重要数据的安全和可靠性。

总的来说,BACnet协议作为建筑自动化和控制网络的通信标准,具有开放、通用、灵活、可扩展、高效和可靠等特点,为建筑系统的集成和管理提供了重要的技术支持。

随着智能建筑和物联网技术的发展,BACnet协议将会发挥越来越重要的作用,促进建筑系统的智能化和互联互通,为用户提供更加舒适、安全、高效的建筑环境。

bacnet协议

bacnet协议

bacnet协议BACnet(Building Automation and Control Network)协议是一种广泛应用于建筑自动化控制系统(BAS)的通信协议。

该协议被设计用于各种设备间的数据传输和通信,以实现建筑的智能化、高效化和节能化。

BACnet协议已经被国际标准化组织(ISO)和欧洲计算机制造商协会(ECMA)确定为ISO 16484-5和ECMA-167标准。

BACnet协议的优点在于其开放性和灵活性,它允许不同品牌、不同类型的设备之间进行互联和通信。

该协议支持多种通信技术和传输媒介,如以太网、RS-485、无线电等,并提供多个数据传输方式和协议,如UDP、TCP、IP、SNMP等,以满足不同应用环境的需求。

BACnet协议的数据结构非常灵活,可以支持不同类型的数据,如模拟量、数字量、字符型、日期型等,还可以支持自定义数据类型,以满足各种不同的需求。

此外,该协议还提供了不同级别的安全机制,如访问控制、加密通信等,以保护系统的安全性。

BACnet协议也提供了丰富的控制功能,如遥测、遥调、跟踪、趋势分析、警报、事件日志等。

这些功能可以帮助建筑管理人员实时监控和管理建筑系统,发现问题,并及时采取措施。

BACnet协议的应用广泛,如商业建筑、工业厂房、医院、学校、酒店等各种建筑类型都可以使用该协议来实现自动化控制。

在商业建筑中,BACnet协议被广泛应用于空调系统、照明系统、安防系统、电力系统等。

在工业厂房中,BACnet协议可以用于自动化控制和监控生产线、工艺流程、设备运行等。

在医院和学校中,BACnet协议可以用于自动化控制和监控空调、温湿度、照明、安全等系统。

总之,BACnet协议是一种功能强大、灵活性高的建筑自动化控制系统通信协议。

它开放性强、数据结构灵活、安全可靠、控制功能丰富,可以满足各种不同应用环境下的需求,帮助建筑管理者实现建筑的智能化、高效化和节能化。

BACnet协议解析楼宇自动化与控制网络的通信协议详解

BACnet协议解析楼宇自动化与控制网络的通信协议详解

BACnet协议解析楼宇自动化与控制网络的通信协议详解楼宇自动化与控制网络在现代建筑中扮演着重要的角色。

为了实现楼宇设备之间的互联和数据交换,人们使用了各种通信协议。

其中,BACnet协议作为一种通用的开放式标准,被广泛应用于楼宇自动化系统中。

本文将对BACnet协议进行详细解析,介绍其在楼宇自动化与控制网络中的作用和特点。

一、BACnet协议概述BACnet(Building Automation and Control Networks)是楼宇自动化与控制网络的通信协议,由美国国家标准协会(ANSI)制定。

它为楼宇设备提供了一个统一的通信接口,实现了设备之间的互联和数据交换。

BACnet协议支持多种通信介质,如以太网、RS-485等,可以灵活适配各种网络环境和设备类型。

二、BACnet协议结构BACnet协议采用分层结构,共分为两个主要层级:物理层和应用层。

物理层负责传输数据,而应用层定义了通信协议的规则和数据格式。

1. 物理层BACnet协议支持多种物理层介质,包括以太网、RS-485等。

不同的物理层介质使用不同的传输速率和编码方式,以满足不同的通信需求。

物理层的选择要根据具体的楼宇自动化系统和设备来确定。

2. 应用层BACnet协议的应用层定义了通信协议的规则和数据格式。

它包括了对象模型、通信服务和网络管理等方面的内容。

- 对象模型:BACnet协议使用对象模型来表示楼宇设备和系统中的各种对象,如传感器、执行器、控制器等。

每个对象都具有一组属性,可以通过读写这些属性来实现对对象的控制和监测。

- 通信服务:BACnet协议定义了一系列的通信服务,包括数据读写、报警通知、事件订阅等。

这些通信服务提供了实时的数据交换和设备之间的相互作用。

- 网络管理:BACnet协议支持网络发现、设备配置和故障诊断等网络管理功能。

通过这些功能,用户可以方便地管理和维护整个楼宇自动化系统。

三、BACnet协议特点BACnet协议具有以下几个特点,使其在楼宇自动化与控制网络中得到广泛应用。

BACnet介绍解读

BACnet介绍解读
3
2009-11-01
BACnet的协议栈和数据流
应用程序 BACnet服务请求 应用层BACnet请求 应 用 层 与服务有关的参数 与网络层、数据链 路层、MAC层相关 的参数 APCI 与服务相关的数据块



由应用层服务原语产 生的应用层协议数据 单元(APDU),构成 了网络层服务原语的 数据部分,并通过网 络层服务访问点下传 到网络层; 同样,这个请求将进 一步下传到本地设备 协议栈的以下各层; PDU:协议数据单元
BACnet应用层
2009-11-01
5
BACnet应用层规范

BACnet的应用层协议要解决三个问题:


向应用程序提供通信服务的规范, 与下层协议进行信息交换的规范 与对等的远程应用层实体交互的规范

BACnet应用层主要有两个功能:


定义楼宇自控设备的信息模型——BACnet对象模型 定义面向应用的通信服务
2009-11-01
6
BACnet应用进程模型

应用程序 API 应用进程
应 用 层
BACnet用户单元 BACnet ASE
应用实体

NSAP
BACnet应用进程模型

应用进程:为了实现某个特定的 应用(例如,节点设备向一个远 端的温度传感器设备请求当前温 度值)所需要的进行信息处理的 一组方法。一般来说,这是一组 计算机软件 应用进程分为两部分,一部分专 门进行信息处理,不涉及通信功 能,这部分称为应用程序。另一 部分处理BACnet通信事务,称为 应用实体。
为完成诸如日期设置等特定操作而向多设备的多对象写多值
其属性表示设备支持的对象和服务以及设备商和固件版本 描述可能处于错误状态的事件(例如“输入超出范围”),或者其它设备需要的报警。该对象可直接通知一个设备, 也可用通知类(Notification Class)对象通知多对象 允许读写访问设备支持的数据文件 提供在一个读单一操作下访问多对象的多属性 提供标准化地访问一个“控制环” 表述一个多状态处理程序的状况,如冰箱的开、关和除霜循环等 表述一个多状态处理程序的期望状态,如冰箱的开始冷却时间、开始除霜时间等 包含一个设备列表,其中包括如果一个事件登记对象确定有一个警告或报警报文需要发送则将要送给的那些设备 允许设备中的一个程序开始,停止,装载,卸载,以及报告程序当前状态等 定义一个按周期的操作时间表
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从现在开始分析BACnet协议栈了,版本号是bacnet-stack-0.7.1。

目录是bacnet-stack-0.7.1\ports\linux\rs485.crs485.c文件主要要解决在物理层发送和接收数据的作用。

不同的开发板需要移植该文件。

#include <errno.h>#include <stddef.h>#include <stdint.h>#include <stdbool.h>#include <stdio.h>#include <stdlib.h>#include <string.h>/* Linux includes */#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <unistd.h>#include <sched.h>/* Local includes */#include "mstp.h"#include "rs485.h"#include "fifo.h"#include <sys/select.h>#include <sys/time.h>/* Posix serial programming reference:/~mike/serial/serial.html *//* Use ionice wrapper to improve serial performance:$ sudo ionice -c 1 -n 0 ./bin/bacserv 12345*//* handle returned from open() */static int RS485_Handle = -1;/* baudrate settings are defined in <asm/termbits.h>, which isincluded by <termios.h> */static unsigned int RS485_Baud = B38400;//波特率选择38400 bps/* serial port name, /dev/ttyS0,/dev/ttyUSB0 for USB->RS485 from B&B Electronics USOPTL4 */static char *RS485_Port_Name = "/dev/ttyUSB0"; /*系统默认是通过USB转485的,根据需要设置,若你的开发板用485接口,则用static char *RS485_Port_Name = "/dev/ttyS0";代替*//* some terminal I/O have RS-485 specific functionality */#ifndef RS485MOD#define RS485MOD 0#endif/* serial I/O settings */static struct termios RS485_oldtio;/* Ring buffer for incoming bytes, in order to speed up the receiving. */ static FIFO_BUFFER Rx_FIFO;/* buffer size needs to be a power of 2 */static uint8_t Rx_Buffer[4096];#define _POSIX_SOURCE 1 /* POSIX compliant source *//********************************************************************** DESCRIPTION: Configures the interface name* RETURN: none* ALGORITHM: none* NOTES: none*********************************************************************/void RS485_Set_Interface(char *ifname){/* note: expects a constant char, or char from the heap */if (ifname) {RS485_Port_Name = ifname;}}/********************************************************************** DESCRIPTION: Returns the interface name* RETURN: none* ALGORITHM: none* NOTES: none*********************************************************************/const char *RS485_Interface(void){return RS485_Port_Name;}/***************************************************************************** DESCRIPTION: Returns the baud rate that we are currently running at * RETURN: none* ALGORITHM: none* NOTES: none*****************************************************************************/ uint32_t RS485_Get_Baud_Rate(void){uint32_t baud = 0;switch (RS485_Baud) {case B0:baud = 0;break;case B50:baud = 50;break;case B75:baud = 75;break;case B110:baud = 110;break;case B134:baud = 134;break;case B150:baud = 150;break;case B200:baud = 200;break;case B300:baud = 300;break;case B600:baud = 600;break;case B1200:baud = 1200;break;case B1800:baud = 1800;break;case B2400:baud = 2400;break;case B4800:baud = 4800;break;case B9600:baud = 9600;break;case B19200:baud = 19200;break;case B38400:baud = 38400;break;case B57600:baud = 57600;break;case B115200:baud = 115200;break;case B230400:baud = 230400;break;default:baud = 9600;}return baud;}/**************************************************************************** * DESCRIPTION: Sets the baud rate for the chip USART* RETURN: none* ALGORITHM: none* NOTES: none*****************************************************************************/ bool RS485_Set_Baud_Rate(uint32_t baud){bool valid = true;switch (baud) {case 0:RS485_Baud = B0;break;case 50:RS485_Baud = B50;break;case 75:RS485_Baud = B75;break;case 110:RS485_Baud = B110;break;case 134:RS485_Baud = B134;break;case 150:RS485_Baud = B150;break;case 200:RS485_Baud = B200; break;case 300:RS485_Baud = B300;break;case 600:RS485_Baud = B600;break;case 1200:RS485_Baud = B1200;break;case 1800:RS485_Baud = B1800;break;case 2400:RS485_Baud = B2400;break;case 4800:RS485_Baud = B4800;break;case 9600:RS485_Baud = B9600;break;case 19200:RS485_Baud = B19200;break;case 38400:RS485_Baud = B38400;break;case 57600:RS485_Baud = B57600;break;case 115200:RS485_Baud = B115200;break;case 230400:RS485_Baud = B230400;break;default:valid = false;break;}if (valid) {/* FIXME: store the baud rate */}return valid;}/***************************************************************************** DESCRIPTION: Transmit a frame on the wire* RETURN: none* ALGORITHM: none* NOTES: none*****************************************************************************/void RS485_Send_Frame(volatile struct mstp_port_struct_t *mstp_port, /* port specific data */uint8_t * buffer, /* frame to send (up to 501 bytes of data) */uint16_t nbytes){ /* number of bytes of data (up to 501) */uint32_t turnaround_time = Tturnaround * 1000;uint32_t baud = RS485_Get_Baud_Rate();ssize_t written = 0;int greska;/* sleeping for turnaround time is necessary to give other devicestime to change from sending to receiving state. */usleep(turnaround_time / baud); //至少要等待Tturnaround时间才启动RS485缓冲器发送/*On success, the number of bytes written are returned (zero indicatesnothing was written). On error, -1 is returned, and errno is setappropriately. If count is zero and the file descriptor refers to aregular file, 0 will be returned without causing any other effect. Fora special file, the results are not portable.*/written = write(RS485_Handle, buffer, nbytes); //RS485_Handle初始时是为-1,当发出open操作时应该是个正整数,而write函数的原型是(fd,buf,n)greska = errno;if (written <= 0) {printf("write error: %s\n", strerror(greska));} else {/* wait until all output has been transmitted. */tcdrain(RS485_Handle); //Linux中的传输等待函数}/* tcdrain(RS485_Handle); *//* per MSTP spec, sort of */if (mstp_port) {mstp_port->SilenceTimerReset();}return;}/***************************************************************************** DESCRIPTION: Get a byte of receive data* RETURN: none* ALGORITHM: none* NOTES: none*****************************************************************************/RS485_Check_UART_Data函数分别检查ReceiveError、DataAvailable。

相关文档
最新文档