文章目录

  • 前言
  • 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 主要用这个

注意

调试工具和 代码只能启动一个 也就是说你启动了 调试工具,并且未关闭,就不能使用代码去扫描…