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

目录

前言

1.下载官方协议包

2.解压

3.自定义主题

4.重写解码方法

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



前言

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

1.下载官方协议包

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

2.解压

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

3.自定义主题

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

3.2 自定义主题相关代码

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

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

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

4.重写解码方法

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

java 复制代码
   /**
     * 
     * @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.以下是我解析后接收到的数据

相关推荐
振浩微433射频芯片36 分钟前
告别“喊破嗓”:深度解析433MHz射频在宠物训练器中的核心应用与选型
单片机·嵌入式硬件·物联网·学习·宠物
武汉唯众智创1 小时前
全栈物联网实训平台拆解:通信协议+边缘AI+实战源码
人工智能·物联网·嵌入式开发·物联网实训平台·高校实训·python物联网
Yeats_Liao2 小时前
物联网接入层技术剖析(三):epoll在JVM中的映射
java·linux·jvm·人工智能·物联网
华清远见IT开放实验室3 小时前
硬核根基,智能载体:华清远见嵌入式“硬件+仿真+课程+师资”产教融合与实践教学方案
linux·人工智能·stm32·物联网·嵌入式·虚拟仿真
三易串口屏4 小时前
实验2 实时显示单片机的参数(整数、小数、中文 自定义协议方式)
单片机·物联网·mongodb·自动化·串口屏·医疗器械·工控设备
Yeats_Liao4 小时前
物联网接入层技术剖析(四):当epoll遇见MQTT
java·linux·服务器·网络·物联网·架构
柱子jason4 小时前
基于IOT-Tree Server,配合IOT-Tree AI Edge实现手势识别
物联网·ai·手势识别·iot-tree
振浩微433射频芯片5 小时前
告别“遥控失灵”:如何评估国产433芯片在智能家居领域的可靠性?
网络·单片机·嵌入式硬件·物联网·智能家居
MetrixAeroCore5 小时前
Metrix Aero Core国际物联网卡是什么?形态、优势与适用场景解析
物联网
XTIOT6667 小时前
俄罗斯诚信标签Chestny ZNAK技术约束分析与智能化应对思路
大数据·人工智能·嵌入式硬件·物联网