文章目录
- 前言
- BBMD
- bacnet4j
- 后言
- 参考内容
- 更好的Bacnet库
- Bacnet 调试工具
- 注意
前言
在做一个项目的时候 需要采集一些数据例如:BA、照明
他们的协议是 bacnet,了解到这个协议是不支持跨网段的,如果需要夸网段的话则需要一种设备支持,那个设备就是BBMD,目前咨询过两个厂家
http://www.lmgateway.com/BBMD.html当前厂家已经停产了…
https://ccontrols.com.cn/ 这家的贵,之前电话沟通过 4000 多…
http://www.opcmaster.com/news.asp?cl_id=148 木有应该是采用的这家,好像2000多吧
BBMD
BACnet/IP使用UDP/IP在现有的IP网络中进行通信,在多个IP子网中如果需要对BACnet的广播消息进行管理的时候就需要一种特殊的BBMD设备(Broadcast Management Device)。路由器将IP网络连接在一起,以便可以将来自一个网络的消息发送到另一个网络。大多数IP路由器不转发广播消息,这意味着发现无法发现另一个网络上的设备。为了解决此问题,BACnet提供了一种称为BBMD的技术-BACnet / IP广播管理设备。
bacnet4j
这里也是看源码,看API 等等才知道如何去具体的操作…
public BacNetBean bbmd() throws Exception {
IpNetwork ipNetwork = new IpNetworkBuilder()
.withLocalBindAddress("192.168.2.7") //
.withSubnet("255.255.255.0", 24)
.withPort(47808)
.withReuseAddress(true)
.build();
ipNetwork.enableBBMD();
LocalDevice initialize = new LocalDevice(10000, new DefaultTransport(ipNetwork))
.withClock( new WarpClock()) //
.initialize();
BacNetBean bacNetBean = new BacNetBean();
bacNetBean.setLocalDevice(initialize);
bacNetBean.setIpNetwork(ipNetwork);
return bacNetBean;
}
测试
@SneakyThrows
@Test
public void test() throws BACnetException {
BacNetBean bacNetBean = bbmd1();
IpNetwork ipNetwork = bacNetBean.getIpNetwork();
// 注册为外部设备就是 BBMD 这里的IP 指向的是 BBMD 设备的IP
// 这样我们就可以夸网段读取了
ipNetwork.registerAsForeignDevice(new InetSocketAddress("172.17.14.50", 47808), 10000000);
// 点位的概念,一个点位可以理解为 一个按钮,里面有多个回路,多个灯泡,通过这一个点位去控制
LocalDevice localDevice = bacNetBean.getLocalDevice();
// 获取远程设备,instanceNumber 是设备的device id
RemoteDevice remoteDevice = localDevice.getRemoteDeviceBlocking(127001);
log.info("获取模型名称:{}", remoteDevice.getDeviceProperty(PropertyIdentifier.modelName));
log.info("获取模型名称:{}", remoteDevice.getDeviceProperty(PropertyIdentifier.objectName));
// 所有的点位
List<ObjectIdentifier> objectList = RequestUtils.getObjectList(localDevice, remoteDevice).getValues();
for (ObjectIdentifier objectIdentifier : objectList) {
System.out.println("点位类型:" + objectIdentifier.getObjectType() + "----"
+ "对象实例" + objectIdentifier.getInstanceNumber());
}
log.info("共计点位:{}", objectList.size());
// 根据指定点位获取
// ObjectIdentifier oid = new ObjectIdentifier(ObjectType.analogInput, 1);
//获取指定的presentValue
// PropertyValues pvs2 = RequestUtils.readOidPresentValues(localDevice, remoteDevice, Arrays.asList(oid), null);
// System.out.println("analogInput:1 == " + pvs2.get(oid, PropertyIdentifier.presentValue));
localDevice.terminate();
}
后言
先占个坑,后面在完善,先发布下,有需求了,后续会更新,没需求了就算求了.
我本机的网段为
172.16.18.xxx
设备网的网段为
172.17.xx.xx
172.18.xx.xx
172.18.xx.xx
也就是说我们需要购买3个BBMD 的设备,
可以留言,我会尽快恢复的,
项目还在进行中:2022年9月19日17:41:48…
参考内容
https://sourceforge.net/p/bacnet4j/discussion/810586/thread/26bdb728/ https://forum.mango-os.com/topic/3099/bacnet4j-3-2-and-bbmd-foreign-device-support https://github.com/MangoAutomation/BACnet4J/blob/141fa420aa6bc1897dbc94c2c504558d98bdc6a9/src/test/java/com/serotonin/bacnet4j/npdu/ip/BBMDTest.java#L219
更好的Bacnet库
https://github.com/Code-House/bacnet4j-wrapper 包装了 Bacnet4j 因为 Bacnet4j 的API 不太友好…
Bacnet 调试工具
https://sourceforge.net/projects/yetanotherbacnetexplorer/ http://www.opcmaster.com/news.asp?cl_id=91 主要用这个
注意
调试工具和 代码只能启动一个 也就是说你启动了 调试工具,并且未关闭,就不能使用代码去扫描…