基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的编解码

news2024/10/24 17:59:25

目录

前言

1.下载官方协议包

2.解压

3.自定义主题

4.重写解码方法

5.以下是我解析后接收到的数据



前言

        最近这段时间,一直在用开源的Jetlinks物联网平台在学习,偶尔有一次机会接触到物联网设备对接,在协议对接的时候,遇到了各种各样的问题,最近遇到协议包解析的问题,所以想总结一下。

1.下载官方协议包

        官方协议包下载地址:JetLinks物联网基础平台/jetlinks-official-protocol

2.解压

        解压到指定目录,并且用IDEA打开。

3.自定义主题

       3.1 找到TopicMessageCodec,自定义主题,如下图所示

        3.2  自定义主题相关代码

 jingkongtopicdata("xxx/xxx/*/**",
            ReportPropertyMessage.class,
            route -> route
                    .upstream(true)
                    .downstream(false)
                    .group("属性上报")
                    .description("上报xxx数据")
                    .example("{\"properties\":{\"属性ID\":\"属性值\"}}")),

        3.3 改完之后需要添加到路由

        找到JetLinksProtocolSupportProvider类,按照下面的方式添加路由即可

4.重写解码方法

  找到 JetLinksMqttDeviceMessageCodec类,添加以下代码,按照自己的方式进行数据解析,这样就能拿到自己想要的mqtt数据了。

   /**
     * 
     * @param context
     * @return
     */
    @Nonnull
    @Override
    public Flux<DeviceMessage> decode(@Nonnull MessageDecodeContext context) {

        MqttMessage message = (MqttMessage) context.getMessage();
        ReportPropertyMessage deviceMessage = new ReportPropertyMessage();
        String topic =  message.getTopic();
        if (topic.contains("Login")){
            String replyTopic = topic.replace("Post","PostRsp");
        }
        String topics[] = topic.split("/");
        deviceMessage.setDeviceId(topics[2]);
        deviceMessage.setMessageId(String.valueOf(System.currentTimeMillis()));
        byte[] payload = message.payloadAsBytes();
        String encoding ="UTF-8";
        String msg =null;
        Map<String,Object>jingkongTmp  = null;
        try {
            msg = new String(payload,encoding);
            Map<String, Object> map = new HashMap<>();
            if (null!=msg&& !msg.equals("")){
                map.putAll(JSON.parseObject(msg, new TypeReference<Map<String, Object>>(){}));
            }
           
            JSONObject jsonObject =  JSONObject.parseObject(msg);
            JSONArray jsonArray  = jsonObject.getJSONArray("data");
            int len = jsonArray.size();
            if (len == 5){
                
                jingkongTmp = new HashMap<>();
                Map mapString = JSONObject.parseObject(msg,Map.class);
                jingkongTmp.put("dataReport1",mapString);
              
                deviceMessage.setProperties(jingkongTmp);
                System.out.println("json =="+ JSONObject.toJSONString(deviceMessage));
            }else {
                jingkongTmp = new HashMap<>();
                Map mapString = JSONObject.parseObject(msg,Map.class);
                jingkongTmp.put("dataReport2",mapString);
            
                deviceMessage.setProperties(jingkongTmp);
                System.out.println("json =="+ JSONObject.toJSONString(deviceMessage));
            }
        }catch (Exception e){
            e.getMessage();
        }
       
        return Flux.just(deviceMessage);
    }

5.以下是我解析后接收到的数据

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

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

相关文章

Spring面试题——第五篇

1. Spring的优点 轻量级和非侵入性&#xff1a;不需要引入大量的依赖和配置。面向切面编程&#xff1a;Spring提供了强大的面向切面编程&#xff0c;允许用户定义横切关注点&#xff0c;并将其与核心业务逻辑分离&#xff0c;提高了灵活性。依赖注入&#xff08;DI&#xff09…

java对接钉钉发送消息(纯萌新文档解惑)

java对接钉钉&#xff08;纯萌新文档解惑&#xff09; 注意&#xff1a;不是其他直接给你个写好的钉钉工具类&#xff0c;但不知道它怎么来的。是以钉钉官方文档为准&#xff0c;流程是什么&#xff0c;你想要什么可以自己在文档找&#xff08;所有文档都有只是萌新看着懵&…

Kafka高可用性原理深度解析

在分布式系统中&#xff0c;高可用&#xff08;High Availability, HA&#xff09;是指系统在面对硬件故障、网络分区、软件崩溃等异常情况时&#xff0c;仍能继续提供服务的能力。对于消息队列系统而言&#xff0c;高可用性尤为重要&#xff0c;因为它通常作为数据流通的中枢&…

SSD | (十)PCIe介绍(上)

文章目录 📚从PCIe的速度说起📚PCIe拓扑结构🐇PCI——总线型拓扑结构🐇PCIe——树形拓扑结构📚PCIe分层结构📚PCIe TLP类型📚PCIe TLP结构🐇通用结构🐇具体TLP的Header📚从PCIe的速度说起 PCIe发展至今,速度一代比一代快。 连接速度所示1、2等是指PCIe链接…

Python 打包成 EXE 的方法详解

#1024程序员节&#xff5c;征文# 日常开发中&#xff0c;python由于其便捷性成为了很多人的首选语言&#xff0c;但是python的环境配置也是有点麻烦的&#xff0c;那么我们如何让其变得更加友好呢&#xff1f;没错&#xff0c;就是打包成exe可执行文件。 一、PyInstaller 简介…

修改windows11的hosts,配置127.0.0.1域名(最清晰)

这里记录的是学习短链接项目&#xff0c;通过配置127.0.0.1域名&#xff0c;达到可以通过域名代替127.0.0.1访问127.0.0.1下的某个端口的服务&#xff0c;达到短链接的前缀的效果&#xff0c;这里展示windows11的更改过程。 一、hosts文件路径 C:\Windows\System32\drivers\e…

【Java数据结构】---哈希表

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 在顺序结构以及平衡树中&…

littlefs源码分析1-设计思考

1.littlefs设计目的 littlefs 最初是作为一个实验而构建的&#xff0c;目的是在微控制器的环境中了解文件系统设计。目的是&#xff1a;构建一个在不使用无限制内存的情况下对电源丢失和闪存磨损具有弹性的文件系统。 这对嵌入式文件系统littlefs提出了三个主要要求&#xff1…

【Linux】 exit 和 _exit 的区别

在Linux系统中&#xff0c;exit(int status) 和 _exit(int status) 都是用来终止进程的函数&#xff0c;都能通过参数 int status传递一个整型的退出状态码给父进程&#xff0c;但它们之间有一些重要的区别。 1. 头文件不同 exit() 函数定义在 <unistd.h> 中 _exit() 函…

【Python爬虫实战】高效解析和操作XML/HTML的实用指南

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、lxml的安装 &#xff08;一&#xff09;使用 pip 安装 &#xff08;二&…

(一)ubuntu下通过c++编译cpu版本paddleocr-2.8.1

编译环境 操作系统&#xff1a;ubuntu 20.04/22.04 OCR版本&#xff1a;paddleocr 2.8.1 Opencv版本&#xff1a;opencv3.4.16/4.10.0 o参照官方文档&#xff1a; PaddleOCR/deploy/cpp_infer/readme_ch.md at release/2.6 PaddlePaddle/PaddleOCR GitHubhttps://github…

Vue3脚手架和指令

什么是Vue&#xff1f; 简单来说&#xff0c;vue就是可以让有写代码很爽的体验。 概念&#xff1a;Vue是一套构建用户界面的渐进式JavaScript框架。 什么是构建用户界面&#xff1f; 基于数据渲染出用户可以看到的界面 什么是渐进式&#xff1f; 渐进式就是循序渐进的学习…

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中&#xff0c;继承和重载是面向对象编程&#xff08;OOP&#xff09;中的重要概念。通过合理运用继承与重载&#xff0c;不仅能提高代码的复用性和灵活性&#xff0c;还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载&#xff0c;并…

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …

Java 多线程(五)—— 阻塞队列、wait、notify

wait wait 和 notify 都是 Object 类提供的方法&#xff0c;也就是说 Java 任意对象都可以使用 这两个方法。 首先 wait 会抛出 InterruptedException 这个异常&#xff0c;说明这个方法可以被 interrupt 给唤醒。 然后我们是不能直接使用 wait 方法的&#xff0c;否则还会抛…

Win10系统安装docker操作步骤

Docker下载 docker下载地址&#xff1a;Docker: Accelerated Container Application Development 打开网页后&#xff0c;点击图下所示&#xff0c;下载windows版本的docker 启用Hyper-V 和容器特性 右键左下角windows图标&#xff0c;选择应用和功能 然后在下面的界面中&am…

电脑技巧:Rufus——最佳USB启动盘制作工具指南

目录 一、功能强大&#xff0c;兼容性广泛 二、界面友好&#xff0c;操作简便 三、快速高效&#xff0c;高度可定制 四、安全可靠&#xff0c;社区活跃 在日常的电脑使用中&#xff0c;无论是为了安装操作系统、修复系统故障还是进行其他需要可引导媒体的任务&#xff0c;拥…

初始JavaEE篇——多线程(2):join的用法、线程安全问题

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 模拟实现线程中断 join的用法 线程的状态 NEW&#xff1a; RUNNABLE&#xff1a; TIMED_WAITING&#xff1a; TERMINATED…

ElasticSearch-7.17.10集群升级至ElasticSearch-7.17.24

文章目录 集群概览 主机名系统版本es01CentOS_7.6-aaarch64ElasticSearch-7.17.10es02CentOS_7.6-aaarch64ElasticSearch-7.17.10es03CentOS_7.6-aaarch64ElasticSearch-7.17.10 需求 1. 将三台ES节点从ElasticSearch-7.17.10升级至ElasticSearch-7.17.24&#xff1b; 2. 保证…

1212,查询球队积分

查询球队积分 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表…