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.mzph.cn/diannao/26480.shtml

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

相关文章

C语言 指针——字符数组与字符指针:字符串的表示与存储

目录 字符串常量 字符串变量&#xff1f; 字符数组的定义和初始化 字符指针的定义和初始化 将字符指针指向一个字符串 用字符数组保存一个字符串 将字符指针指向一个字符数组 使用字符指针的基本原则 使用指针的基本原则 字符串常量 字符串变量&#xff1f;  C 语言…

CSS动画(炫酷表单)

1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6yORMSqiaEKgpwibBgfcTQZNV0pI3M8t8HQm5XliaicSO42eBiboEUC3jxQOL1bRe0xlsd8bv04xXoKwg/640?wx_fmtgif&fromappmsg&wxfrom13 表单&#xff0c;也需要具有吸引力和实用性。HTML源码酷炫表单不仅能够提供给用户…

【lesson8】云备份服务端完整版代码

文章目录 util.hppconfig.hpphot.hppdata.hppserver.hppserver.ccMakefilecloud.conf util.hpp #pragma once #include <iostream> #include <fstream> #include <string> #include <vector> #include <sys/stat.h> #include <unistd.h> …

【零基础开始学习Linux】

学习Linux基础是一个循序渐进的过程&#xff0c;涵盖从基本命令到高级系统管理的多个方面。以下是一个详细的学习路径和资源推荐&#xff0c;帮助你从零基础开始学习Linux。 学习路径 1. 理解Linux基础概念 什么是Linux&#xff1a; 了解Linux的历史、不同的发行版以及其开源…

40. 【Java教程】数据库编程

本小节我们将学习如何使用 Java 语言结合数据库进行编程。注意&#xff0c;学习本小节需要你有一定的 SQL 基础&#xff0c;了解 MySQL 数据库的 基础 CRUD 操作。 本小节我们将选择开源免费的 MySQL 5.7 作为数据库&#xff0c;可以去官网下载并安装 MySQL。 通过本小节的学…

AI预测福彩3D采取888=3策略+和值012路或胆码测试6月13日新模型预测第3弹

今天咱们继续验证新模型的8码定位3&#xff0c;目前新模型新算法已连续命中2次。咱们重点是预测8码定位3&#xff0b;和值012胆码。有些朋友看到我最近两篇文章没有给大家提供缩水后的预测详情&#xff0c;在这里解释下&#xff1a;其实我每篇文章中既有8码定位&#xff0c;也有…

深入了解Laravel:PHP面试宝典

Laravel是目前最受欢迎的PHP框架之一,它以其优雅的语法和强大的功能深受开发者喜爱。在PHP开发的面试中,Laravel的知识点往往是重点考察的内容。本文将为你详细解析Laravel的核心知识点,帮助你在面试中脱颖而出。 一、Laravel简介 Laravel是一个基于MVC(模型-视图-控制器…

数据库学霸笔记

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【MySQL】性能分析

https://www.bilibili.com/video/BV1Kr4y1i7ru/?p78 查看执行频次 查看当前数据库的 INSERT, UPDATE, DELETE, SELECT 访问频次&#xff1a; SHOW GLOBAL STATUS LIKE Com_______; 或者 SHOW SESSION STATUS LIKE Com_______; 慢查询日志 慢查询日志记录了所有执行时间超过指…

【JVM】之常见面试题

文章目录 1.JVM中的内存区域划分2.JVM的类加载机制2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化2.6 类加载的时机 3 类加载器4.双亲委派模型5.JVM中的垃圾回收策略5.1 找谁是垃圾5.1.1 引用计数法5.1.2 可达性分析法 5.2 释放垃圾5.2.1 标记清除算法5.2.2 复制算法5.2.3 标记整…

CorelDRAW2024永久破解版下载安装全教程!

在设计领域&#xff0c;精准和专业是至关重要的要素。随着技术的飞速发展&#xff0c;设计师们对软件的选择也越发严苛。CorelDRAW 2024中文版及其2024终身永久版、破解版&#xff0c;因其强大的功能和便捷的使用体验&#xff0c;成为了设计师们的首选之一。本文将深入探讨这一…

网络编程入门

文章目录 网络编程入门计算机网络基础计算机网络发展史TCP/IP模型网络应用模式 基于HTTP协议的网络资源访问HTTP&#xff08;超文本传输协议&#xff09;JSON格式requests库 基于传输层协议的套接字编程TCP套接字UDP套接字 网络应用开发发送电子邮件发送短信 网络编程入门 计算…

大模型时代已至,产品经理如何紧跟时代步伐?

前言 在数字化浪潮的推动下&#xff0c;人工智能领域正迎来一场技术革命&#xff0c;而大模型技术的崛起无疑是这场革命中的明星。作为产品经理&#xff0c;我们不仅要洞察市场趋势&#xff0c;更要紧跟技术发展&#xff0c;以创新的思维和敏锐的洞察力&#xff0c;引领产品走…

C语言中各数据类型占用字节和值范围

64位编译器 数据类型占用字节值范围char1-128 ~ 127unsigned char10 ~ 255short2-32768 ~ 32767unsigned short20 ~ 65535int4-2147483648 ~ 2147483647unsigned int40 ~ 4294967295float41.17549435110^-38 ~ 3.40282346610^38double82.225073858507201410^-308 ~ 1.79769313…

git 常用的命令

git 常用的命令 一、基础命令1.1 初始化1.2 添加文件1.3 查看缓存区中的文件1.4 查看上次提交到缓存区中的文件1.5 文件从缓存区取出1.6 提交文件1.6 查看提交中包含的文件1.7 查看commit记录 二、回退命令2.1 git reset2.2 将文件从暂存区取出2.3 将文件从仓库取出2.3.1 保留工…

YOLOv5+单目测距(python)

YOLOv5单目测距&#xff08;python&#xff09; 1. 相关配置2. 测距原理3. 相机标定3.1&#xff1a;标定方法13.2&#xff1a;标定方法2 4. 相机测距4.1 测距添加4.2 细节修改&#xff08;可忽略&#xff09;4.3 主代码 5. 实验效果 相关链接 1. YOLOV7 单目测距&#xff08;p…

每日一题——Python实现PAT甲级1112 Stucked Keyboard(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度 空间复杂度 总结 我要更强 代码分析 时间复杂度 空间复杂度…

TDengine防火墙配置

TDengine 部署时建议禁用防火墙&#xff0c;对于有安全要求必须启用防火墙的的场景&#xff0c;可以只开放 TDengine 相关端口。 TDengine 端口列表 TDengine 不同版本使用的端口也不尽相同&#xff0c;以下是不同版本的端口列表。 TDengine 2.x 端口协议描述6030-6035TCP/…

组织创新|AI赋能敏捷实践,助力企业敏捷转型

在工业5.0时代&#xff0c;随着项目变得越来越复杂&#xff0c;对效率的需求也在增长&#xff0c;致力于敏捷转型的组织正在寻求创新的解决方案来应对常见的挑战&#xff1a;工作量不平衡、低效的任务分配和知识孤岛等等。对此&#xff0c;AI等尖端技术的潜力可以帮助实现更高效…

第五站:Java金——Spring框架的璀璨殿堂(一)

第五站&#xff1a;Java金——Spring框架的璀璨殿堂 踏入Java金的领域&#xff0c;我们来到了Spring框架的璀璨殿堂&#xff0c;这里是现代Java企业级应用开发的瑰宝。Spring通过其核心特性——依赖注入&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;…