0%

阿里云物联网平台数据解析与物模型显示

前言

这篇文章是对之前文章【LTE Cat.1模块和阿里云物联网平台使用】的一个补充。之前只介绍了阿里云物联网平台如何创建产品、添加设备、添加物模型概述,缺少对消息解析、物模型展示的使用介绍,导致我这次用阿里云物联网平台时花了将近半天的时间在做之前做过又忘记怎么做的事情。本文就来介绍下消息解析物模型展示的功能。

另外阿里云免费的物联网平台公共实例的资源包将于2023年2月20日下线,我看企业版的最便宜的也要700元/月,我这种添加一个设备调试用的不能白嫖了,到时候需要的话只能包一台服务器自己搭个MQTT划算点了,或者看看其他云服务商那能不能白嫖😂。

添加物模型

设备管理->产品->对应产品名称->功能定义->编辑草稿中添加物模型数据,功能类型有属性、服务、事件,我目前只使用到了属性类型,编辑完成后发布上线即可,下面是我这次调试模块用到的物模型功能定义:

img

消息解析

设备管理->产品->对应产品名称->消息解析->编辑草稿中编写消息解析的脚本代码,有js、Python、php三种语言可供选择,我选择的是Python。消息解析有自定义Topic消息解析物模型消息解析两种,创建产品时数据格式选择透传/自定义,消息解析里才有设备上报数据和设备接收数据,数据格式选ICA 标准数据格式(Alink JSON),消息解析里只有自定义Topic消息解析。通过看模拟输入中模拟类型有哪些,可以知道是否支持某种消息类型的数据解析。

自定义Topic消息解析

设备通过携带解析标记?_sn=default的自定义Topic上报自定义格式消息时,物联网平台收到消息数据后,需调用消息解析脚本将自定义格式数据转换为JSON结构体,再流转给后续业务系统。例如,设备发送到Topic /${productKey}/${deviceName}/user/update的消息需要解析为JSON格式,在开发设备端时,就需配置该Topic为:/${productKey}/${deviceName}/user/update?_sn=default

在Python脚本中,自定义Topic消息解析的接口函数名为transform_payload(topic, rawData),可以根据不同的topic选择不同的解析方式。

物模型消息解析

数据格式为ICA标准数据格式,设备按照物联网平台定义的标准数据格式生成消息上报,标准Alink JSON数据格式说明,请参见设备属性、事件、服务

数据格式为透传/自定义,设备通信时,需要物联网平台调用您提交的消息解析脚本,将上行物模型消息解析为物联网平台定义的标准格式(Alink JSON),将下行物模型消息据解析为设备的自定义数据格式。

在Python脚本中,设备自定义数据格式转Alink JSON格式数据的函数(上行通信)为raw_data_to_protocol,Alink JSON格式数据转为设备自定义数据格式的函数(下行通信)为protocol_to_raw_data,要注意的是raw_data_to_protocol函数需要将rawData输入转为标准的Alink JSON,参考标准Alink JSON数据格式说明。下面是我这次用到的脚本解析代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'
def raw_data_to_protocol(rawData):
uint8Array = []
for byteValue in rawData:
uint8Array.append(byteValue & 0xff)

jsonMap = {}
params = {}
params['status'] = uint8Array[0]
params['error'] = uint8Array[1]
params['validIDNum'] = uint8Array[2]
params['errorSlave'] = uint8Array[3]
params['idallocTimes'] = uint8Array[4]
params['costTime'] = (uint8Array[6]|(uint8Array[7]<<8)) # 非单字节变量注意大小端
params['successCnt'] = (uint8Array[8]|(uint8Array[9]<<8)|(uint8Array[10]<<16)|(uint8Array[11]<<24))
params['errorCnt'] = (uint8Array[12]|(uint8Array[13]<<8)|(uint8Array[14]<<16)|(uint8Array[15]<<24))
jsonMap['params'] = params # 物模型中的属性添加到params中,再加到jsonMap
jsonMap['method'] = ALINK_PROP_REPORT_METHOD # 标准的Alink JSON必须要加method

return jsonMap

物模型显示效果

这次应用是有软件模块过年放假期间需要测试,我用4G Cat.1模块传到阿里云物联网平台记录数据,最终物模型显示效果如下图:

img