iotdb 写入 iot数据接入_物联网

在IoT场景中,很多传感器采集到的是私有协议二进制数据流,设备端又不具备转换成结构化JSON的能力,这时设备可以通过自定义Topic上报二进制数据,在IoT物联网平台支持云端配置解析脚本,动态转换成结构化的JSON数据

完整端到端开发过程如下:

  1. 明确二进制上报Topic和数据规则
  2. 云端预先配置针对指定Topic的原始数据配置JS解析脚本
  3. 在脚本解析模拟数据输入,校验脚本业务逻辑正确后,提交到IoT云端
  4. 运行设备,指定Topic上报原始数据
  5. 云端日志服务查看数据解析过程

我们以手表为例,传感器上报hex进制数据,到IoT物联网平台,在云端解析,最终以结构化JSON流转到业务系统。



一、技术架构

设备端二进制数据在云端 IoT 平台转换链路,如下图:

iotdb 写入 iot数据接入_物联网_02

消息转换前后变化:

iotdb 写入 iot数据接入_docker_03



二、IoT物联网平台 云端开发

创建产品和消息通信Topic选择:

iotdb 写入 iot数据接入_docker_04

原始数据:

0x035e8192fd0000000d0000001b00000a8c

数据业务格式:

iotdb 写入 iot数据接入_传感器_05

在控制台产品详情>数据解析 配置并提交脚本

iotdb 写入 iot数据接入_传感器_06

完整脚本内容如下:

function transformPayload(topic, rawData) {
/*
原始hex数据 : 0x035e8192fd0000000d0000001b00000a8c
转换后JSON数据 : 
{
  "heartbeat": 15,
  "id": 1585549855,
  "steps": 2700,
  "speed": 56
}
*/
    var jsonObj = {}
    if (topic.endsWith('/user/update')) {
            var uint8Array = new Uint8Array(rawData.length);
            for (var i = 0; i < rawData.length; i++) {
                uint8Array[i] = rawData[i] & 0xff;
            }
            var dataView = new DataView(uint8Array.buffer, 0);
            var fHead = uint8Array[0]; 
            if (fHead == 0x03) {// command
                //
                jsonObj['id'] = dataView.getInt32(1);
                //心跳
                jsonObj['heartbeat'] = dataView.getInt32(5);
                //速度
                jsonObj['speed'] = dataView.getInt32(9);
                //总步数
                jsonObj['steps'] = dataView.getInt32(13);
            }
    }


    return jsonObj;
}

在产品下注册设备,并获取设备身份三元组,如下:

iotdb 写入 iot数据接入_物联网_07



三、设备端开发

我们通过Node.js程序模拟设备端上报二进制数据:

const mqtt = require('aliyun-iot-mqtt');


//设备身份
const options = {
    productKey: "a1kaK7XC8OB",
    deviceName: "BlXj1yasIJXmpKxymoUC",
    deviceSecret: "41798535d799760c8f67f02efd28b01c",
    regionId: "cn-shanghai"
};


//建立连接
const client = mqtt.getAliyunIotMqttClient(options);


// 消息Topic携带?_sn=default标识
const topic = `/${options.productKey}/${options.deviceName}/user/update?_sn=default`;
// 原始数据
var payloadArray = [ 3, 94, 129, 169, 59, 0, 0, 0, 23, 0, 0, 0, 79, 0, 0, 30, 220 ];
var payload = new Buffer(payloadArray);


// 发布数据到topic
client.publish(topic, payload);



四、联机运行

设备运行后,我们可以在 IoT 控制台的日志服务里查看到完整的数据处理过程,包括设备上报的原始数据,以及脚本解析处理后的结构化JSON数据,如下图:

iotdb 写入 iot数据接入_iotdb 写入_08