BACNet4j,BBMD,跨网段,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 主要用这个

注意

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值