JAVA:通过电信ctg.ag.sdk从电信物联平台AIOT获取设备上报数据的简单示例

一、问题场景

物联设备比如NB设备通过NB协议将数据传到电信平台后,我们的应用服务如何从电信平台获取可用的上报数据。以下通过电信开发者平台提供的SDK来简单演示下整个过程。

二、使用电信 SDK进行开发

电信AIOT物联平台提供了两种方式获取平台数据,一种是HTTP方式,一种事SDK方式。推荐使用SDK方式,因为HTTP方式调用时可能会遇到一些不通或不稳定的情况。

电信平台提供了多种SDK,本示例使用JAVA SDK开发。电信平台提供了在线API调试,在开发程序前,可以先通过在线API来验证一下请求和响应的演示过程。参见我另一篇文章介绍物联网:从电信物联开发平台AIoT获取物联设备上报数据示例

下列调用设备数据查询接口getDeviceStatusHisInPage为例。

1.下载电信sdk的jar包

点击下载地址,从电信开发者平台下载两个jar包为,ag-sdk-biz-53266.tar.gz-20240517.102115-SNAPSHOT.jar和ctg-ag-sdk-core-2.8.0-20230508.100604-1.jar。

2.引入jar依赖包

        <dependency><groupId>com.ctg.ag.sdk.biz</groupId><artifactId>sdkpackage</artifactId><scope>system</scope><version>1.0</version><systemPath>${project.basedir}/lib/ag-sdk-biz-53266.tar.gz-20240517.102115-SNAPSHOT.jar</systemPath></dependency><dependency><groupId>com.ctg.ag.sdk.core</groupId><artifactId>sdkcore</artifactId><scope>system</scope><version>1.0</version><systemPath>${project.basedir}/lib/ctg-ag-sdk-core-2.8.0-20230508.100604-1.jar</systemPath></dependency>

程序实现方法源码如下:

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ctg.ag.sdk.biz.AepDeviceStatusClient;
import com.ctg.ag.sdk.biz.aep_device_status.GetDeviceStatusHisInPageRequest;
import com.ctg.ag.sdk.biz.aep_device_status.GetDeviceStatusHisInPageResponse;public ResultMsg ctGetDeviceStatusHisInPage(@RequestBody HashMap<String, Object> map) {String estr = "电信物联平台接口-用于测试物联上报数据 (ctGetDeviceStatusHisInPage)====:";ResultMsg rMsg = new ResultMsg(); //此类是返回对象类,你可以根据自己的需求来定义返回类型JSONObject jb;try {logger.info(estr + map.toString());String secret = "a2ze0b9su3";//密钥,到控制台->应用管理打开应用可以找到此值String appkey = "t9U2ykdRIO5";//appKey,到控制台->应用管理打开应用可以找到此值AepDeviceStatusClient client = AepDeviceStatusClient.newClient().appKey(appkey).appSecret(secret).build();//创建对应方法请求对象,不同的请求方法,对应不同的类名GetDeviceStatusHisInPageRequest request = new GetDeviceStatusHisInPageRequest();// 将入参转为json 字符串格式String bodyString=Comm.hashMapToJsonStr(map);request.setBody(bodyString.getBytes());	//具体格式见前面请求body说明//向电信平台发送请求GetDeviceStatusHisInPageResponse response= client.getDeviceStatusHisInPage(request);//返回响应信息if(response.getStatusCode()==200){//字符串转为json对象jb=Comm.strToJson(new String(response.getBody(),"UTF-8"));//将结果中的设备状态列表中转为数组JSONArray array=(JSONArray) jb.get("deviceStatusList");if(array==null){rMsg.Clear();rMsg.setResultMsg(jb.toString());return rMsg;}String data,state;//遍历数组,逐条解码,将对应设备上报数据中的点表(字节)转换为可用数据.(下列为该示例设备的点表字符串按厂家给的位数规则进行分拆转换)for (int i = 0; i < array.size(); i++) {jb=(JSONObject)array.get(i);//base64位转为16进制data=Comm.base64toHex(Comm.getString(jb.get("APPdata")));jb.put("APPdata",data);jb.put("imei",data.substring(4,20));jb.put("sim",data.substring(50,70));jb.put("curRead",Comm.hexToInt(data.substring(70,78))*0.01);//16进制转位10进制jb.put("cdateTime",data.substring(78,90));state=Comm.getStrAddPrefix(Comm.hexToBinary(data.substring(94,96)),"0",8);//16进制转2进制jb.put("powerState",state.substring(2,4));//1x 电池正常 0x 电池欠电jb.put("valveState",state.substring(4,6));//00 无阀 01 阀门关闭 10 阀门开启 11 阀门不到位}rMsg.setSuccess();rMsg.setList(Comm.toList(array));}logger.info(rMsg.toString());client.shutdown();return rMsg;} catch (Exception e) {map.clear();map.put("oper_module", estr);map.put("oper_content", estr + e.getMessage());logExceptServ.add(map);rMsg.setResultMsg(estr + e.getMessage());return rMsg;}}

以下是上述代码中使用到的方法,主要是在解析过程中使用到字节转换,你可以根据不同设备厂家提供的对应点表说明文档,依实际情况来按位数解析。本示例的设备是远传水表。

    /*** HashMap转json字符串*/public static String hashMapToJsonStr(HashMap<String, Object> map) {JSONObject jObject = new JSONObject();for (Map.Entry<String, Object> item : map.entrySet()) {jObject.put(item.getKey(), item.getValue());}return jObject.toString();}    /*** 将Json字符串转换为Json* @param json* @return*/public static JSONObject strToJson(String json) {// 将json字符串转换成jsonObjectreturn JSONObject.parseObject(json);}// base64转16进制public static final String base64toHex(String str) {byte[] data= Base64.getDecoder().decode(str);final StringBuffer sb = new StringBuffer(data.length * 2);for (int i = 0; i < data.length; i++) {sb.append(DIGITS[(data[i] >>> 4) & 0x0F]);sb.append(DIGITS[data[i] & 0x0F]);}return sb.toString();}private static final char[] DIGITS= {'0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};//十六进制转十进制public static int hexToInt(String hex) {return Integer.parseInt(hex,16);}/*** 字符串前补指定字符,指定总长度* @return java.lang.String* @Param [str 原字符串, c 前缀字符, allLen 总长度]* @Author quan* @Date 2020/12/29*/public static String getStrAddPrefix(String str, String c, int allLen) {while (str.length() < allLen) {str = c + str;}return str;}//十六进制转二进制public static String hexToBinary(String hex) {int hexint = Integer.parseInt(hex, 16);String binary = Integer.toBinaryString(hexint);return binary;}/*** 将对象类(或json格式的字符串)解析成List对象* @param object json格式:[{point_ids: "49,", road_ids: "32", officer_ids: "8f08537b00d74fa2b99120f3a2a1fd9a"}]* @return List<Object></>** @author qiang*/public static List<Object> toList(Object object) {List<Object> list = new ArrayList<>();if(object == null || object.equals(""))return null;// 将json字符串转换成jsonObjectJSONArray jsonArray = JSONArray.parseArray(object.toString());// 此时需要加个判断if (jsonArray.isEmpty()) {System.out.println("jsonArray 为空");} else {list.addAll(jsonArray);}return list;}

3.运行程序并调用接口后输出结果

补充说明

在引用电信SDK的两个依赖包后,本地开发环境运行正常,但若出现打包后在生产环境运行出错,提示电信jar中的某方法丢失,是因为该本地引用包没有打包到进去的原因。可以参见我这篇文章来解决:在IDEA引入本地jar包的方法并解决打包scope为system时发布无法打包进lib的方案。

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

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

相关文章

Mac 下载并激活IDEA

1.https://3.jetbra.in 打开这个网站,点击第一个网速比较快的连接 2.在新页面顶部有一个蓝色的下载链接文字< jetbra.zip(20220801) >点击下载 3.步骤2打开的页面不要关闭后面还有用 4.在idea官网下载idea对应的版本 https://www.jetbrains.com/idea/download/other.htm…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…

【方法】Word文档如何添加“打开密码”?

Word文档是很常用的办公文档&#xff0c;对于重要的文档&#xff0c;不想被他人随意查看&#xff0c;或者只有指定的人可以查看&#xff0c;我们可以给Word文档设置密码保护&#xff0c;这样只有知道密码的人才可以打开文档。 下面分享两种Word文档添加“打开密码”的方法&…

SAP 价格金额信息控制

1)migo / mb51/mb51/mb59 关于价格和金额的显示&#xff0c;需要权限控制&#xff0c;当权限对象F_BKPF_BUK,检查对应【公司代码】 和 ACTVT有03’的权限&#xff0c;如果没有03的权限&#xff0c;对应行的价格和金额显示为空 关于价格和金额的显示&#xff0c;需要权限控制&a…

媲美Sora,免费使用!带物理模拟的,文生视频模型

6月13日&#xff0c;知名3D建模平台Luma AI发布最新文生视频模型Dream Machine&#xff0c;向所有用户免费开放使用。 Dream Machine除了支持文本之外&#xff0c;还可使用图片作为引导来生成视频&#xff0c;其生成的视频质量、动作一致性、色彩、光影、饱和度、运镜等方面&a…

倾斜摄影优化之重:轻量化

老子云倾斜摄影轻量化 1、支持全网多端流畅展示 2、支持私有化部署 3、一键轻量化G级模型 4、多种精度选择 5、支持二次开发 &#xff08;1&#xff09;、压缩可达98%以上 &#xff08;2&#xff09;、多种精度任选&#xff1a;普清、标清、高清、超清 &#xff08;3&am…

# RocketMQ 实战:模拟电商网站场景综合案例(十一)

RocketMQ 实战&#xff1a;模拟电商网站场景综合案例&#xff08;十一&#xff09; 一、RocketMQ 实战&#xff1a;模拟电商网站场景综合案例-- web 端项目开发 1、在 shop-order-web 工程模块中&#xff0c;创建 Controller 类 OrderControllre.java /*** shop\shop-order…

“人事助理转产品经理”历险记

​好久没写就业喜报了 去年太忙&#xff0c;年后了&#xff0c;必须给大家把同学们就业的情况梳理一下分享出来。希望对大家有所帮助。 同学档案 原岗位&#xff1a;HR 地点&#xff1a;西安 工作年限&#xff1a;2年 转岗级别&#xff1a;中级产品经理 转岗工资&#xff1…

东胜物流软件 GetProParentModuTreeList SQL注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…

Windows同一文件夹下支持大小写同名文件

举例&#xff1a;同一文件目录下需要存在A.java, a.java, Windows是不支持的&#xff0c;这时候需要建一个Linux子系统的文件夹 创建教程 1、在启用或关闭Windows功能下面找到 适用于Linux系统的Windows子系统 2、cmd 执行命令 fsutil file SetCaseSensitiveInfo 文件夹路径 …

二十三、生成帮助文档

二十一、Java工具类的创建 二十二、Jar包制作及使用 这一篇开始学习如何生成帮助文档。为什么要学习生成帮助文档&#xff1f; 1、工具类已经制作好了&#xff0c;Java工具类的创建的类是一个.java文件&#xff0c;编译后成.class文件看不懂&#xff0c;所以需要对应的帮助文档…

自动化办公03 用xlrd和xlwt库操作excel.xls文件(老版本)

目录 一、读操作 二、写操作 三、设置单元格格式 0.综合案例 1.设置行高和列宽 2.设置字体样式 3.设置边框样式 4.设置对齐方式 5.设置背景颜色 6.合并单元格 四、 xlutils修改Excel⽂件内容 1.安装 2.使用 一、读操作 import xlrd# 1. 打开excel文件 wb xlrd.op…

电脑蓝屏怎么办?7个方法为你解决问题!

“我今天开电脑时&#xff0c;不知道为什么电脑突然就蓝屏了。大家有什么方法可以解决电脑蓝屏问题吗&#xff1f;” 在现代社会的快节奏中&#xff0c;电脑已经成为了我们工作和生活的重要伙伴。然而&#xff0c;当这个“伙伴”突然展现出它的“任性”一面——蓝屏时&#xff…

焦化行业排放平台简介

在当今社会&#xff0c;环保事业日益受到人们的关注。焦化行业作为重要的工业领域之一&#xff0c;其排放问题一直是环保工作的重点。为了有效控制焦化行业的排放&#xff0c;实施焦化行业排放平台成为了必不可少的措施。朗观视觉小编将详细探讨焦化行业排放平台的实施范围&…

MySQL之高级特性(三)

高级特性 分布式(XA)事务 存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面&#xff0c;甚至可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。XA事务中需…

最短路径Bellman-Ford算法和SPFA算法详解

目录 Bellman-Ford算法介绍 Bellman-Ford算法证明 Bellman-Ford算法实现 SPFA算法详解 Bellman-Ford算法介绍 Dijkstra算法可以很好的解决无负权图的最短路径问题&#xff0c;但是如果出现了负权边&#xff0c;Dijkstra算法就会失效。为了更好地求解有负权边的最短路径问…

第 5 章:面向生产的 Spring Boot

在 4.1.2 节中&#xff0c;我们介绍了 Spring Boot 的四大核心组成部分&#xff0c;第 4 章主要介绍了其中的起步依赖与自动配置&#xff0c;本章将重点介绍 Spring Boot Actuator&#xff0c;包括如何通过 Actuator 提供的各种端点&#xff08;endpoint&#xff09;了解系统的…

STM32程序启动过程

&#xff08;1&#xff09;首先对栈和堆的大小进行定义&#xff0c;并在代码区的起始处建立中断向量表&#xff0c;其第一个表项是栈顶地址&#xff08;32位&#xff09;&#xff0c;第二个表项是复位中断服务入口地址&#xff1b; &#xff08;2&#xff09;然后执行复位中断&…

人工智能AI概览

1、达特茅斯会议 2、人工智能元老 3、人工智能发展史 4、符号主义 5、连接主义 6、行为主义 7、三大学派优劣分析 8、人工智能 9、人工智能层次结构 10、机器学习、深度学习 11、人工智能现状 12、人工智能未来

HTML列表和表格标签

目录 1.列表标签 1.1无序列表 1.2有序列表 1.3定义列表 2. 表格标签、 2.1表格标签的属性 2.2合并单元格 1.列表标签 1.1无序列表 <ul>: [type 属性&#xff1a; disc( 实心圆点 )( 默认 ) 、 circle( 空心圆圈 ) 、 square( 实心方块 )] <li>: 列表中…