java对接bacnet ip协议(跨网段方式)

BacNet4j-跨网段-项目运用 BacNet 跨网段 阅读详情
AI摘要

该博客介绍Java跨网段对接Bacnet IP协议,包含环境准备、实现过程,还提及可使用可视化工具Bacnet Scane,并给出其下载地址,同时说明了搜索特定IP地址和端口下ba设备的含义。

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设备。

Java对接bacnet 1.引入jar包 <!--bacnet4j--> <dependency> <groupId>bacnet4j</groupId> <artifactId>bacnet4j</artifactId> <version>5.0.2</version> </dependency> 阅读详情

相关推荐

BACnet/IP之BACnet4j学习java代码例子属性读写01

第一次接触BACnet ip,开发语言使用java,网上搜了下,都是推荐使用BACnet4j,但是找不到完整的demo,折腾了一段时间,勉强跑通了自己写的demo,读取到的设备模拟器上的数据。 1.下载Yabe设备模拟器 链接: https://pan.baidu.com/s/1OK1uq-tfU-XoOH10h4Otag 提取码: 4eu4 安装后 打开太阳的图标 这是设备模拟器,Yabe还提供了一个客户端,打开放大镜图标 可以在client端看到相关的数据信息。 ...

夢の殇 1万+

<Java物联网> 从主动到被动:Java中的BACnet设备属性查询

BACnet(Building Automation and Control Network)是一种常用于楼宇自动化和控制系统的通信协议,它允许设备在楼宇管理系统中进行相互通信和控制。在Java中进行BACnet物联网操作,我们可以使用BACnet4J库,它是一个用于BACnet通信的Java库。

weixin_40796213的博客 4251

BACnet协议栈实战:从Yabe工具到Wireshark抓包全流程解析

本文详细解析了BACnet协议栈的实战应用,从Yabe工具的设备发现到Wireshark抓包分析的全流程。通过Yabe、VTS和Wireshark的组合使用,帮助读者掌握BACnet通信调试的核心方法,适用于工业自动化和楼宇控制领域。

weixin_30505225的博客 82

使用java代码实现BacNet协议通过设备IP与设备ID同网段获取到对方设备数据

bacnet

m0_60185495的博客 4272

BACnet4j实战:从模拟设备到点位数据采集的完整流程解析

本文详细解析了使用BACnet4j从模拟设备到点位数据采集的完整流程,涵盖开发环境搭建、项目集成、数据采集策略及生产环境部署等关键环节。通过实战案例和代码示例,帮助开发者高效实现BACnet/IP协议下的设备通信与数据采集,适用于楼宇自动化系统集成。

weixin_30505225的博客 839

BACnet协议,核心库(BACnet4J)

类型转换:通过 convertToEncodable 方法将 Java 基础类型转为 BACnet 标准类型(如Integer→UnsignedInteger,Float→Real)订阅 ID 设计:通过对象类型分段(1000 段用于开关,2000 段用于传感器)避免 ID 冲突,确保订阅唯一性。优先级控制:BACnet 设备支持 16 级优先级,写入时需检查并清除更高优先级的控制值,避免写入失败。生命周期控制:lifetime=0 表示永久订阅,非零值需定期重新订阅以维持连接。

Chief_fly的博客 509

Bacnet IP协议和Java实现

楼宇自控BACnet/IP协议网关用于楼宇自控系统、楼宇自动化、楼宇信息系统,暖通HAVC行业实现联网,需要需要满足BACNet协议、PLC协议、Modbus协议、OPCUA协议、MQTT协议之间的转换,实现BACNetMS/TP转BACnet/IP,BACnetMS/TP转MQTT,BACnet/IP转OPCUA协议等。............

m0_46690280的博客 4337

【信息科学与工程学】【通信工程】第二百四十一篇 IPv6改造方案中的需求列表01

编号场景IPv6特性业务场景特性应用系统的需求1公网用户访问IPv6地址分配与路由负载均衡、随机性应用系统需支持IPv6协议的HTTP/HTTPS监听,能够接收来自IPv6客户端的请求;Web服务器、API网关需绑定IPv6地址并开放相应端口;Session管理需兼容IPv6地址格式。2内网服务器间通信双栈或纯IPv6子网一致性、其他应用间的RPC调用(如Dubbo、gRPC)、数据库连接(JDBC、ODBC)需支持IPv6地址解析和连接;服务注册与发现组件(如Nacos、Consul)需存储和返回IPv6

weixin_49199313的博客 34

BACnet协议+设备数据接入

BACnet(A Data Communication Protocol for Building Automation and Control Network)是一种为楼宇自动控制网络所制定的数据通信协议,它由美国冷暖空调工程师协会组织的标准项目委员会 135P(Standard Project Committee: SPC 135P)于 1995 年 6 月制定。BACnet 标准产生的背景是用户对楼宇自动控制设备互操作性(Interoperability)的广泛要求,即将不。

qq_42670087的博客 1884

bacnetsimulator:从零搭建可复现的BACnet设备仿真环境

BACnet协议是楼宇自控领域的主流通信标准,广泛用于暖通空调、照明和门禁系统。其核心在于对象模型,设备通过Device、Analog Input等对象进行数据交互。在工程实践中,缺乏真实硬件常导致调试困难。通过软件模拟BACnet设备,可在无硬件条件下验证上位机与网关兼容性。基于BACnet Stack协议栈,结合JSON配置与systemd管理,能批量创建虚拟设备并模拟多对象行为,有效支撑开发测试与协议学习。

weixin_28721917的博客 326

bacnet-java-demo

bacnet,开发语言使用java,使用BACnet4j,Yabbo模拟设备,读取到的设备模拟器上的数据,一个小小的demo,希望对大家有用

springboot java 对接 bacnet ip 楼宇自控传感器,跨网段

2.bacnet ip 基本原理解释:bacnet ip 通过 udp 扫描设备,可以通过 id 扫描,也可以直接广播,扫描到设备后读取设备下点数据,每个点都有属性值,这个值通常就是一个传感器的数值,比如温湿度,开启关闭状态。如果 maven 仓库无法直接下载这几个依赖这里给出 jar 包下载地址:https://wwfc.lanzoub.com/b0izz7pne。1.首先需要使用几个依赖。

cui1022771623的博客 1154

BACnet for Java-开源

Infinite Automation Systems为Java(最低版本1.5)编写的BACnet I / P和MS / TP协议的高性能实现。 支持所有BACnet服务和完整的消息隔离。 可用于现场设备或控制平台。 对于商业许可证,请联系https://infiniteautomation.com/bacnet4j-open-source-bacnet-library/最新代码在这里:https://github.com/infiniteautomation/BACnet4J有关支持,请参见:https:// forum。 infiniteautomation.com/category/12/bacnet4j-general-discussion

BACnet/IP协议开发避坑指南:Bacnet4j读取采集器数据的5个关键注意事项

本文针对使用Bacnet4j库通过BACnet/IP协议读取采集器数据的开发场景,总结了五个关键注意事项。重点解析了网络配置中本地绑定地址与子网掩码的常见误区,探讨了47808端口占用与并发处理的优化策略,并提供了设备动态管理、数据高效读取(包括批量读取与COV订阅)以及精细化异常处理的实用方案,旨在帮助开发者构建稳定、高效的楼宇自控数据采集系统。

kite3的博客 498

BACnet java代码(完整版)

提供BAcNet协议java开发代码,完整版。BACnet通讯协议是楼宇自动控制技术应用的数据通讯网络标准,网上目前多半只有相关文档,代码很少,在此分享给大家宝贵成果

BACnet 协议栈浅析(Java 版)之 BACnet 协议简介-附件资源

BACnet 协议栈浅析(Java 版)之 BACnet 协议简介-附件资源

BACnet/IP跨网段通信:BBMD原理、配置与故障排查实战

在楼宇自控集成中,BACnet/IP依托UDP广播实现设备发现与点位上报,但广播无法穿越三层网络,导致跨网段设备“看得见、摸不着”的难题频发。BBMD(广播管理设备)作为解决跨网段广播转发的核心机制,通过BDT(广播分发表)将本地广播封装为单播报文,转发至远端BBMD后再恢复为广播,从而实现跨VLAN的BACnet设备互通。本文从BACnet/IP的广播依赖出发,拆解BBMD的BVLL报文结构、BDT双向配置要点、FDT外部设备注册机制,并结合典型故障现象(设备扫不到、轮询超时、重启后恢复慢)给出系统性排查

weixin_34197488的博客 325

NSGA(非支配排序遗传算法)

在多目标优化问题中,往往存在多个相互冲突的目标需要同时优化。传统的单目标优化算法无法直接应用于这类问题,因此需要专门的多目标优化算法。非支配排序遗传算法(Non-dominated Sorting Genetic Algorithm,NSGA)是一种经典的多目标优化算法,由印度科学家 Kalyanmoy Deb 等人于 1995 年提出。NSGA 通过非支配排序和拥挤度距离来引导种群向 Pareto 最优前沿进化,从而得到一组具有良好分布性和收敛性的 Pareto 最优解。

2975
上一篇: Java中的集合体系
下一篇: java实现Google邮箱SMTP协议
Lin_XXiang
博客等级 码龄5年 904粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lin_XXiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值