Alibaba Cloud と China Telecom AEP プラットフォームでは、Thing Specification Language (TSL) モデルのデータ形式が異なるため、IoT Platform 上でデータを変換する必要があります。このトピックでは、Python スクリプトを使用した変換方法について説明します。
操作手順
- IoT Platform コンソールでご利用の専用インスタンスに戻ります。左側のナビゲーションウィンドウで、 を選択します。ゲートウェイデバイス (15008261001) を見つけ、[表示] をクリックします。デバイス詳細ページで、[デバイスログ] セクションに移動し、[表示] をクリックします。
- [クラウド実行ログ] タブで、デバイスからクラウドに送信されたメッセージを見つけ、[操作] 列の [表示] をクリックします。
- [コンテンツ] ドロップダウンリストから Hex を選択します。コンテンツをコピーしてローカルファイルに保存し、後でデータ解析スクリプトを検証します。
- 左側のナビゲーションウィンドウで、 を選択します。プロダクト NBProduct1 をクリックします。プロダクト詳細ページで、[メッセージ解析] タブをクリックします。[Python 2.7] を選択し、既存のスクリプトを削除してから、次のスクリプトを貼り付けます。
この例のスクリプトはデモ専用です。ご利用の TSL モデルに基づいてスクリプトを修正できます。詳細については、「TSL データを解析するスクリプトの送信」をご参照ください。
# -*- coding: UTF-8 -*- # 以下は Alink ベースのプロダクトのテンプレートです。このテンプレートに基づいてスクリプトを作成できます。 # デバイスが IoT Platform にデータをレポートするときに、カスタム Topic のデータを JSON 形式に変換します。 # 入力パラメーター: topic (文字列)。デバイスがメッセージをレポートする Topic。 # 入力パラメーター: rawData (リスト)。整数のリスト。空にすることはできません。 # 出力パラメーター: jsonObj (ディクショナリ)。 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 の Topic。 ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set' # デバイスがプロパティ設定の結果をクラウドにレポートするために使用する IoT Platform の Topic。 SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update' # カスタム Topic: /user/update。 SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' # カスタム Topic: /user/update/error。 # カスタム形式の生データを Alink プロトコル形式に変換します。 # 入力パラメーター: rawData (リスト)。整数のリスト。空にすることはできません。 # 出力パラメーター: jsonObj (ディクショナリ)。空にすることはできません。 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 # Alink プロトコル形式のデータをデバイスが読み取り可能な形式に変換します。 # 入力パラメーター: jsonData (ディクショナリ)。空にすることはできません。 # 出力パラメーター: 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 - [入力シミュレーション] で、[シミュレーションタイプ] を [デバイスからのアップストリームデータ] に設定します。手順3でコピーした [コンテンツ] をエディターに貼り付け、[実行] をクリックします。
- スクリプトが期待どおりに動作することを確認したら、[送信] をクリックして IoT Platform にデプロイします。
- China Telecom AEP プラットフォームに戻ります。nbdevice デバイスの [AEP-オンラインデバッグ]
[デバイス動作シミュレーション] エリアで、[サービスタイプ] を [データレポート] に、[サービス] を [ビジネスデータレポート] に設定します。[水消費量] を
0.90に設定し、データをレポートします。右側の [デバイスログ] に成功メッセージが表示されます。 - IoT Platform コンソールでご利用の専用インスタンスに戻ります。 を選択し、デバイス 15008261001 を見つけ、[操作] 列の [表示] をクリックします。
デバイス詳細ページで、 タブに移動します。データは IoT Platform の TSL モデルデータ形式に変換されています。
water_consumptionプロパティの現在の値は 0.9 m³ です。