Bacnet IP协议和Java实现
Bacnet IP
楼宇自控BACnet/IP协议网关用于楼宇自控系统、楼宇自动化、楼宇信息系统,暖通HAVC行业实现联网,需要需要满足BACNet协议、PLC协议、Modbus协议、OPC UA协议、MQTT协议之间的转换,实现BACNet MS/TP转BACnet/IP,BACnet MS/TP转MQTT, BACnet/IP转OPC UA协议等。
Java实现
实现
同网段,跨主机实现
跨网段问题解决
这里跨网段研究了好久,一直不行.后面发现
withSubnet这里换一下就能解决,换成同一个网段的网关即可
import com.serotonin.bacnet4j.LocalDevice;
import com.serotonin.bacnet4j.RemoteDevice;
import com.serotonin.bacnet4j.exception.BACnetException;
import com.serotonin.bacnet4j.npdu.ip.IpNetwork;
import com.serotonin.bacnet4j.npdu.ip.IpNetworkBuilder;
import com.serotonin.bacnet4j.transport.DefaultTransport;
import com.serotonin.bacnet4j.type.enumerated.ObjectType;
import com.serotonin.bacnet4j.type.enumerated.PropertyIdentifier;
import com.serotonin.bacnet4j.type.primitive.ObjectIdentifier;
import com.serotonin.bacnet4j.util.PropertyReferences;
import com.serotonin.bacnet4j.util.PropertyValues;
import com.serotonin.bacnet4j.util.ReadListener;
import com.serotonin.bacnet4j.util.RequestUtils;import java.util.ArrayList;
import java.util.List;/*** @author HFL* @description 读取设备点位属性和值*/
public class ReadBacnetTest {static LocalDevice localDevice;// private static final Integer REMOTE_DEVICE_ID = 2490463;private static final Integer REMOTE_DEVICE_ID = 737354;public static void main(String[] args) throws Exception {try {//创建网络对象IpNetwork ipNetwork = new IpNetworkBuilder()//本机的ip.withLocalBindAddress("192.168.2.210")//掩码和长度,如果不知道本机的掩码和长度的话,可以使用代码的工具类IpNetworkUtils获取//本来是 255.255.255.0改成 网段的网关.withSubnet("192.168.2.0", 24)//默认的UDP端口.withPort(47808).withReuseAddress(true).build();//创建虚拟的本地设备,deviceNumber随意localDevice = new LocalDevice(223, new DefaultTransport(ipNetwork));//初始化本地设备localDevice.initialize();//搜寻网段内远程设备localDevice.startRemoteDeviceDiscovery();//获取远程设备,instanceNumber是远程设备IDRemoteDevice remoteDevice = localDevice.getRemoteDeviceBlocking(REMOTE_DEVICE_ID);//获取远程设备的标识符对象List<ObjectIdentifier> objectList = RequestUtils.getObjectList(localDevice, remoteDevice).getValues();List<ObjectIdentifier> aiList = new ArrayList<>();List<ObjectIdentifier> avList = new ArrayList<>();System.out.println("<===================对象标识符的对象类型,实例数(下标)===================>");//Object所有标识符for(ObjectIdentifier oi : objectList){System.out.println(oi.getObjectType().toString() + "," + oi.getInstanceNumber());/*** ObjectIdentifier对象的不同类型的数据,进行过滤* 此例子只列举了测试软件中存在的部分类型* 具体业务时,根据需求,取对应类型的对象即可* 对象类型(ObjectType):* analog-input、analog-value、binary-value、character-string-value、multi-state-value、...* 对象属性标识符类型(PropertyIdentifier):* objectName、presentValue、description、eventState、units、...*///analog-inputif(oi.getObjectType().equals(ObjectType.analogInput)){aiList.add(new ObjectIdentifier(ObjectType.analogInput, oi.getInstanceNumber()));}//analog-valueif(oi.getObjectType().equals(ObjectType.analogValue)){avList.add(new ObjectIdentifier(ObjectType.analogValue, oi.getInstanceNumber()));}//....}System.out.println("<==================================================================>");System.out.println("取值开始!!!================>");//根据对象属性标识符的类型进行取值操作 [测试工具模拟的设备点位的属性有objectName、description、present-value等等]//analog-inputPropertyValues pvAiObjectName = readValueByPropertyIdentifier(localDevice, remoteDevice, aiList, null, PropertyIdentifier.objectName);PropertyValues pvAiPresentValue = readValueByPropertyIdentifier(localDevice, remoteDevice, aiList, null, PropertyIdentifier.presentValue);PropertyValues pvAiDescription = readValueByPropertyIdentifier(localDevice, remoteDevice, aiList, null, PropertyIdentifier.description);for (ObjectIdentifier oi : aiList){//取出点位对象不同类型分别对应的值System.out.println(oi.getObjectType().toString() + " " + oi.getInstanceNumber() + " Name: " + pvAiObjectName.get(oi, PropertyIdentifier.objectName).toString());System.out.println(oi.getObjectType().toString() + " " + oi.getInstanceNumber() + " PresentValue: " + pvAiPresentValue.get(oi, PropertyIdentifier.presentValue).toString());System.out.println(oi.getObjectType().toString() + " " + oi.getInstanceNumber() + " Description: " + pvAiDescription.get(oi, PropertyIdentifier.description).toString());}//analog-value 同上,只是对象属性标识符列表不同ListPropertyValues pvAvPresentValue = readValueByPropertyIdentifier(localDevice, remoteDevice, avList, null, PropertyIdentifier.presentValue);PropertyValues pvAvDescription = readValueByPropertyIdentifier(localDevice, remoteDevice, avList, null, PropertyIdentifier.description);for (ObjectIdentifier oi : avList){System.out.println(oi.getObjectType().toString() + " " + oi.getInstanceNumber() + " PresentValue: " + pvAvPresentValue.get(oi, PropertyIdentifier.presentValue).toString());System.out.println(oi.getObjectType().toString() + " " + oi.getInstanceNumber() + " Description: " + pvAvDescription.get(oi, PropertyIdentifier.description).toString());}System.out.println("================>取值结束!!!");} catch (Exception e) {e.printStackTrace();}finally {if(null != localDevice){//shutdownlocalDevice.terminate();}}}/*** 读取远程设备的属性值 根据属性标识符* @param localDevice 本地设备* @param d 远程设备* @param ois 对象标识符列表* @param callback 回调* @param propertyIdentifier 属性标识符* @return 某一类属性的值* @throws BACnetException Exception*/public static PropertyValues readValueByPropertyIdentifier(final LocalDevice localDevice, final RemoteDevice d,final List<ObjectIdentifier> ois, final ReadListener callback, PropertyIdentifier propertyIdentifier) throws BACnetException {if (ois.size() == 0) {return new PropertyValues();}final PropertyReferences refs = new PropertyReferences();for (final ObjectIdentifier oid : ois) {refs.add(oid, propertyIdentifier);}return RequestUtils.readProperties(localDevice, d, refs, false, callback);}
}
Bacnet IP协议和Java实现相关推荐
- IP协议和TCP协议详解
IP协议和TCP协议详解 IP协议 IP协议的特点 IPV4头部信息 IP分片 重定向 IPV6头部结构 TCP协议 TCP协议的特点 TCP头部结构 TCP连接的建立与关闭 异常终止连接 异常终止连 ...
- 用于地址解析的协议是服务器,tcp/ip协议和http协议
TCP/IP 是一类协议系统,它是用于网络通讯的一套协议集合.浏览器 传统上来讲 TCP/IP 被认为是一个四层协议:应用层(telnet, ftp, http, smtp, dns等),传输层(tc ...
- Aria2 RPC接口协议和Java的本地调用实现
如果你还没有启动aria2 : 安装和配置 目录 Aria2 RPC接口协议 Java实现 依赖 核心类 调用 Aria2 RPC接口协议 官方文档 方法列表 下载参数 本文中我们使用默认的本地调用, ...
- Modbus通信协议和Java实现
Modbus通信协议 Modbus通信协议 介绍 RTU 存储区 通信 协议 栗子 说明书的地址 实现 Modbus通信协议 介绍 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电 ...
- 身份验证协议和java安全框架
一.身份验证协议 1.OAuth 关于 OAuth实际上是什么存在很多混淆.有些人认为 OAuth 是一种登录流程(例如,当您使用 Google Login 登录应用程序时),有些人认为 OAuth ...
- TCP/IP协议和OSI七层模型
一.TCP/IP协议 标准TCP/IP协议是用于计算机通信的一组协议,通常被称为TCP/IP协议栈,以它为基础组建的互联网是目前国际上规模最大的计算机网络. 正因为互联网的广泛应用,使得TCP/IP成 ...
- 基于部标jt808(天琴、谷米),809协议和Java Netty框架构建北斗GPS定位系统
演示平台:http://gps.lingx.com 账号:admin,密码:123456 1. 开发环境 操作系统:Windows 系列/Linux 系列/MacOS 32 位或 64 位都可以 ...
- 基于PT分析ARP协议和Wireshark分析ARP协议。
一.Ip层主要的协议:ARP,ICMP,ip,IGMP ICMP:ping命令.(可以这么理解,先简单这么理解叭) 二.ARP技术原理(图片为网络图片,侵权即删) 首先我们得明白ARP工作在网络层.( ...
- Java爬虫技术—入门秘籍之HTTP协议和robtos协议(一)
文章目录: 入门秘籍-Http协议与robots协议 内功修炼-深入理解网络爬虫概念,作用,原理和爬取方式及流程 山中奇遇-得授页面解析技术之Xpath 入驻兵器阁-获取爬虫神器之Jsoup 入驻兵器 ...
最新文章
- interface declaration, parcelable declaration, AidlTokenType.import or AidlTokenType.package ...
- Java基础之IDE
- CentOS中输入yum报错:sudo: unable to execute /bin/yum: No such file or directory
- svn java注释_svn 强制用户添加注释 和 允许用户修改注释
- 【Flink】Flink 如何在本地IDEA恢复检查点 不通过IDEA 不通过 flink run 方法
- 重构16-Encapsulate Conditional(封装条件)
- 4地形编辑插件_UE4建模插件用法
- Confluence 企业服务器正遭攻击
- 【laravel5.4】使用baum\node 类库实现无限极分类
- python中断言语句语法_Python的词法分析与语法分析
- 会话(状态)管理Cookie与Session(二)
- websphere liberty
- 学习字节跳动的团队管理
- 【经典】《Java170道面试笔试题全面含答案》涉及java/数据库/Spring框架/JVM/数据结构算法/设计模式相关
- java类详解_JAVA 内部类详解
- mac全选文字的快捷键_摆脱重复操作,教你 Mac 一次性多选复制的小技巧
- 防火墙添加ip白名单_防火墙白名单设置方法firewalld
- Python-Flask开发微电影网站(三)
- 高德开发者地图 快速使用报错
- ssm框架超市进销存后台管理系统java进货商品信息库存销售管理jsp源码erp数据库mysql