java obix_obix协议在java中的配置和使用详解

前言

本文主要给大家介绍的是关于obix协议在java中的配置和使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

什么是 oBIX?

简单来讲,obix是一种 XML 通讯协议,使用Http Request/Post方式进行数据通讯。所有数据通过可读字符进行传送,一个oBIX对象可以有唯一的一个URL识别。

oBIX的实现原理

首先数据储存在Niagara的服务平台上,我们需要做的是从Niagara获取数据,并且储存在InfluxDB中。下面是实现的流程方法。

加粗 Ctrl + B

斜体 Ctrl + I

引用 Ctrl + Q

插入链接 Ctrl + L

插入代码 Ctrl + K

插入图片 Ctrl + G

提升标题 Ctrl + H

有序列表 Ctrl + O

无序列表 Ctrl + U

横线 Ctrl + R

撤销 Ctrl + Z

重做 Ctrl + Y

我们都需要定义哪些类以及变量?

类/接口 名

用途

Calculator

DiscoverEngine

搜索工具

FactorInfo

定义所采集元素的信息

FactorNameDecoderInterface

元素名称解码接口

FactorNameDecoderObixUrlImpl

NewValueInterface

NewValueInterfaceImpl

ObixClientMgr

ObixClient

ObixFetcher

循环抓取obix传输的数据

1、遍历各个点

84e29228dc3fcacc2e434f389845a6bc.png

2、先遍历各个设备,将相同的typeid的设备存入同一个hashmap中

f62f1831ca65a0da253b477ecc424939.png

3、开始执行主程序,先从数据库中查询出项目名称

1d6d991677729d3626a65acba94a8e8f.png

4、开始搜索!

public class ObixFetcher implements JobInterface{

//这个是接口的抽象方法

public void cycleOnce() {

//从数据库中取出项目信息

List ps = dao.selectByExample(new ProjectExample());

//遍历项目信息,如果项目信息的关键信息不为null

for(Project p : ps){

if(p.getObixBaseAddress() != null && p.getObixUsername() != null

&& p.getObixPassword() != null){

//开启探索工具 (应该还是一个内部类),将关键项目信息传入探索工具,

DiscoverEngine de = new DiscoverEngine(p.getObixBaseAddress(),

p.getObixUsername(), p.getObixPassword());

//从build数据库中将数据取出,存入bulidNameToId(同样还是构造方法)

//从device数据库中将数据取出,存入deviceNumberToId(同样还是构造方法)

de.setNewValueInterface(new NewValueInterfaceImpl(p.getId(), deviceService, deviceDao, deviceTypeDao, buildDao));

//return回来一个FactorInfo

de.setFactorNameDecoderInterface(new FactorNameDecoderObixUrlImpl());

de.run();

}

}

}

}

以下是上文 DiscoverEngine de的构造方法

public class DiscoverEngine {

public DiscoverEngine(String baseUrl, String username, String password){

this.baseUrl = baseUrl;

obixClient = new ObixClient(baseUrl, username, password);

}

}

以下是上文obixClient = new ObixClient(baseUrl, username, password)的构造方法

public class ObixClient {

public ObixClient(String baseUrl, String userName, String password){

this.baseUrl = baseUrl;

this.userName = userName;

this.password = password;

init();

}

//uri中存放着路由地址,然后传给session,session会在后面用到

private void init() {

Uri uri = new Uri(baseUrl);

session = new ObixSession (uri, userName, password);

}

}

this就是说这个类的当前这个对象,也就是构造方法产生的对象。

以下信息好像并没有用到

public class NewValueInterfaceImpl implements NewValueInterface{

HashMap buildNameToId = new HashMap();

HashMap deviceNumberToId = new HashMap();

public NewValueInterfaceImpl(Integer projectId, IDeviceManagementService deviceService, DeviceMapper deviceDao, DeviceTypeMapper deviceTypeDao,BuildMapper buildDao) {

this.deviceDao = deviceDao;

this.deviceTypeDao = deviceTypeDao;

this.buildDao = buildDao;

this.projectId = projectId;

this.deviceService = deviceService;

//遍历数据库中的建筑,存入map

List bs = buildDao.selectByExample(new BuildExample());

for(Build b : bs){

buildNameToId.put(b.getName(), b.getId());

}

//遍历数据库中的设备,存入map

List ds = deviceDao.selectByExample(new DeviceExample());

for(Device d : ds){

deviceNumberToId.put(d.getNumber(), d.getId());

}

}

}

a0a9d124b2c747e352ac23b9172dd74f.png

以上信息好像并没有用到

接着跑了下面两个接口

还没搞懂什么意思以下

public class DiscoverEngine {

//此处一直用内部类来实现,上面定义了一个匿名内部类,此处给匿名内部类赋值

public void setNewValueInterface(NewValueInterface inft){

newValueInterface = inft;

}

//同上

public void setFactorNameDecoderInterface(FactorNameDecoderInterface inft){

factorNameDecoderInterface = inft;

}

}

以上

然后开始无情的 run 起来这个搜索工具

public class DiscoverEngine {

//首先传进来url地址

public void run(){

readUrl(baseUrl);

}

public void readUrl(String url){

// System.out.println("processing url " + url);

//此处用到session方法

Obj obj = obixClient.read(url);

if(obj == null){

return;

}

//新建一个Obj,用于储存 out 所对应的 value

Obj outObj = obj.get("out");//此处的out是储存的值(理解成标签的ID)

if(outObj != null){

//如果****那么就新建一个fi 将项目信息分项保存

if(this.factorNameDecoderInterface != null){

FactorInfo fi = factorNameDecoderInterface.decode(obj.getHref().get());

if(newValueInterface != null && fi != null){

//如果信息不为空,我们就要准备存读出来的数了

newValueInterface.onNewValue(fi, outObj.toString());

}

}

}

else{

for(Obj o : obj.list()){

readUrl(url + o.getHref());

}

}

}

}

下面用到了session

public class ObixClient {

public Obj read(String url){

try {

//根据我们传进去的url中读出一个obj,这个obj如果有value,就返回一个数,否则就返回地址 href="http://115.28.2.201:28088/obix/config/Drivers/NiagaraNetwork/Himalayas_PC/points/Himalayas_301/points/JF/"/>

Obj obj = session.read(new Uri(url));

return obj;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

}

将URL地址中的信息分项保存

public class FactorNameDecoderObixUrlImpl implements FactorNameDecoderInterface{

@Override

public FactorInfo decode(String url) {

String[] tokens = url.split(":")[2].split("\\/");

//新建一个 对象 将url中解析出的信息分享保存到这个对象中

FactorInfo fi = new FactorInfo();

fi.setDeviceName(tokens[tokens.length - 2]);

fi.setDeviceTypeName(tokens[tokens.length - 3]);

fi.setFactorName(tokens[tokens.length - 1]);

fi.setBuildName("");

fi.setFloorName("");

fi.setProjectName("");

return fi;

}

}

public class NewValueInterfaceImpl implements NewValueInterface{

static ConcurrentHashMap dataInfluxTime = new ConcurrentHashMap();

DeviceMapper deviceDao;

IDeviceManagementService deviceService;

DeviceTypeMapper deviceTypeDao;

BuildMapper buildDao;

Integer projectId;

HashMap buildNameToId = new HashMap();

HashMap deviceNumberToId = new HashMap();

public NewValueInterfaceImpl(Integer projectId, IDeviceManagementService deviceService, DeviceMapper deviceDao, DeviceTypeMapper deviceTypeDao,BuildMapper buildDao) {

this.deviceDao = deviceDao;

this.deviceTypeDao = deviceTypeDao;

this.buildDao = buildDao;

this.projectId = projectId;

this.deviceService = deviceService;

List bs = buildDao.selectByExample(new BuildExample());

for(Build b : bs){

buildNameToId.put(b.getName(), b.getId());

}

List ds = deviceDao.selectByExample(new DeviceExample());

for(Device d : ds){

deviceNumberToId.put(d.getNumber(), d.getId());

}

}

@Override

public void onNewValue(FactorInfo fi, String value) {

//先将URL中的设备名称信息取出来,然后再取出对应的ID

String number = fi.getDeviceName();

Integer deviceId = deviceNumberToId.get(number);

if(deviceId == null){

number = fi.getDeviceName();

Device record = new Device();

record.setName(number);

record.setNumber(number);

record.setProjectId(projectId);

record.setTypeId(fi.getDeviceTypeId());

deviceService.insert(record );

deviceId = record.getId();

System.out.println("found new device id=" + deviceId + ", name=" + number);

deviceNumberToId.put(number, deviceId);

}

Double val = null;

//然后将ID存入device中

Device updateRecord = new Device();

updateRecord.setId(deviceId);

//将取出的值也存入device

try{

Double d = Double.parseDouble(value);

updateRecord.setCurrentValue(d.intValue());

val = d;

}

catch(Exception e){

if(value.equalsIgnoreCase("true")){

updateRecord.setCurrentValue(1);

val = 1.0;

}

else if(value.equalsIgnoreCase("false")){

updateRecord.setCurrentValue(0);

val = 0.0;

}

}

if(updateRecord.getCurrentValue() != null){

deviceDao.updateByPrimaryKeySelective(updateRecord );

}

//将所得所得数据存入influxDB

try{

String timeKey = projectId+"_"+deviceId+"_"+fi.getFactorName();

Long t = dataInfluxTime.get(timeKey);

if(t == null) t = new Long(0);

Long now = System.currentTimeMillis();

if(now - t > 10 * 60 * 1000){

InfluxDBUtil.insert(projectId, deviceId, convert10Minutes(now), fi.getFactorName(), val);

dataInfluxTime.put(timeKey, now);

}

}

catch(Exception e){

e.printStackTrace();

}

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java7和java8切换_仍不切换到Java 8的6个理由

java7和java8切换Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后,就该退出了,避免吃盐。 所有的好东西都是有代价的,在这篇文章中,我将分享Java 8的主要痛点。请确保在升级和释放7之前您已经意识到了这些痛点。 1.并行…

python求阶乘之和_python计算阶乘前n项和

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 知道公式后就很简单了,利用for循环,第几行i1就等于几,当然python中是没有…

您需要了解的有关UI测试的所有信息

让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么? 接口,当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败,这就是为什么越来越多的人选择对其Web应用程序进行UI测试的原因。 …

python docx库使用样例_Python docx库用法示例分析

本文实例分析了Python docx库用法。分享给大家供大家参考,具体如下: 打开及保存文件: from docx import Document document Document(test.docx) document.save(test.docx) 添加文本: document.add_paragraph(test text) 调整文本…

使用java理解程序逻辑试卷_《使用Java理解程序逻辑》试题分析

1、在Java中,一下方法属于String类的有()A:insert(int offset,char [] c);B:replace(int start,int end String str);C:split(String regex);D:endsWith(String suffix);正确答案:C、D解析:A&am…

python合并word单元格_python之DataFrame实现excel合并单元格_python

这篇文章主要为大家详细介绍了python之DataFrame实现excel合并单元格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要…

java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据

展开全部服务器端源码:import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Se…

pooled-jms_Hibernate隐藏的宝石:pooled-lo优化器

pooled-jms介绍 在这篇文章中,我们将揭示一个序列标识符生成器,​​它结合了标识符分配效率和与其他外部系统的互操作性(同时访问底层数据库系统)。 传统上,有两种序列标识符策略可供选择。 序列标识符,对…

apache geode项目结构_Apache Flink-基于Java项目模板创建Flink应用(流计算和批计算)...

Apache Flink创建模板项目有2种方式:1. 通过Maven archetype命令创建;2. 通过Flink 提供的Quickstart shell脚本创建;关于Apache Flink的环境搭建,请参考相关链接:Apache Flink快速入门-基本架构、核心概念和运行流程A…

使用UriBuilder快速创建URI

如果您有权访问JAX-RS API和项目中的实现(很多这样做),则可以使用JAX-RS的UriBuilder通过使用可解析占位符的构建器模式方便地创建URI。 看下面的例子: String host System.getProperty( "host" , "localhost&qu…

python中列表和元组的相同点和不同点_详解Python语言中元组和列表的区别

本篇介绍Python中的元组数据类型,文中会讨论元组与列表的区别,元组的声明、赋值及其相关运算。通过本篇的学习,可以达成如下目标。 ● 掌握元组和列表的区别 ● 掌握元组的声明和赋值 ● 掌握适用于元组的相关运算 Python元组和Python列表数据…

mysql的复制订阅_如何删除发布与复制订阅数据库 'distribuion' 的方法

之前因为从VFP数据库中把数据导入到SQL SERVER2000中,用DTS做了发布与复制数据库distribution ,现在要把它删除,当在企业管理器中执行删除时,提示下面的错误:Error 3724: cannot drop the database distribution becau…

matlabif语句怎么用_公益心 码客行(2)—— 简单语句

回顾与反思&#xff1a;cout语句的用法关于第一课的思考与实践问题&#xff0c;有答案了吗——请写出这个程序的输出结果。#include using namespace std;int main(){cout<<1<cout<<12<return 0;}提示&#xff1a;输出结果如下。13即&#xff1a;输出项为数值…

java 多线程 聊天_Java做一个多线程类似于QQ的聊天程序。

展开全部//时间关系,粗略的做了一下,一个模拟UDP协议的测试,图标,IP,以及端口都可以设成//发送者端的电脑参数32313133353236313431303231363533e78988e69d8331333366306533!import java.awt.BorderLayout;import java.awt.Color;import java.awt.GridLayout;import java.awt.e…

组织机构代码输入测试用例_测试代码以用于过大的输入

组织机构代码输入测试用例在编写单元测试时&#xff0c;我们主要关注业务的正确性。 我们将竭尽所能&#xff0c;开开心心地走在最前沿。 我们有时会进行微基准测试并衡量吞吐量。 但是经常遗漏的一个方面是当输入过大时我们的代码如何表现&#xff1f; 我们测试了如何处理正常…

python子进程关闭fd_python – 捕获崩溃的子进程的“分段错误”...

shell可能会生成“Segmentation fault”消息.要找出该过程是否被SIGSEGV杀死,请检查proc.returncode -signal.SIGSEGV.如果要查看消息,可以在shell中运行该命令&#xff1a;#!/usr/bin/env pythonfrom subprocess import Popen, PIPEproc Popen(shell_command, shellTrue, st…

layui 分页 固定底部_论layui的使用体验

layui这个东西有收费跟免费版本&#xff0c;当然我在工作当中用的是免费的版本。至于说我为什么要用这个东西了&#xff1f;原因是这样的&#xff0c;当时我们用的是datatables&#xff0c;由于前期工作上没有相关的需求说是要什么表格相关列固定啊&#xff0c;自动统计啊&…

巴特沃斯滤波器python_如何用Scipy.signal.bu实现带通巴特沃斯滤波器

您可以跳过button的使用&#xff0c;而只需为过滤器选择一个顺序&#xff0c;看看它是否符合您的过滤条件。要生成带通滤波器的滤波器系数&#xff0c;请将滤波器阶数、截止频率Wn[low, high]&#xff08;表示为奈奎斯特频率的分数&#xff0c;即采样频率的一半&#xff09;和频…

章鱼扫描仪:Java构建工具和恶意软件

Alvaro Munoz最近在GitHub Security Lab网站上发布了“ Octopus扫描程序恶意软件&#xff1a;攻击开源供应链 ”。 我发现这篇文章很有趣&#xff0c;原因有很多&#xff0c;其中包括对Octopus Scanner恶意软件如何工作以及如何被发现&#xff0c; GitHub安全事件报告团队 &…

java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园

首先下载JDK&#xff0c;在http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本的JDK&#xff0c;选择平台为linux&#xff0c;就会得到一个二进制文件&#xff0c;我得到的是jdk-6u23-linux-i586.bin&#xff0c;复制到需要安装的地方运行就会自…