目录
前言
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@Overridepublic 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);}