444
社区成员




通常是对厂家的通讯协议,适配转换成我们平台能识别的格式,暂时只适配Java内容协议的转换。
说明:产品标识必须和产品管理界面的产品标识一致,在启用协议的时候将Java代码写入到redis,属于该产品的设备都会走该转换协议。
比如下面的代码就是将
{
"rxInfo": [
{
"altitude": 0,
"rssi": -21,
"latitude": 0,
"name": "Local Gateway",
"time": "2022-07-13T06:08:43.895294Z",
"loRaSNR": 13.8,
"mac": "24e124fffef542e2",
"longitude": 0
}
],
"txInfo": {
"dataRate": {
"modulation": "LORA",
"bandwidth": 125,
"spreadFactor": 7
},
"adr": true,
"codeRate": "4/5",
"frequency": 471700000
},
"data": "A2f5AARofgV9lAEGc9Qm",
"fPort": 85,
"time": "2022-07-13T06:08:43.895294Z",
"applicationID": "1",
"fCnt": 63,
"deviceName": "CO2",
"applicationName": "MQTT",
"devEUI": "24e124126b122724"
}
转换成
{
"devices": [
{
"services": [
{
"data": {
"co2": 404,
"temperature": 24.900000000000002,
"humidity": 63,
"pressure": 994.0
},
"eventTime": 1657692525452,
"serviceId": "serdsd123"
}
],
"deviceId": "24e124126b122724"
}
]
}
传入厂家传过来的数据,获取到msg下面的data数据,将十六进制的数据转换成十进制,输出我们要的格式。
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import java.math.BigInteger;
import java.util.Date;
public class newtest {
public static void main(String[] args) throws Exception {
String injson = "";
if (args != null && args.length != 0) {
injson = args[0];
}
JSONObject parsejson = JSONObject.parseObject(injson);
System.out.println(Convert2SystemJSON(parsejson));
}
public static String Convert2SystemJSON(JSONObject injsonobj) throws Exception {
String hexdata = ((JSONObject) injsonobj.get("msg")).get("data").toString();
byte[] bt = java.util.Base64.getDecoder().decode(hexdata);
JSONObject data = hex2wsdjsonobj(bt);
JSONArray services = new JSONArray();
JSONObject server = new JSONObject();
server.put("serviceId", "serdsd123");
server.put("data", data);
server.put("eventTime", new Date());
services.add(server);
JSONObject dev = new JSONObject();
dev.put("deviceId", ((JSONObject) injsonobj.get("msg")).get("devEui"));
dev.put("services", services);
JSONArray devices = new JSONArray();
devices.add(dev);
JSONObject root = new JSONObject();
root.put("devices", devices);
return root.toJSONString();
}
/**
* 十六进制转换成10进制 负数也能转换
*/
public static int hex16convert2(String hex) throws Exception {
if (hex.length() != 4) {
throw new Exception("必须是4个长度");
}
int bit1 = Integer.parseInt(hex.substring(0, 1), 16);
if (bit1 < 8)
{
return Integer.parseInt(hex, 16);
} else {
return new BigInteger("FFFF" + hex, 16).intValue();
}
}
/**
* 温湿度解码
*/
private static JSONObject hex2wsdjsonobj(byte[] bt) throws Exception {
javax.xml.bind.annotation.adapters.HexBinaryAdapter hexBinaryAdapter = new HexBinaryAdapter();
JSONObject data = new JSONObject();
String temp = hexBinaryAdapter.marshal(new byte[]{bt[2]});
String temp2 = hexBinaryAdapter.marshal(new byte[]{bt[3]});
String changtemp = change(temp, temp2);
data.put("temperature", hex16convert2(changtemp) * 0.01);
temp = hexBinaryAdapter.marshal(new byte[]{bt[4]});
temp2 = hexBinaryAdapter.marshal(new byte[]{bt[5]});
changtemp = change(temp, temp2);
data.put("humidity", hex16convert2(changtemp) * 0.01);
temp = hexBinaryAdapter.marshal(new byte[]{bt[8]});
temp2 = hexBinaryAdapter.marshal(new byte[]{bt[9]});
changtemp = change(temp, temp2);
data.put("battery", hex16convert2(changtemp));
return data;
}
public static String change(String start, String end) {
return end + start;
}
}
找不到 依赖
这个协议转换 和thinglinks-modules-protocolAnalysis这个解析有啥不同