すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:TSL モデルのデータ形式を変換する

最終更新日:Mar 26, 2025

デバイスを作成した後、プロダクトの TSL(Thing Specification Language)モデルを定義する必要があります。 これにより、TSL モデルを使用して China Telecom の AEP プラットフォームと通信できます。Alibaba Cloud の TSL モデルのデータ形式は、China Telecom の AEP プラットフォームの TSL モデルのデータ形式とは異なります。IoT Platform コンソールでデータ形式を変換する必要があります。この例では、Python スクリプトを使用してデータ形式を変換します。

手順

  1. IoT Platform コンソールの排他インスタンスのインスタンス詳細ページに移動します。左側のナビゲーションウィンドウで、[デバイス] > [デバイス] を選択します。[デバイス] ページで、表示15008261001 ゲートウェイデバイスの [操作] 列にある デバイスログ表示 をクリックします。[デバイスの詳細] ページで、 をクリックします。[デバイスログ] タブで、 をクリックします。

  2. [クラウド実行ログ] タブで、デバイスから IoT Platform に送信されたメッセージの [操作] 列にある [表示] をクリックします。

  3. 16 進数コンテンツ

  4. 左側のナビゲーションウィンドウで、[デバイス] > [プロダクト] を選択します。[プロダクト] ページで、NBProduct1 プロダクトの名前をクリックします。プロダクト詳細ページで、[メッセージ分析] をクリックします。[メッセージ分析] タブで、[スクリプト言語] ドロップダウンリストから [python 2.7] を選択します。[スクリプトの編集] セクションで、元のコードを削除し、次のスクリプトのコードをコピーしてセクションに貼り付けます。

    このスクリプトは、この例にのみ適用されます。 TSL モデルに基づいてスクリプトを変更できます。 詳細については、「TSL データを解析するためのスクリプトを送信する」をご参照ください。

    # -*- coding: UTF-8 -*-
    # Alink 製品に基づいて以下のテンプレートが提供されています。テンプレートに基づいてスクリプトを作成できます。
    
    # デバイスが IoT Platform にデータを送信するときに、デバイスによってカスタムトピックに送信されたデータを JSON データに変換します。
    * topic: デバイスがメッセージを送信するトピックを指定する入力パラメーター。値は文字列です。
    # rawData: 入力パラメーター。値は空にできない整数のリストです。
    # jsonObj: 出力パラメーター。値は辞書を示す JSON オブジェクトです。
    def transform_payload(topic, rawData):
       jsonObj = {}
       return jsonObj
    
    import json
    import common_util
    
    ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'
    COMMAND_REPORT = 0x00 # プロパティを送信します。
    COMMAND_SET = 0x01 # プロパティを構成します。
    COMMAND_REPORT_REPLY = 0x02 # データ送信の結果を返します。
    COMMAND_SET_REPLY = 0x03 # プロパティ構成の結果を返します。
    COMMAD_UNKOWN = 0xff # 不明なコマンド。
    ALINK_PROP_SET_METHOD = 'thing.service.property.set' # IoT Platform がデバイスにプロパティ設定コマンドを送信するためのトピック。
    ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set' # デバイスがプロパティ設定結果を IoT Platform に送信するためのトピック。
    SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update' # 次のカスタムトピックを定義します。/user/update。
    SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' # 次のカスタムトピックを定義します。/user/update/error。
    
    # デバイスが IoT Platform にデータを送信するときに、デバイスのカスタムデータを Alink データに変換します。
    # rawData: 入力パラメーター。値は空にできない整数のリストです。
    # jsonObj: 出力パラメーター。値は辞書を示す JSON オブジェクトであり、空にすることはできません。
    def raw_data_to_protocol(rawData):
        output = []
        for iters in rawData:
            output.append(chr(iters))
    
        inStr = ''.join(output)
    
        try:
            json_object = json.loads(inStr)
            # matched_out = json_object['notifyType']
            deviceId = json_object['deviceId']
            water_consumption = json_object['payload']
            running_data = water_consumption['water_consumption']
            # gatewayId = json_object['gatewayId']
            # service = json_object['service']
            # data_object = service['data']
            # imei = data_object['IMEI']
            # MeasureValue = json_object['MeasureValue']
            # Temperature = json_object['Temperature']
            # BatteryVoltage = data_object['BatteryVoltage']
        except ValueError, e:
            MeasureValue = 'err'
            # imei = 'err'
    
        jsonMap = {}
        jsonMap['method'] = ALINK_PROP_REPORT_METHOD
        jsonMap['version'] = '1.0'
        jsonMap['id'] = '123'
        params = {}
        # params['IMEI'] = imei
        params['deviceId'] = deviceId
        params['water_consumption']= running_data
        # params['gatewayId'] = gatewayId
        # params['MeasureValue'] = MeasureValue
        # params['BatteryVoltage'] = BatteryVoltage
        # params['Temperature'] = Temperature
        jsonMap['params'] = params
        return jsonMap
    
    # 8 ビット整数をバイト配列に変換します。
    def int_8_to_byte(value):
        t_value = '%02X' % value
        if len(t_value) % 2 != 0:
            t_value += '0'
    
        return hex_string_to_byte_array(t_value)
    
        # 32 ビット整数をバイト配列に変換します。
    def int_32_to_byte(value):
        t_value = '%08X' % value
        if len(t_value) % 2 != 0:
            t_value += '0'
    
        return hex_string_to_byte_array(t_value)
    
    
    # 16 ビット整数をバイト配列に変換します。
    def int_16_to_byte(value):
        t_value = '%04X' % value
        if len(t_value) % 2 != 0:
            t_value += '0'
    
        return hex_string_to_byte_array(t_value)
    
    
    # 16 進数文字列をバイト配列に変換します。
    def hex_string_to_byte_array(str_value):
        if len(str_value) % 2 != 0:
            return None
    
        cycle = len(str_value) / 2
    
        pos = 0
        result = []
        for i in range(0, cycle, 1):
            temp_str_value = str_value[pos:pos + 2]
            temp_int_value = int(temp_str_value, base=16)
    
            result.append(temp_int_value)
            pos += 2
        return result
    
    
    # データが IoT Platform からデバイスに送信される前に、Alink データをデバイスが認識できるデータ形式に変換します。
    # jsonData: 入力パラメーター。値は辞書を示す JSON オブジェクトであり、空にすることはできません。
    # rawData: 出力パラメーター。値は [0,255] の値の範囲内の整数の配列です。配列要素を空にすることはできません。
    def protocol_to_raw_data(myjson):
        payload_array = []
        in_params = myjson.get("params")
        test = in_params.get('test', None)
        method = myjson.get('method')
        print(method);
    
        if method == ALINK_PROP_SET_METHOD:
            params = myjson.get('params')
    
            params = {}
            params['test'] = test
    
            content= {}
            content['params']=params
            content['serviceIdentifier'] = 'test'
    
            mystr = json.dumps(content)
    
            for ch in mystr:
                    print(ch)
                    payload_array = payload_array + int_8_to_byte(ord(ch))
    
        elif method == ALINK_PROP_REPORT_METHOD:
            code = json.get('code', None)
            payload_array = payload_array + int_8_to_byte(COMMAND_REPORT_REPLY)
            payload_array = payload_array + int_32_to_byte(int(id))
            payload_array = payload_array + int_8_to_byte(code)
        else:
            code = json.get('code')
            payload_array = payload_array + int_8_to_byte(COMMAD_UNKOWN)
            payload_array = payload_array + int_32_to_byte(int(id))
            payload_array = payload_array + int_8_to_byte(code)
    
        return payload_array
  5. [入力シミュレーション] タブで、[アップストリームデバイスデータ][シミュレーションタイプ] から選択し、手順 3 で保存した [コンテンツ] をエディターに貼り付けて、[実行] をクリックします。

  6. スクリプトを検証した後、[送信] をクリックして、スクリプトを IoT Platform に送信します。

  7. 中国電信の AEP プラットフォームに移動します。 [AEP-Online Debugging] ページの [nbdevice] デバイスで、水使用量データを送信します。

  8. IoT Platform コンソールの排他インスタンスのインスタンス詳細ページに移動します。左側のナビゲーションウィンドウで、[デバイス] > [デバイス] を選択します。[デバイス] ページで、表示15008261001 デバイスの [操作] 列にある をクリックします。

    デバイス詳細ページで、[TSL データ] > [ステータス] を選択します。[ステータス] タブには、IoT Platform の TSL モデルのデータ形式に準拠する形式に変換されたデータが表示されます。

次のステップ

IoT Platform と China Telecom の AEP プラットフォーム間のダウンストリーム通信をテストする