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是远程设备ID
RemoteDevice 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所有标识符 binaryInput
for (ObjectIdentifier oi : objectList) {
// System.out.println(oi.getObjectType().toString() + "," + oi.getInstanceNumber());
//binary-input
if (oi.getObjectType().equals(ObjectType.binaryInput)) {
biList.add(new ObjectIdentifier(ObjectType.binaryInput, oi.getInstanceNumber()));
}
//analog-input
if (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设备。