完成裝置建立後,需在物聯網平台控制台為產品定義物模型,用於與電信AEP平台進行通訊。阿里雲的物模型和中國電信平台物模型的資料格式不同,需要在物聯網平台中進行格式轉換。本案例通過Python指令碼完成轉換。
操作步驟
- 回到物聯網平台的尊享型執行個體下,單擊左側導覽列的15008261001)的查看,單擊Log Service下的前往查看。 ,單擊雲網關裝置(
- 在雲端作業記錄頁簽的日誌列表中,單擊查看,查看該裝置到雲的訊息。
- 在內容下拉式清單選擇Hex,複製並儲存內容到本地,用於後續資料分析指令碼驗證。
- 在左側導覽列,選擇NBProduct1,在產品詳情頁,單擊資料解析頁簽,選擇Python 2.7,刪除原指令碼代碼,複製粘貼以下指令碼代碼。 ,單擊產品本樣本指令碼僅適用當前案例,您可根據實際物模型,進行修改。具體操作,請參見提交物模型訊息解析指令碼。
# -*- coding: UTF-8 -*- # 以下為Alink產品模板,您可以基於以下模板進行指令碼編寫 # 將裝置自訂Topic資料轉換為JSON格式資料, 裝置上報資料到物聯網平台時調用 # 入參:topic 字串,裝置上報訊息的Topic # 入參:rawData 列表,列表元素取值為int類型 不可為空 # 出參: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' # 物聯網平台Topic,雲端下發屬性控制指令到裝置端。 ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set' # 物聯網平台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 列表,列表元素取值為int類型 不可為空 # 出參: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位整型轉成byte數組。 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位整型轉成byte數組。 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位整型轉成byte數組。 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進位字串轉成byte數組。 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 列表 列表元素取值為int類型且大小為[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中的內容,單擊執行。
- 確認指令碼可用後,單擊提交,提交指令碼到物聯網平台系統。
- 回到中國電信AEP平台,在裝置nbdevice的AEP-線上調試頁面,再上報一次用水量。
- 回到物聯網平台的尊享型執行個體下,選擇15008261001操作欄的查看。 ,單擊裝置在裝置詳情頁的下,查看到資料已轉化為物聯網平台物模型的資料格式。