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、实现

java 复制代码
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设备。

相关推荐
AI你一生一世2 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影2 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯2 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
honsor3 小时前
SNMP 读取以太网温湿度传感器数据,监控平台对接实操
物联网·网络协议·tcp/ip
Dev_XH5 小时前
【成品设计】物联网防酒驾控制系统
物联网
码间留白6 小时前
uni-app 跑上鸿蒙,发现蓝牙全瞎:我把 BLE 补齐的实战(一)基建篇
物联网·uniapp·harmonyos next·蓝牙 ble·鸿蒙os开发
海的透彻7 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat7 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习8 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one8 小时前
算法--构造
java·数据结构·算法