このトピックでは、カスタム Topic データを解析する Python のサンプルスクリプトを示します。

説明

  • カスタム Topic データの解析をサポートしているのは、中国 (上海) リージョンのみです。
  • デバイスを設定する際、解析フラグ (? _sn=default) をカスタム Topic の後ろに追加する必要があります。 IoT Platform は、タグ付きの Topic を使用してデバイスから送信されたデータのみを解析します。

    たとえば、デバイスから Topic /${productKey}/${deviceName}/user/update にメッセージを送信するとします。 IoT Platform でデータを JSON 形式に解析する場合、 デバイス SDK の設定時、Topic を /${productKey}/${deviceName}/user/update? _sn=default と定義する必要があります。

    IoT Platform コンソールでカスタム Topic を作成すると、解析フラグが追加されず、通常の Topic として定義されます。
  • IoT Platform は、デバイスからクラウドにレポートされたデータのみを解析し、クラウドから送信されたダウンストリームデータは解析しません。
  • IoT Platform は、クラウドにレポートされたペイロードのみを解析し、解析したペイロードを返します。
  • データの Topic は、解析の前後で変化しません。 たとえば、デバイスから /${productKey}/${deviceName}/user/update にデータが送信されると、解析されたデータもこの Topic に送信されます。

スクリプトテンプレート

SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  #Custom topic: /user/update
SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error'  #Custom topic: /user/update/error

# Convert data from devices to JSON data.The function is called when devices report data through a custom topic to IoT Platform.
# Input: A topic string. It is the topic for devices reporting messages.   
# Input: A rawData list. The list elements must be of the Int type and cannot be empty.
# Output: A jsonObj dictionary. It cannot be empty.    
def transform_payload(topic, rawData):
   jsonObj = {}
   return jsonObj

以下のスクリプトは、カスタム Topic データの解析にのみ使用します。 また、プロダクトのデータ形式カスタムの場合、TSL データを解析するスクリプトを記述する必要があります。 TSL データの解析の詳細については、「TSL データの解析例」をご参照ください。
# coding=utf-8
SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  #Custom topic: /user/update
SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error'  #Custom topic: /user/update/error

# Sample data
# Custom topic: /user/update reports data
# Input parameters: topic: /{productKey}/{deviceName}/user/update and bytes: 0x000000000100320100000000
# Output parameters:
#  {
#     "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

# Converts a byte array to an integer type
def bytes_to_int(bytes):
    data = ['%02X' % i for i in bytes]
    return int(''.join(data), 16)