Java协议管理转换说明

jian436 2022-07-13 14:20:32
加精

通常是对厂家的通讯协议,适配转换成我们平台能识别的格式,暂时只适配Java内容协议的转换。
说明:产品标识必须和产品管理界面的产品标识一致,在启用协议的时候将Java代码写入到redis,属于该产品的设备都会走该转换协议。

img

img

厂家数据协议说明

比如下面的代码就是将

{
    "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;
    }
}
...全文
161 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
ThingLinks社区

162

社区成员

ThingLinks物联网一体化平台社区 版本将持续迭代更新,支持商业二开; 欢迎你分享物联网及平台相关技术文档;
物联网能源 开源
社区管理员
  • xiaonannet
  • jian436
  • 很久是多久
加入社区
帖子事件
编辑了帖子
2022-07-13 14:30
创建了帖子 (查看)
2022-07-13 14:20
社区公告

ThingLinks物联网一体化平台社区

https://gitee.com/mqttsnet/thinglinks

https://github.com/mqttsnet/thinglinks