IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> bacnet协议对接 -> 正文阅读

[嵌入式]bacnet协议对接

?本文章为原创,转载请注明出处!

登录平台:IOTOS?爱投斯物联中台

账号:iotos_test ? ?密码:iotos123

代码地址:IOTOSDK-Python: IOTOS Python版本SDK,自带原生接口和采集引擎 (gitee.com)

目录

前言

驱动目的

适用范围

使用示例

驱动代码

驱动解析


  • 前言

? ? ? ??BACnet是用于智能建筑的通信协议,是国标标准化组织(ISO)、美国国家标准协会(ANSI)及美国采暖、制冷与空调工程师学会(ASHRAE)定义的通信协议。BACnet针对智能建筑及控制系统的应用所设计的通信,可用在暖通空调系统(HVAC,包括暖气、通风、空气调节),也可以用在照明控制、门禁系统、火警侦测系统及其相关的设备。优点在于能降低维护系统所需成本并且安装比一般工业通信协议更为简易,而且提供有五种业界常用的标准协议,此可防止设备供应商及系统业者的垄断,也因此未来系统扩展性与兼容性大为增加。

  • 驱动目的

? ? ? ? 将BACnet协议设备的数据拿到并上传至云上

  • 适用范围

? ? ? ? BACnet协议设备

  • 使用示例

  • 进入爱投斯中台,账号为iotos_test,密码为iotos123,在【创建模板】->【我的模板】,创建模板,填写相关信息,配置需要的参数

  • 创建网关

  • 填好网关名称后点击确认?

  • ?创建设备示例点击【系统设备】 -> 【通信网关】 -> 【设备实例】->【创建设备】?

  • ?填写【设备名称】、选择刚刚创建的【模板驱动】和【通信网关】。

  • 创建数据点,点击【系统设备】 -> 【通信网关】 -> 【设备实例】 -> 【数据点】,并在【设备实例】下拉列表选择刚刚创建的设备实例

  • ?点击右边的创建数据点,填写名称?

  • 并在高级配置中配置数据点的相关标志,objectName类型的数据在私有属性“objectName”中填入其名称,并在“num”属性中加入序号;可以用于修改的数据点则在私有属性“private”中填入“write”,并用"num"表示需要修改的objectName类型数据点的序号,例如:

  • ?在【系统设备】 -> 【通信网关】中找到刚才创建的网关,点击【高级】?

?

  • ?开启云网关,密码为账号密码

  • ?点击 【系统设备】 -> 【通信网关】 -> 【设备实例】->【数据点】,选择刚才创建的设备实例

?

  • 即可查看数据已经上报成功??

  • 点击可以用于下发的数据点旁边的下发按钮,设置需要下发的值,点击下发,即可看到设备的数据已经改变

?

?

  • 驱动代码

#coding=utf-8
import sys
sys.path.append("..")
import BAC0
import time
from driver import *

class Bacnet(IOTOSDriverI):
    def InitComm(self,attrs):
        self.setPauseCollect(False)
        self.setCollectingOneCircle=True
        self.online(True)

        #建立连接并且在通路里搜索bacnet设备的ip和设备id
        try:
            self.bacnet=BAC0.connect()
            self.bacnet.whois()

            # 搜索局域网内的bacnet协议设备并且打印出来
            for each in self.bacnet.discoveredDevices:
                deviceName = (self.bacnet.read('%s device %s objectName' % (each[0], each[1])))
                self.deviceAddr = each[0]
                self.debug('Found device : %s at address %s' % (deviceName, self.deviceAddr))
                # 打印设备地址为deviceAddr 的objectList property 前十个
                read_pro = self.deviceAddr + ' device 3 objectList'
                self.debug(self.bacnet.read(read_pro)[:10])

        except Exception as e:
            self.bacnet.disconnect()

    def Collecting(self,dataId):
        try:
            cfgtmp = self.data2attrs[dataId]['config']
            #过滤掉非采集点
            if cfgtmp["param"] == "":
                return ()

            # 过滤采集点
            if 'disabled' in cfgtmp and cfgtmp['disabled'] == True:
                return ()
            else:
                self.debug(self.name(dataId))

            #获取用于数据下发的点
            if  'private' in cfgtmp['param'] and cfgtmp['param']['private']=='write' and 'num' in cfgtmp['param']:
                if "memoryvalue" not in self.data2attrs[dataId]:
                    return ('请下发',)
                else:
                    return (self.data2attrs[dataId]["memoryvalue"],)

            #上传数据点
            if 'objectName' in cfgtmp['param'] and 'num' in cfgtmp['param']:
                data_val = self.deviceAddr + ' ' + str(cfgtmp['param']['objectName'])+' '+str(cfgtmp['param']['num'])+' '+'objectName description presentValue units'
                self.debug(data_val)
                #读取bacnet设备中属性的值
                data = self.bacnet.readMultiple(data_val)
                return (str(data[2]),)

        except Exception as e:
            # 连接会一定时间后断开,需要再次开启
            self.bacnet.disconnect()
            self.bacnet = BAC0.connect()
            self.bacnet.whois()
            return ()

    def Event_setData(self, dataId, value):
        #更改bacnet里面属性的值,一般只能是analoValue属性
        if 'private' in self.data2attrs[dataId]['config']['param']:
            if self.data2attrs[dataId]['config']['param']['private']== 'write':
                data_wri=self.deviceAddr+' '+'analogValue'+' '+ str(self.data2attrs[dataId]['config']['param']['num']) +' presentValue ' + str(value)
                self.debug(data_wri)
                self.bacnet.write(data_wri)
                self.setValue(self.name(dataId), value)

        return json.dumps({'code': 0, 'msg': '', 'data': ''})
  • 驱动解析

  • ?运行环境为python3,需要先安装BAC0包用于bacnet的通讯,首先先导入驱动所需的包
#coding=utf-8
import sys
sys.path.append("..")
import BAC0
import time
from driver import *
  • ?首先,先进行驱动的初始化,在初始化中建立bacnet连接并且在路由里面搜索bacnet设备的ip和设备的id,用于后续拿到设备的数据
class Bacnet(IOTOSDriverI):
    def InitComm(self,attrs):
        self.setPauseCollect(False)
        self.setCollectingOneCircle=True
        self.online(True)

        #建立连接并且在通路里搜索bacnet设备的ip和设备id
        try:
            self.bacnet=BAC0.connect()
            self.bacnet.whois()

            # 搜索局域网内的bacnet协议设备并且打印出来
            for each in self.bacnet.discoveredDevices:
                deviceName = (self.bacnet.read('%s device %s objectName' % (each[0], each[1])))
                self.deviceAddr = each[0]
                self.debug('Found device : %s at address %s' % (deviceName, self.deviceAddr))
                # 打印设备地址为deviceAddr 的objectList property 前十个
                read_pro = self.deviceAddr + ' device 3 objectList'
                self.debug(self.bacnet.read(read_pro)[:10])

        except Exception as e:
            self.bacnet.disconnect()
  • 进行数据的采集,首先先利用数据点里面的参数过滤非采集点和采集点,获取用于数据下发的点和数据上传的点,并通过bacnet协议获取设备的值进行上报
    def Collecting(self,dataId):
        try:
            cfgtmp = self.data2attrs[dataId]['config']
            #过滤掉非采集点
            if cfgtmp["param"] == "":
                return ()

            # 过滤采集点
            if 'disabled' in cfgtmp and cfgtmp['disabled'] == True:
                return ()
            else:
                self.debug(self.name(dataId))

            #获取用于数据下发的点
            if  'private' in cfgtmp['param'] and cfgtmp['param']['private']=='write' and 'num' in cfgtmp['param']:
                if "memoryvalue" not in self.data2attrs[dataId]:
                    return ('请下发',)
                else:
                    return (self.data2attrs[dataId]["memoryvalue"],)

            #上传数据点
            if 'objectName' in cfgtmp['param'] and 'num' in cfgtmp['param']:
                data_val = self.deviceAddr + ' ' + str(cfgtmp['param']['objectName'])+' '+str(cfgtmp['param']['num'])+' '+'objectName description presentValue units'
                self.debug(data_val)
                #读取bacnet设备中属性的值
                data = self.bacnet.readMultiple(data_val)
                return (str(data[2]),)

        except Exception as e:
            # 连接会一定时间后断开,需要再次开启
            self.bacnet.disconnect()
            self.bacnet = BAC0.connect()
            self.bacnet.whois()
            return ()
  • ?数据下发。利用私有属性‘private’判断需要修改的数据点的属性,对数据点进行下发时就会直接对设备的数据进行修改
    def Event_setData(self, dataId, value):
        #更改bacnet里面属性的值,一般只能是analoValue属性
        if 'private' in self.data2attrs[dataId]['config']['param']:
            if self.data2attrs[dataId]['config']['param']['private']== 'write':
                data_wri=self.deviceAddr+' '+'analogValue'+' '+ str(self.data2attrs[dataId]['config']['param']['num']) +' presentValue ' + str(value)
                self.debug(data_wri)
                self.bacnet.write(data_wri)
                self.setValue(self.name(dataId), value)

        return json.dumps({'code': 0, 'msg': '', 'data': ''})

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:57:21  更:2021-10-15 11:58:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:45:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码