全部產品
Search
文件中心

IoT Platform:轉換物模型格式

更新時間:Jun 30, 2024

完成裝置建立後,需在物聯網平台控制台為產品定義物模型,用於與電信AEP平台進行通訊。阿里雲的物模型和中國電信平台物模型的資料格式不同,需要在物聯網平台中進行格式轉換。本案例通過Python指令碼完成轉換。

操作步驟

  1. 回到物聯網平台的尊享型執行個體下,單擊左側導覽列的裝置管理 > 裝置,單擊雲網關裝置(15008261001)的查看,單擊Log Service下的前往查看
  2. 雲端作業記錄頁簽的日誌列表中,單擊查看,查看該裝置到雲的訊息。
  3. 內容下拉式清單選擇Hex,複製並儲存內容到本地,用於後續資料分析指令碼驗證。
    HEX
  4. 在左側導覽列,選擇裝置管理 > 產品,單擊產品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
  5. 類比輸入下,選擇類比類型裝置上報資料,複製粘貼步驟3中的內容,單擊執行
  6. 確認指令碼可用後,單擊提交,提交指令碼到物聯網平台系統。
  7. 回到中國電信AEP平台,在裝置nbdeviceAEP-線上調試頁面,再上報一次用水量。
    電信上報資料
  8. 回到物聯網平台的尊享型執行個體下,選擇裝置管理 > 裝置,單擊裝置15008261001操作欄的查看
    在裝置詳情頁的物模型資料 > 運行狀態下,查看到資料已轉化為物聯網平台物模型的資料格式。運行資料