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实现相关推荐

  1. IP协议和TCP协议详解

    IP协议和TCP协议详解 IP协议 IP协议的特点 IPV4头部信息 IP分片 重定向 IPV6头部结构 TCP协议 TCP协议的特点 TCP头部结构 TCP连接的建立与关闭 异常终止连接 异常终止连 ...

  2. 用于地址解析的协议是服务器,tcp/ip协议和http协议

    TCP/IP 是一类协议系统,它是用于网络通讯的一套协议集合.浏览器 传统上来讲 TCP/IP 被认为是一个四层协议:应用层(telnet, ftp, http, smtp, dns等),传输层(tc ...

  3. Aria2 RPC接口协议和Java的本地调用实现

    如果你还没有启动aria2 : 安装和配置 目录 Aria2 RPC接口协议 Java实现 依赖 核心类 调用 Aria2 RPC接口协议 官方文档 方法列表 下载参数 本文中我们使用默认的本地调用, ...

  4. Modbus通信协议和Java实现

    Modbus通信协议 Modbus通信协议 介绍 RTU 存储区 通信 协议 栗子 说明书的地址 实现 Modbus通信协议 介绍 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电 ...

  5. 身份验证协议和java安全框架

    一.身份验证协议 1.OAuth 关于 OAuth实际上是什么存在很多混淆.有些人认为 OAuth 是一种登录流程(例如,当您使用 Google Login 登录应用程序时),有些人认为 OAuth ...

  6. TCP/IP协议和OSI七层模型

    一.TCP/IP协议 标准TCP/IP协议是用于计算机通信的一组协议,通常被称为TCP/IP协议栈,以它为基础组建的互联网是目前国际上规模最大的计算机网络. 正因为互联网的广泛应用,使得TCP/IP成 ...

  7. 基于部标jt808(天琴、谷米),809协议和Java Netty框架构建北斗GPS定位系统

    演示平台:http://gps.lingx.com 账号:admin,密码:123456 1. 开发环境 操作系统:Windows 系列/Linux 系列/MacOS 32 位或 64 位都可以   ...

  8. 基于PT分析ARP协议和Wireshark分析ARP协议。

    一.Ip层主要的协议:ARP,ICMP,ip,IGMP ICMP:ping命令.(可以这么理解,先简单这么理解叭) 二.ARP技术原理(图片为网络图片,侵权即删) 首先我们得明白ARP工作在网络层.( ...

  9. Java爬虫技术—入门秘籍之HTTP协议和robtos协议(一)

    文章目录: 入门秘籍-Http协议与robots协议 内功修炼-深入理解网络爬虫概念,作用,原理和爬取方式及流程 山中奇遇-得授页面解析技术之Xpath 入驻兵器阁-获取爬虫神器之Jsoup 入驻兵器 ...

最新文章

  1. interface declaration, parcelable declaration, AidlTokenType.import or AidlTokenType.package ...
  2. Java基础之IDE
  3. CentOS中输入yum报错:sudo: unable to execute /bin/yum: No such file or directory
  4. svn java注释_svn 强制用户添加注释 和 允许用户修改注释
  5. 【Flink】Flink 如何在本地IDEA恢复检查点 不通过IDEA 不通过 flink run 方法
  6. 重构16-Encapsulate Conditional(封装条件)
  7. 4地形编辑插件_UE4建模插件用法
  8. Confluence 企业服务器正遭攻击
  9. 【laravel5.4】使用baum\node 类库实现无限极分类
  10. python中断言语句语法_Python的词法分析与语法分析
  11. 会话(状态)管理Cookie与Session(二)
  12. websphere liberty
  13. 学习字节跳动的团队管理
  14. 【经典】《Java170道面试笔试题全面含答案》涉及java/数据库/Spring框架/JVM/数据结构算法/设计模式相关
  15. java类详解_JAVA 内部类详解
  16. mac全选文字的快捷键_摆脱重复操作,教你 Mac 一次性多选复制的小技巧
  17. 防火墙添加ip白名单_防火墙白名单设置方法firewalld
  18. Python-Flask开发微电影网站(三)
  19. 高德开发者地图 快速使用报错
  20. ssm框架超市进销存后台管理系统java进货商品信息库存销售管理jsp源码erp数据库mysql

热门文章

  1. wukong-robot 自然语言处理对话
  2. Android线性与相对布局
  3. 可爱卡通儿童教育课件PPT模板
  4. USB-KEY原理简要说明
  5. LABVIEW通过串口VISA通讯松下FP系列PLC.读取写 入寄存器,辅助继电器,实际项目应用。做成了子VI,包含源程序,松下通讯手册。适合初学者入门
  6. 政考网:公考报班到底靠不靠谱
  7. 安卓源码下apk进行platform签名的方法
  8. 【前辈经验之谈】发顶会论文,怎么就那么难?
  9. 单片机程序员发展的必选之路: Linux
  10. 未来计算机发展3000字,精选计算机实习报告范文3000字