java对接bacnet ip协议(跨网段方式)
1、环境准备
#maven环境<repositories><repository><id>ias-releases</id><url>https://maven.mangoautomation.net/repository/ias-release/</url></repository></repositories><dependencies><dependency><groupId>com.infiniteautomation</groupId><artifactId>bacnet4j</artifactId><version>6.0.0</version></dependency>
</dependencies>
2、实现
IpNetwork ipNetwork = new IpNetworkBuilder().withLocalBindAddress("0.0.0.0") .withSubnet("255.255.252.0", 22).withPort(port) // <== 修改为你设备的端口.build();ipNetwork.enableBBMD(); //跨网段必须开启BBMD//创建虚拟的本地设备,deviceNumber随意 初始化本地设备localDevice = new LocalDevice(123456, new DefaultTransport(ipNetwork)).withClock(new WarpClock()).initialize();ipNetwork.registerAsForeignDevice(new InetSocketAddress("ba设备所在地址ip", "ba设备所在地址的端口"), 10000000);//搜寻网段内远程设备localDevice.startRemoteDeviceDiscovery();//获取远程设备,instanceNumber是远程设备IDRemoteDevice remoteDevice = localDevice.getRemoteDeviceBlocking(reqVO.getDeviceId());//获取远程设备的标识符对象List<ObjectIdentifier> objectList = RequestUtils.getObjectList(localDevice, remoteDevice).getValues();List<ObjectIdentifier> biList = new ArrayList<>();List<ObjectIdentifier> aiList = new ArrayList<>();System.out.println("<===================对象标识符的对象类型,实例数(下标)===================>");//Object所有标识符 binaryInputfor (ObjectIdentifier oi : objectList) {// System.out.println(oi.getObjectType().toString() + "," + oi.getInstanceNumber());//binary-inputif (oi.getObjectType().equals(ObjectType.binaryInput)) {biList.add(new ObjectIdentifier(ObjectType.binaryInput, oi.getInstanceNumber()));}//analog-inputif (oi.getObjectType().equals(ObjectType.analogInput)) {aiList.add(new ObjectIdentifier(ObjectType.analogInput, oi.getInstanceNumber()));}}System.out.println("<==================================================================>");System.out.println("取值开始!!!================>");final PropertyReferences refs = new PropertyReferences();if (biList != null && biList.size() > 0) {for (final ObjectIdentifier oid : biList) {if (reqVO.getInstNums() != null && !reqVO.getInstNums().contains(oid.getInstanceNumber())) continue;refs.add(oid, PropertyIdentifier.objectName);refs.add(oid, PropertyIdentifier.presentValue);// refs.add(oid, PropertyIdentifier.description);}PropertyValues pvAll = RequestUtils.readProperties(localDevice, remoteDevice, refs, false, null);for (ObjectIdentifier oi : biList) {System.out.println("instanceNumber:" + oi.getInstanceNumber());System.out.println(oi.getObjectType() + " " + oi.getInstanceNumber() + " Name: " + pvAll.get(oi, PropertyIdentifier.objectName));System.out.println(oi.getObjectType() + " " + oi.getInstanceNumber() + " PresentValue: " + pvAll.get(oi, PropertyIdentifier.presentValue));}} else if (aiList != null && aiList.size() > 0) {for (final ObjectIdentifier oid : aiList) {if (reqVO.getInstNums() != null && !reqVO.getInstNums().contains(oid.getInstanceNumber())) continue;refs.add(oid, PropertyIdentifier.objectName);refs.add(oid, PropertyIdentifier.presentValue);// refs.add(oid, PropertyIdentifier.description);}PropertyValues pvAll = RequestUtils.readProperties(localDevice, remoteDevice, refs, false, null);for (ObjectIdentifier oi : aiList) {System.out.println("instanceNumber:" + oi.getInstanceNumber());System.out.println(oi.getObjectType() + " " + oi.getInstanceNumber() + " Name: " + pvAll.get(oi, PropertyIdentifier.objectName));System.out.println(oi.getObjectType() + " " + oi.getInstanceNumber() + " PresentValue: " + pvAll.get(oi, PropertyIdentifier.presentValue));}}System.out.println("================>取值结束!!!");
3、可以是用可视化工具Bacnet Scane可视化工具
bacnet scane可视化下载地址
图中含义:搜索ip地址为172.16.33.250下的47809端口的ba设备。