查看: 2181|回复: 1

[原创] 钛极小龟——OneNET数据点上报

[复制链接]
  • TA的每日心情
    无聊
    2020-4-14 13:20
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2018-12-17 02:36:03 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 孤胆枪手_A 于 2018-12-17 02:37 编辑

    https://github.com/TiJOSApp/tijos-mqtt-onenet-iot下载下来参看我上一篇帖子修改一下错误,然后去onenet平台创建一个设备
    在代码中修改设备id、产品id、APIKey
    然后再创建两个数据流模板
    QQ截图20181217022701.png
    注意数据流的名称需要与后面json数据的名相同,因为上传上去的json数据是对应数据流的
    1. JSONObject json = new JSONObject();
    复制代码
    注意,重点来了,
    修改topic 为 $dp
    然后参看OneNET的平台的MQTT文档,我这里使用type3的数据上报格式,如下
    设备使用publish报文来上传数据点, 报文格式如下:

        VariableHeader
      
      
    Field名称
    说明
    格式
    Field1
    TopicName=$dp
    $dp为系统上传数据点的指令
    2字节字串长度 + utf8

    Payload:
    Payload包含真正的数据点内容,支持的格式如下

    数据类型3(type == 3)格式说明:
      
    Byte 1
      
    数据点类型指示:type=3    // JSON格式2字符串
    0
    0
    0
    0
    0
    0
    1
    1
    Byte 2
    //指示后面字符串长度
      
    固定两字节长度高位字节,值为0x00
    Byte 3
    固定两字节长度低位字节,值为0x46
    Byte 4
    通用格式:
      
    {
      
    “datastream_id1”:”value1”,  
      
    “datastream_id2”:”value2”,
      
      
    }
      
      
    示例:
      
    {“temperature”:22.5,”humidity”:”95.2%”}
      
      
      
    Byte n
    看到Payload不仅仅是json字符串的byte数组,还有3byte的固定指定内容,为了方便,我写了一个简单的方法来封装这一段数据
    1. /**
    2.          * 构建数据上报类型3的byte数组
    3.          * @param jsonString json字符串
    4.          * @return 构建成功的byte数组
    5.          */
    6.         public static byte[] type3Bytes(String jsonString) {
    7.                 int length = jsonString.length();
    8.                 byte[] payload3 = new byte[length + 3];
    9.                 payload3[0] = 0x03;
    10.                 payload3[1] = (byte) (length >> 8);
    11.                 payload3[2] = (byte) (length);
    12.                 byte[] jsonBytes = jsonString.getBytes();
    13.                 for (int i = 0; i < length; i++) {
    14.                         payload3[3 + i] = jsonBytes[i];
    15.                 }
    16.                 return payload3;
    17.         }
    复制代码
    只需要传入json字符串即可输出符合OneNET规定的byte数据。publish的时候只需要这样就可以了。
    1.     mqttClient.publish(topic, OneNETUtil.type3Bytes(json.toString()), 0, true);
    复制代码
    按照https://open.iot.10086.cn/app_editor/docs/ 文档创建一个应用,就能看到自己上传的代码。
    QQ截图20181217023535.png
    附上完整代码
    demo4.zip (1.95 KB, 下载次数: 7)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    4 小时前
  • 签到天数: 1781 天

    连续签到: 41 天

    [LV.Master]伴坛终老

    发表于 2018-12-17 12:03:18 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-3 17:35 , Processed in 0.128844 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.