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

news2024/12/25 9:20:16

一、问题场景

物联设备比如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字符串转换成jsonObject
        return 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字符串转换成jsonObject
        JSONArray 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.coloradmin.cn/o/1807301.html

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

相关文章

Virtual Memory Primitives for User Program翻译

Virtual Memory Primitives for User Program 安德鲁阿普尔&#xff08;Andrew Appel&#xff09;和李凯&#xff08;Kai Li&#xff09; 普林斯顿大学计算机科学系 摘要 传统上&#xff0c;内存管理单元&#xff08;MMUS&#xff09;被操作系统用于实现磁盘分页的虚拟内存…

cisco packet tracer 8.2.2 安装配置 基础教程 免登录免破解 简单方便

1 官网下载&#xff0c;需要账号 2 安装 3 启动之前&#xff0c;直接断网&#xff0c;禁用网卡(⊙﹏⊙) #汉化 #重新打开Cisco Packet Tracer

Apollo9.0 PNC源码学习之Control模块(一)

0 前言 从planning的角度看control&#xff0c;首先需要了解的就是相关的数据接口&#xff0c;规划出的轨迹&#xff08;路径速度&#xff09;发给Control模块去执行 modules/planning/planning_component/planning_component.cc planning模块发布轨迹信息 planning_writer_ …

计算机网络9——无线网络和移动网络2无线个人区域网 WPAN

文章目录 一、蓝牙系统二、低速 WPAN三、高速 WPAN 无线个人区域网WPAN(Wireless Personal Area Network)就是在个人工作的地方把属于个人使用的电子设备(如便携式电脑、平板电脑、便携式打印机以及蜂窝电话等)用无线技术连接起来自组网络&#xff0c;不需要使用接入点AP&#…

DP:回文串模型

一、回文子串 . - 力扣&#xff08;LeetCode&#xff09; 该题有3种解法 &#xff08;1&#xff09;中心扩展算法&#xff08;在字符串章节有介绍&#xff09;时间复杂度O&#xff08;N^2&#xff09;,空间复杂度O&#xff08;1&#xff09; &#xff08;2&#xff09;马丁车…

小冬瓜AIGC 手撕LLM 拼课

小冬瓜aigc手撕LLM学习 官方认证 手撕LLMRLHF速成班-(附赠LLM加速分布式训练超长文档&#xff09; 帮助多名同学上岸LLM方向&#xff0c;包括高校副教授&#xff0c;北美PhD&#xff0c;大厂等 课程名称【手撕LLMRLHF】 授课形式&#xff1a;在线会议直播讲解课后录播 时间&…

Nvidia的成功与竞争:CEO黄仁勋的自信与挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【将xml文件转yolov5训练数据txt标签文件】连classes.txt都可以生成

将xml文件转yolov5训练数据txt标签文件 前言一、代码解析 二、使用方法总结 前言 找遍全网&#xff0c;我觉得写得最详细的就是这个博文⇨将xml文件转yolov5训练数据txt标签文件 虽然我还是没有跑成功。那个正则表达式我不会改QWQ&#xff0c;但是不妨碍我会训练ai。 最终成功…

LangChain基础知识入门

LangChain的介绍和入门 1 什么是LangChain LangChain由 Harrison Chase 创建于2022年10月&#xff0c;它是围绕LLMs&#xff08;大语言模型&#xff09;建立的一个框架&#xff0c;LLMs使用机器学习算法和海量数据来分析和理解自然语言&#xff0c;GPT3.5、GPT4是LLMs最先进的代…

架构设计-用户信息及用户相关的密码信息设计

将用户的基本信息和用户密码存放在不同的数据库表中是一种常见的安全做法&#xff0c;这种做法旨在增强数据的安全性和管理的灵活性。以下是这种做法的几个关键原因&#xff1a; 安全性增强&#xff1a; 当用户密码被单独存放在一个表中时&#xff0c;可以使用更强大的加密和哈…

kafka集成SpringBoot api编写教程

1.新建项目 用的idea是20222.1.3版本&#xff0c;没有Spring Initializr 插件&#xff0c;不能直接创建springboot项目 可以在以下网址创建项目&#xff0c;下载后解压&#xff0c;然后用idea打开项目即可 1.1 在 https://start.spring.io/ 上创建项目 1.2上传到linux&#x…

C语言 | Leetcode C语言题解之第140题单词拆分II

题目&#xff1a; 题解&#xff1a; struct Trie {int ch[26];bool flag; } trie[10001];int size;void insert(char* s, int sSize) {int add 0;for (int i 0; i < sSize; i) {int x s[i] - a;if (trie[add].ch[x] 0) {trie[add].ch[x] size;memset(trie[size].ch, 0…

读AI未来进行式笔记07量子计算

1. AI审讯技术 1.1. 发明者最初的目的是发明一种能够替代精神药物&#xff0c;为人类带来终极快乐的技术 1.1.1. 遗憾的是&#xff0c;他找到的只是通往反方向的大门 1.2. 通过非侵入式的神经电磁干扰大脑边缘系统&#xff0c;诱发受审者最…

配置 JDK 和 Android SDK

目录 一、配置JDK 1. 安装 JDK 2. JDK 环境配置 3. JDK的配置验证 二、配置 adb 和Android SDK环境 1、下载 2、配置 Android SDK 环境 一、配置JDK 1. 安装 JDK 安装链接&#xff1a;Java Downloads | Oracle 我安装的是 .zip &#xff0c;直接在指定的文件夹下解压就…

[沉迷理论]进制链表树

往期文章推荐&#xff1a; 题解之最大子矩阵-CSDN博客 洛谷P1115最大子段和[神奇的题目]-CSDN博客 &#xff08;一条神奇的分割线&#xff09; 前言 好久没有更新的我总算在百忙之中抽出时间写了篇博客。 最近总算结束了动态规划的学习&#xff0c;真的是头昏脑涨啊。 最…

论文阅读——MIRNet

项目地址&#xff1a; GitHub - swz30/MIRNet: [ECCV 2020] Learning Enriched Features for Real Image Restoration and Enhancement. SOTA results for image denoising, super-resolution, and image enhancement.GitHub - soumik12345/MIRNet: Tensorflow implementation…

【云岚到家】-day02-1-区域服务后续开发及完善

【云岚到家】-day02-1-区域服务后续开发及完善 1 区域服务后续开发1.1 添加区域服务1.1.1 接口定义1.1.1.1 接口设计1.1.1.2 接口定义-json 1.1.2 接口开发1.1.2.1 mapper1.1.2.2 service1.1.2.3 controller 1.1.3 测试 1.2 修改价格1.2.1 接口定义1.2.1.1 接口设计1.2.1.2 接口…

【RAG入门教程01】Langchian框架 v0.2介绍

LangChain 是一个开源框架&#xff0c;旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…

动态规划(多重背包+完全背包)

P2851 [USACO06DEC] 最少的硬币 G 题解&#xff1a;从题目上看到那个有n种不同的货币&#xff0c;对于买家来说每个货币有C[ i ]个&#xff0c;是有限个数的&#xff0c;但是对于卖家来说 每个货币都是无限的&#xff0c;题目中要我们求的是买到这个物品的最小交易的货币数&…

电子设计入门教程硬件篇之集成电路IC(二)

前言&#xff1a;本文为手把手教学的电子设计入门教程硬件类的博客&#xff0c;该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC&#xff0c;这些集成电路IC包括&#xff1a;逻辑门芯片、运算放大器与电子零件。电子设计…