本文提供Python语言的自定义Topic数据解析脚本模板和示例。

说明

  • 目前仅华东2(上海)地域支持自定义Topic数据解析。
  • 配置设备端时,需在发布消息的自定义Topic后添加数据解析标记(?_sn=default)。物联网平台仅解析设备通过携带标记的Topic发布的数据。

    例如,设备发送到Topic /${productKey}/${deviceName}/user/update的数据需要解析为JSON格式。在开发设备端时,就需配置该Topic为:/${productKey}/${deviceName}/user/update?_sn=default

    说明 在物联网平台创建自定义Topic时按正常Topic定义,不添加该解析标记。
  • 仅解析设备上报云端的数据,不解析云端下行数据。
  • 仅解析上报数据的Payload,并返回解析后的Payload。
  • 解析前后,数据所在Topic不变。例如,设备发送到/${productKey}/${deviceName}/user/update的数据,解析后仍在该Topic中。

脚本模板

SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  #自定义Topic:/user/update
SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' #自定义Topic:/user/update/error

# 将设备自定义Topic数据转换为JSON格式数据, 设备上报数据到物联网平台时调用
# 入参: topic   字符串,设备上报消息的Topic   
# 入参: rawData 列表,列表元素取值为int类型,不能为空
# 出参: jsonObj 字典    
def transform_payload(topic, rawData):
   jsonObj = {}
   return jsonObj

脚本示例

说明 以下示例脚本仅用于解析自定义Topic数据。如果产品的数据格式透传/自定义,还需编写物模型数据解析脚本。物模型数据解析脚本编写指导,请参见物模型数据解析使用示例
# coding=UTF-8
SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  #自定义Topic:/user/update
SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' #自定义Topic:/user/update/error

#  示例数据
#  自定义Topic:/user/update上报数据
#  输入参数:topic: /{productKey}/{deviceName}/user/update和bytes: 0x000000000100320100000000
#  输出参数:
#  {
#     "prop_float": 0,
#     "prop_int16": 50,
#     "prop_bool": 1,
#     "topic": "/{productKey}/{deviceName}/user/update"
#   }
def transform_payload(topic, bytes):
    uint8Array = []
    for byteValue in bytes:
        uint8Array.append(byteValue & 0xff)

    jsonMap = {}
    if SELF_DEFINE_TOPIC_ERROR_FLAG in topic:
        jsonMap['topic'] = topic
        jsonMap['errorCode'] = bytes_to_int(uint8Array[0:1])

    elif SELF_DEFINE_TOPIC_UPDATE_FLAG in topic:
        jsonMap['topic'] = topic
        jsonMap['prop_int16'] = bytes_to_int(uint8Array[5:7])
        jsonMap['prop_bool'] = bytes_to_int(uint8Array[7: 8])
        jsonMap['prop_float'] = bytes_to_int(uint8Array[8:])

    return jsonMap

# byte数组转换为整型
def bytes_to_int(bytes):
    data = ['%02X' % i for i in bytes]
    return int(''.join(data), 16)