当前位置: 首页 > news >正文

国家重大建设项目库网站电话网站建设中主页源码

国家重大建设项目库网站电话,网站建设中主页源码,app store应用商店下载,网站设计师的岗位职责目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置#xff1a; 启动本地设备和添加监听器#xff1a; 搜寻远程设备#xff1a; 发送订阅COV报…目录 BACnet 使用软件 资源 模拟器 使用Java主动查 引入maven 创建网络对象 获取远程设备 获取设备属性 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置 启动本地设备和添加监听器 搜寻远程设备 发送订阅COV报文 修改值并等待 SubscribeDevice监听器 BACnet BACnetBuilding Automation and Control Network是一种常用于楼宇自动化和控制系统的通信协议它允许设备在楼宇管理系统中进行相互通信和控制。在Java中进行BACnet物联网操作我们可以使用BACnet4J库它是一个用于BACnet通信的Java库。 使用软件 资源 由于是个人学习所以一般不会有真实硬件可以测试所以我们还需要准备模拟器。 在这方面我已经准备好了资源。 链接https://pan.baidu.com/s/1Pd1cTpOkYZ9p4tbrAUihUg  提取码w62j 模拟器 拿其中一个模拟器Yabe来配合这次学习 安装好后我们只需要用到这两个功能即可。 我们点击Simulator功能,会弹出这么一个模拟框。 这是模拟一个真实设备温度设备底下的deviceId则为设备唯一标识。 我们同时打开多台就可以发现他们的唯一标识不一样。 接下来打开Yabe 选择Add device然后输入本机ip地址 然后你就会发现它把我们刚刚打开的两台模拟设备扫描进去了。 选中其中一台设备后下面Address Space会显示几行数据对某个数据右键选择订阅后你会发现我们可以拿到模拟设备中的某个值的实时数据。 从而我们能判断出哪个属性值对应的是模拟设备中的什么基于软件对设备的通讯到此就结束了。 重点在于我们如何使用Java来使用BACnet进行设备之间的通讯。 使用Java主动查 引入maven 在开始示例之前请确保已经下载并配置了BACnet4J库。 !-- https://github.com/infiniteautomation/BACnet4J --dependencygroupIdcom.infiniteautomation/groupIdartifactIdbacnet4j/artifactIdversion6.0.0/versionscopesystem/scopesystemPath${project.basedir}/lib/bacnet/bacnet4j-6.0.0.jar/systemPath/dependency 通过测试单引用bacnet4j依赖是远远不够的。使用起来会报各种异常 比如 slf4j的 NoClassDefFoundError: org/slf4j/LoggerFactorywarp的 NoClassDefFoundError: lohbihler/warp/WarpScheduledExecutorServicecommons的 NoClassDefFoundError: org/apache/commons/lang3/StringUtils 因此还需要引入以下maven依赖 dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.32/version /dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version /dependencydependencygroupIdai.serotonin.oss/groupIdartifactIdsero-scheduler/artifactIdversion1.1.0/version/dependency!-- https://mvnrepository.com/artifact/ai.serotonin.oss/sero-warp --dependencygroupIdai.serotonin.oss/groupIdartifactIdsero-warp/artifactIdversion1.0.0/version/dependency 创建网络对象 首先获取网段内的模拟设备 //创建网络对象 IpNetwork ipNetwork new IpNetworkBuilder()//本机的ip.withLocalBindAddress(192.168.1.12)//掩码和长度如果不知道本机的掩码和长度的话可以使用代码的工具类IpNetworkUtils获取.withSubnet(255.255.255.0, 24)//默认的UDP端口.withPort(47808).withReuseAddress(true).build(); //创建虚拟的本地设备随意设置一个deviceId 设备的唯一标识 LocalDevice localDevice new LocalDevice(LOCAL_DEVICE_ID, new DefaultTransport(ipNetwork)); //初始化本地设备 localDevice.initialize(); //搜寻网段内远程设备 localDevice.startRemoteDeviceDiscovery(); 如果是ubuntu的情况下建议去掉 withLocalBindAddress(192.168.1.12)它会默认监听0.0.0.0这个地址达到一样的效果。 跨网段的话修改withSubnet()方法 获取远程设备 可以使用 LocalDevice 对象来获取远程设备根据业务来选择以下方法 //某个远程设备的id private static final Integer REMOTE_DEVICE_ID 311400;//获取某个远程设备REMOTE_DEVICE_ID是远程设备ID RemoteDevice remoteDevice localDevice.getRemoteDeviceBlocking(REMOTE_DEVICE_ID);//获取所有远程设备 ListRemoteDevice remoteDevices localDevice.getRemoteDevices(); 通过debug得知获取到的数据没有区别。 获取设备属性 在物联网中有一个叫物模型的抽象思想其中有一个概念叫做属性简单的说一个温度检测设备里它的在线离线是一个属性温度也是一个属性。 接下来我们就去获取这个设备的所有属性。 //获取远程设备的标识符对象 ListObjectIdentifier objectList RequestUtils.getObjectList(localDevice,remoteDevice).getValues(); 通过debug可以看到这个属性集合中的数据  是否觉得眼熟呢是的他就是对应上面进行订阅步骤的Address Space数据 这里就是它的属性。 通过对比我们可以知道Analog_Input:0是我们需要的温度属性。 使用Java8获取温度属性对象 ListObjectIdentifier filter objectList.stream().filter(e - e.getObjectType().equals(ObjectType.analogInput) e.getInstanceNumber() 0).collect(Collectors.toList()); 然后循环不断的获取该属性值的实时数据 while (true) {//根据对象属性标识符的类型进行取值操作 [测试工具模拟的设备点位的属性有objectName、description、present-value等等]//analog-inputPropertyValues pvAiObjectName readValueByProperty(localDevice, remoteDevice, filter, null, PropertyIdentifier.objectName);PropertyValues pvAiPresentValue readValueByProperty(localDevice, remoteDevice, filter, null, PropertyIdentifier.presentValue);PropertyValues pvAiDescription readValueByProperty(localDevice, remoteDevice, filter, null, PropertyIdentifier.description);for (ObjectIdentifier oi : filter) {//取出点位对象不同类型分别对应的值System.out.println(oi.getObjectType().toString() oi.getInstanceNumber() Name: pvAiObjectName.get(oi, PropertyIdentifier.objectName).toString());System.out.println(oi.getObjectType().toString() oi.getInstanceNumber() PresentValue: pvAiPresentValue.get(oi, PropertyIdentifier.presentValue).toString());System.out.println(oi.getObjectType().toString() oi.getInstanceNumber() Description: pvAiDescription.get(oi, PropertyIdentifier.description).toString());}Thread.sleep(1000); } 抽一个通用的方法 readValueByProperty public static PropertyValues readValueByProperty(final LocalDevice localDevice, final RemoteDevice d,final ListObjectIdentifier ois, final ReadListener callback, PropertyIdentifier propertyIdentifier) throws BACnetException{if (ois.size() 0) {return new PropertyValues();}final PropertyReferences refs new PropertyReferences();for (final ObjectIdentifier oid : ois) {refs.add(oid, propertyIdentifier);}return RequestUtils.readProperties(localDevice, d, refs, false, callback); } 然后不断的读取和打印 这样就可以不断获取最新的实时值。 使用DeviceEventAdapter订阅 初始化本地BACnet设备和IP网络配置 //创建网络对象 IpNetwork ipNetwork new IpNetworkBuilder()//本机的ip.withLocalBindAddress(192.168.1.12)//掩码和长度如果不知道本机的掩码和长度的话可以使用代码的工具类IpNetworkUtils获取.withSubnet(255.255.255.0, 24)//默认的UDP端口.withPort(47808).withReuseAddress(true).build(); //创建虚拟的本地设备随意设置一个deviceId 设备的唯一标识 LocalDevice localDevice new LocalDevice(LOCAL_DEVICE_ID, new DefaultTransport(ipNetwork));首先它创建了一个本地BACnet设备并指定设备号为123并为其分配了一个默认的传输实例DefaultTransport。然后它使用IpNetworkBuilder构建了一个IP网络配置包括本地绑定地址、子网掩码和长度、默认UDP端口和地址重用等 启动本地设备和添加监听器 接下来它初始化本地设备然后添加了一个SubscribeDevice的监听器该监听器继承自DeviceEventAdapter。   //初始化本地设备 localDevice.initialize(); //添加监听器 localDevice.getEventHandler().addListener(new SubscribeDevice()); 搜寻远程设备 调用localDevice.startRemoteDeviceDiscovery()方法搜寻网段内的远程BACnet设备。   //搜寻网段内远程设备 localDevice.startRemoteDeviceDiscovery(); 发送订阅COV报文 接下来它使用localDevice.send方法发送了一个订阅COV请求SubscribeCOVRequest到远程设备以订阅特定对象的变化。订阅COV请求包括订阅标识、被监视对象的对象标识符、是否要发送确认报文以及订阅的时长。   //发送订阅COV报文 对应为订阅标识不可为0,订阅对象,是否要发送确认报文,订阅时长(0为永久) localDevice.send(remoteDevice, new SubscribeCOVRequest(new UnsignedInteger(1), new ObjectIdentifier(ObjectType.analogInput, 0), Boolean.TRUE, new UnsignedInteger(0))).get(); 修改值并等待 之后进入一个无限循环每隔2秒向远程设备的某个对象ObjectType.analogInput, 0写入值77。这会触发远程设备发送COV通知给本地设备。   while (true){//修改值为77RequestUtils.writePresentValue(localDevice, remoteDevice, new ObjectIdentifier(ObjectType.analogValue, 0), new Real(77));Thread.sleep(2000); } SubscribeDevice监听器 SubscribeDevice是一个自定义的监听器类继承自DeviceEventAdapter。它实现了covNotificationReceived方法该方法在收到COV通知时被调用处理实时数据更新。   class SubscribeDevice extends DeviceEventAdapter {Overridepublic void covNotificationReceived(final UnsignedInteger subscriberProcessIdentifier,final ObjectIdentifier initiatingDevice, final ObjectIdentifier monitoredObjectIdentifier,final UnsignedInteger timeRemaining, final SequenceOfPropertyValue listOfValues){if (listOfValues.get(0).getPropertyArrayIndex()!null) {System.out.println(listOfValues.get(0).getValue());System.out.println();}} } 通过这种方法不断的获取最新值。
http://wiki.neutronadmin.com/news/240011/

相关文章:

  • 安卓手机做网站服务器免费建立小程序网站
  • 石家庄网站推广招聘网页版传奇游戏怎么制作
  • 自主网站企业网站建设开始起步文章
  • 建设工程质量安全监督站官方网站哪里有制作网站服务
  • 泰安集团网站建设百度关键词热度查询工具
  • 网站开发所需要的语言网站安全等级评审在哪里做
  • 山东大学网站设计与建设1m带宽做网站怎么样
  • access做网站数据方法188建站系统源码
  • 有没有免费的网站服务器国内精自品线一区91制片
  • 网站开发学什么语言好wordpress 应用店商
  • 广州网站建设系统十大免费推广平台
  • 做网站找公司怎么找有没有做任务的网站吗
  • 网站建设自助建站企业简述网站开发流程 旅游
  • 明星网站策划书网络运维工程师薪酬
  • 微山网站建设哪家便宜好看的网站设计
  • 网站开发用python吗安阳网站
  • 建设高校图书馆网站的意义佳木斯 两学一做 网站
  • 正规的佛山网站建设价格昆明手机网站建设
  • 邹平建设网站wordpress 禁止索引目录
  • 北京h5网站建设平台it外包服务包括哪些
  • 网站左右箭头素材做定制旅游最好的网站
  • 如何建一个网站多少钱Wordpress搜索html页面
  • 中新生态城建设局门户网站微商怎么做推广
  • 把网站做到wordpress里面去上海第五届进博会
  • 企业网站 asp php能让手机流畅到爆的软件
  • 网站编程源码免费app开发软件多少钱
  • 淘宝网官方网站网络营销策略存在的问题
  • 网站建设公司比较广州番禺区职业技术学校中职
  • 新闻类网站排版网站建设wordpress 搜索 自定义
  • 洛阳网站设计网站建设流程域名注册