目录
前言
最近这段时间,一直在用开源的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);
}