阿里云物联网平台-数据解析脚本详解

var COMMAND_REPORT = 0x00; //属性上报。
var COMMAND_SET = 0x01; //属性设置。
var COMMAND_REPORT_REPLY = 0x02; //上报数据返回结果。
var COMMAND_SET_REPLY = 0x03; //属性设置设备返回结果。
var COMMAD_UNKOWN = 0xff;    //未知的命令。

定义五个参数,分别在后面的解析函数中用到。

var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //物联网平台Topic,设备上传属性数据到云端。
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //物联网平台Topic,云端下发属性控制指令到设备端。
var ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set'; //物联网平台Topic,设备上报属性设置的结果到云端。var SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  //自定义Topic:/user/update。
var SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' //自定义Topic:/user/update/error。

定义请求方法method参数的值,详见阿里云 <设备属性、事件、服务> 文档

设备属性、事件、服务

<函数一>
/**  * 将设备的自定义格式数据转换为Alink协议的数据,设备上报数据到物联网平台时调用  * 入参:rawData byte[]数组     不能为空  * 出参:jsonObj Alink JSON对象 不能为空  */
function rawDataToProtocol(bytes) {var uint8Array = new Uint8Array(bytes.length);for (var i = 0; i < bytes.length; i++) {uint8Array[i] = bytes[i] & 0xff;}/*将设备上报的原始数据转换为数组。其中bytes对象中存储着设备上报原始数据。*/var dataView = new DataView(uint8Array.buffer, 0);var jsonMap = new Object();var fHead = uint8Array[0]; // 第0个字节00,if (fHead == COMMAND_REPORT) {//判断第0个字节是否等于属性上报标识符,也就是说属性上报第0个字节必须为00(自己前面定义的十六进制).jsonMap['method'] = ALINK_PROP_REPORT_METHOD; //ALink JSON格式,属性上报topic。method='thing.event.property.postjsonMap['version'] = '1.0'; //ALink JSON格式,协议版本号固定字段。jsonMap['id'] = '' + dataView.getInt32(1); //ALink JSON格式,标示该次请求id值。var params = {}; // 定义属性存放对象。var jsonMap = {}; params['prop_int16'] = dataView.getInt16(5); //对应产品属性中prop_int16。 params['prop_bool'] = uint8Array[7]; //对应产品属性中prop_bool。params['prop_float'] = dataView.getFloat32(8); //对应产品属性中prop_float。jsonMap['params'] = params; //ALink JSON格式,params标准字段。将参数打包到数据帧中。}
else if(fHead == COMMAND_SET_REPLY) {//判断第0个字节是否等于属性设置设备返回结果jsonMap['version'] = '1.0'; //ALink JSON格式,协议版本号固定字段。jsonMap['id'] = '' + dataView.getInt32(1); //ALink JSON格式,标示该次请求id值。jsonMap['code'] = ''+ dataView.getUint8(5);jsonMap['data'] = {};}return jsonMap;
}

这段代码里面最重要的就是dataView.getInt16()与uint8Array[];
dataView.getInt16()是dataView中的内置函数,用于在指定位置(即,距dataView起始字节偏移)获取16位整型。uint8Array[]则是直接取字节。
例如:

  1. dataView.getInt32(1),从第一个字节开始取32位整型转化为十进制,如上图所示,四个字节为32位,也就是00000001,十六进制转为十进制,id=1。

  2. params[‘prop_int16’] = dataView.getInt16(5); //对应产品属性中prop_int16。
    从第五个字节开始,取16位整型。也就是第5和第6个字节。0032->50(十进制)。 params[‘prop_bool’] =50。

  3. params[‘prop_bool’] = uint8Array[7];
    //对应产品属性中prop_bool。直接取字节,第七个字节,注意字节要从第0个开始计数。第七个字节为01。

  4. params[‘prop_float’] = dataView.getFloat32(8);
    //对应产品属性中prop_float。从第8个字节开始,取32位浮点型。也就是第8、第9、第10、第11个字节。00000000->0(十进制)。

<函数二>
/*云端下发指令解析函数*/
function protocolToRawData(json) {var method = json['method'];var id = json['id'];var version = json['version'];var payloadArray = [];if (method == ALINK_PROP_SET_METHOD) //属性设置。云端下发属性控制指令到设备端的这个物模型topic。接收来自物联网平台的“设置设备属性”的命令。{var params = json['params'];var prop_float = params['prop_float'];var prop_int16 = params['prop_int16'];var prop_bool = params['prop_bool'];//将设置的具体值抽取出来。//按照自定义协议格式拼接 rawData。payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); //command字段。属性设置。01payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); //ALink JSON格式 'id'。配置32位的int整型id。12345->00 00 30 39payloadArray = payloadArray.concat(buffer_int16(prop_int16)); //属性'prop_int16'的值。配置16位的int整型。333->01 4dpayloadArray = payloadArray.concat(buffer_uint8(prop_bool)); //属性'prop_bool'的值。配置8位的无符号int整型。1->01 payloadArray = payloadArray.concat(buffer_float32(prop_float)); //属性'prop_float'的值。配置32位的浮点型。754标准}
else if (method ==  ALINK_PROP_REPORT_METHOD) { //设备上报数据返回结果。var code = json['code'];payloadArray = payloadArray.concat(buffer_uint8(COMMAND_REPORT_REPLY)); //command字段。上报数据返回结果。payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); //ALink JSON格式'id'。payloadArray = payloadArray.concat(buffer_uint8(code));}
else { //未知命令,对于这些命令不做处理。var code = json['code'];payloadArray = payloadArray.concat(buffer_uint8(COMMAD_UNKOWN)); //command字段。payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); //ALink JSON格式'id'。payloadArray = payloadArray.concat(buffer_uint8(code));}return payloadArray;
}

payloadArray.concat();这个函数就是取相应的位数进行拼接。
例如 :

  1. payloadArray = payloadArray.concat(buffer_int32(parseInt(id)));
    //配置32位的int整型id。12345->00 00 30 39,十进制转十六进制即可。
  2. payloadArray = payloadArray.concat(buffer_int16(prop_int16));
    //属性’prop_int16’的值。配置16位的int整型。333->01 4d
  3. payloadArray = payloadArray.concat(buffer_uint8(prop_bool));
    //属性’prop_bool’的值。配置8位的无符号int整型。1->01
  4. payloadArray = payloadArray.concat(buffer_float32(prop_float));
    //属性’prop_float’的值。配置32位的浮点型。
    唯一比较难算的就是拼接浮点型了,按照754标准拼接即可。
<函数三>
/*** 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用* 入参:topic   字符串,设备上报消息的topic     * 入参:rawData byte[]数组                  不能为空* 出参:jsonObj JSON对象                    不能为空*/
function transformPayload(topic, bytes) {var uint8Array = new Uint8Array(bytes.length);for (var i = 0; i < bytes.length; i++) {uint8Array[i] = bytes[i] & 0xff;}var dataView = new DataView(uint8Array.buffer, 0);var jsonMap = {};if(topic.includes(SELF_DEFINE_TOPIC_ERROR_FLAG)) {jsonMap['topic'] = topic;jsonMap['errorCode'] = dataView.getInt8(0)}
else if (topic.includes(SELF_DEFINE_TOPIC_UPDATE_FLAG)) {jsonMap['topic'] = topic;jsonMap['prop_int16'] = dataView.getInt16(5);jsonMap['prop_bool'] = uint8Array[7];jsonMap['prop_float'] = dataView.getFloat32(8);}return jsonMap;
}

和之前一样,唯一的就是topic是自定义topic时使用这个函数。

自定义topic数据解析:

  • 仅华东2(上海)、华北2(北京)、华南1(深圳)地域支持自定义Topic数据解析。
  • 仅通过MQTT协议接入的设备支持自定义Topic数据解析。 仅解析设备上报云端的数据,不解析云端下行数据。
  • 解析上报数据的Payload,并返回解析后的Payload。
  • 解析前后,数据所在Topic不变。例如,设备发送到/productKey/{productKey}/productKey/{deviceName}/user/update的数据,解析后仍在该Topic中。
  • 配置设备端时,需在发布消息的自定义Topic后添加数据解析标记?_sn=default。物联网平台仅解析设备通过携带标记的Topic发布的数据。在物联网平台创建自定义Topic时按正常Topic定义,不添加该解析标记。
  • 如果产品的数据格式为透传/自定义,还需编写物模型数据解析脚本。
    自定义解析的时候数据脚本中transformPayload函数必须定义,而且内部需要解析指令。

物模型数据解析

  • 设备端也应该选择物模型的topic
  • 属性为默认模块属性,若使用物模型自定义模块,标识符(identifier)的格式为模块标识符:属性标识符。例如,

model1:prop_int16 。

  • 数据格式选择为透传/自定义。
  • 物模型数据解析的时候数据脚本中transformPayload函数也需要定义,但是可以只定义一个空函数即可,不必往里面写东西。

阿里云物联网平台-数据解析脚本详解相关推荐

  1. 阿里云物联网平台数据解析(python)

    阿里云物联网平台数据解析(python) DTU上传设备返回报文消息,通过数据解析后显示各功能数值,这里以智能电表DLT645规约为例进行解析 因为是做光伏的,所以对电表的需求比较多,之前查找了好多文 ...

  2. 【阿里云物联网平台-1】使用MQTTfx模拟客户端,往阿里云物联网平台发布数据

    目录 MQTT协议简单介绍(每句都是干货) 手把手流程 服务器:阿里云物联网平台 客户端:MQTTfx 后记 MQTT协议简单介绍(每句都是干货) MQTT是应用层协议,基于TCP/IP. 是一种发布 ...

  3. ESP32基础应用之ESP32与阿里云物联网平台实现数据互传(MQTT协议)

    文章目录 1 实验目的 2 在阿里云物联网平台添加实验设备 3 ESP32连接阿里云物联网平台 3.1 准备ESP32工程 3.2 准备ESP32所需的MQTT相关参数 3.4 ESP32工程主要代码 ...

  4. 【PBL项目实战】户外智慧农场项目实战系列——1.阿里云物联网平台的开通与云端可视化应用的新建

    岭师人工智能素养教育共同体PBL项目教程系列之1:户外智慧农场项目实战系列 原文链接  https://mp.weixin.qq.com/s/avKWJHNvnPeFsdEXUBByjw 本系列以户外 ...

  5. 单片机数据上传到阿里云物联网平台后,如何在手机端和网页端获取获取数据?

    最近遇到了一个需求:单片机上传数据到阿里云物联网平台,手机端或者网页端能够从物联网平台获取数据并显示到出来,再加一个手机端/网页端通过物联网平台控制单片机. 最终采用了阿里云物联网平台提供的方法,使用 ...

  6. 爬取阿里云物联网平台设备的物模型数据

    背景说明 按项目经理的要求,需要导出阿里云物联网平台上所有设备的物模型数据到Excel上,方便后台导入.给客户演示和备份.但是,阿里云物联网平台没有这个功能,手动一个个处理不现实,因此只能写一个爬虫爬 ...

  7. RS485设备通过DTU上传数据到阿里云物联网平台

    在开始之前,首先需要搞明白以下几个概念,RS485, Modbus协议和DTU. RS485,基础概念自行度娘,这里如果简单理解的话就是一种串行通信标准.非硬件工程师其实记住RS485有4条线,A,B ...

  8. http发送16进制报文_阿里云物联网平台使用心得(25)MQTT协议详解UNSUBSCRIBE报文...

    题目 大家好,超子又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖.超子今天给大家介绍一下UNSUBSCRIBE报文. UNSUBSCRIBE报文 从上图中可知,UNSUBSCRI ...

  9. mqtt协议详解_阿里云物联网平台使用心得(七)MQTT协议14个报文总览

    大家好,物联网爱好小组成员超子,又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖.超子将参考<MQTT-3.1.1标准协议中文版>PDF手册,详解每个报文的格式,以及如 ...

最新文章

  1. 只需2040张图片,训练视觉Transformer:南大吴建鑫团队提出IDMM
  2. 存储过程中引用的常规表,临时表以及表变量是否会导致存储过程的重编译
  3. 画出沪深300指数曲线
  4. R6034--ARCENGINE
  5. 在JAVA 中将堆与栈分开的原因
  6. server新手引导 sql_Web SQL初体验之新手指导(全功能解析)
  7. 一起来庆祝 .NET 20 周年!
  8. 凡事多找找自己的原因_布袋除尘器灰斗积粉过多、堵灰该咋办?别急,从这8个方面找原因...
  9. C#设计模式之19-观察者模式
  10. Stackoverflow 年度报告 2020:开发者最喜爱的数据库是什么?
  11. python 存redis失败无提示_python如何关闭redis
  12. 配置交换空间与文件系统的备份
  13. java 构建者模式_Java不可变类–构建器模式
  14. 画面逐渐放大_故宫一幅800年古画,放大55倍,4个老人喝醉了?
  15. java中 获取classpath路径
  16. 开源的在线视频点播系统,值得分享!
  17. VSCrawler 爬取美女图片
  18. (十)损失函数与反向传播
  19. 分布式CAP是什么?
  20. 关于git 提交报错rejected解决

热门文章

  1. 水逆了一整年的王源,2020年年初能靠《大主宰》翻身吗?
  2. Python+Excel数据分析实战:军事体能考核成绩评定(一)项目概况
  3. 计算机有关书籍读书心得,关于计算机学习心得体会5篇.doc
  4. 电路设计中晶体和晶振的区别
  5. 08-SNAP的命令行处理工具gpt及其批处理(Sentinel-1和Sentinel-2为例)
  6. Linux基础知识学习笔记
  7. html文件用ppt打开,Win10如何打开html文件课件.ppt
  8. php 判断字符串类型及长度
  9. Ubuntu 16.04安装Matlab R2016b
  10. 2020年02月编程语言排行榜