Karena format data model Thing Specification Language (TSL) Alibaba Cloud berbeda dari platform AEP China Telecom, Anda perlu mengonversi data tersebut di IoT Platform. Topik ini menjelaskan cara menggunakan skrip Python untuk melakukan konversi tersebut.
Prosedur
- Kembali ke instans eksklusif Anda di Konsol IoT Platform. Di panel navigasi kiri, pilih . Temukan perangkat gateway (15008261001) dan klik View. Di halaman detail perangkat, buka bagian Device Log lalu klik View.
- Di tab Cloud run log, temukan pesan yang dikirim dari perangkat ke cloud dan klik View di kolom Actions.
- Dari daftar drop-down Content, pilih Hex. Salin kontennya dan simpan ke file lokal untuk memvalidasi skrip penguraian data nanti.
- Di panel navigasi kiri, pilih . Klik produk NBProduct1. Di halaman detail produk, klik tab Message Analysis. Pilih Python 2.7, hapus skrip yang ada, lalu tempel skrip berikut.
Skrip dalam contoh ini hanya untuk demonstrasi. Anda dapat memodifikasi skrip sesuai dengan model TSL Anda. Untuk informasi selengkapnya, lihat Kirimkan skrip untuk mengurai data TSL.
# -*- coding: UTF-8 -*- # Berikut ini adalah templat untuk produk berbasis Alink. Anda dapat menulis skrip Anda berdasarkan templat ini. # Mengonversi data dari topik kustom ke format JSON saat perangkat melaporkan data ke IoT Platform. # Parameter input: topic (string). Topik tempat perangkat melaporkan pesan. # Parameter input: rawData (list). Daftar bilangan bulat. Tidak boleh kosong. # Parameter output: jsonObj (dictionary). def transform_payload(topic, rawData): jsonObj = {} return jsonObj import json import common_util ALINK_PROP_REPORT_METHOD = 'thing.event.property.post' COMMAND_REPORT = 0x00 # Melaporkan properti. COMMAND_SET = 0x01 # Menyetel properti. COMMAND_REPORT_REPLY = 0x02 # Hasil yang dikembalikan untuk pelaporan data. COMMAND_SET_REPLY = 0x03 # Hasil yang dikembalikan oleh perangkat untuk penyetelan properti. COMMAD_UNKOWN = 0xff # Perintah tidak dikenal. ALINK_PROP_SET_METHOD = 'thing.service.property.set' # Topik IoT Platform yang digunakan untuk mengirim perintah penyetelan properti dari cloud ke perangkat. ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set' # Topik IoT Platform yang digunakan perangkat untuk melaporkan hasil penyetelan properti ke cloud. SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update' # Topik kustom: /user/update. SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' # Topik kustom: /user/update/error. # Mengonversi data mentah dari format kustom ke format protokol Alink. # Parameter input: rawData (list). Daftar bilangan bulat. Tidak boleh kosong. # Parameter output: jsonObj (dictionary). Tidak boleh kosong. 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 # Mengonversi bilangan bulat 8-bit ke larik 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) # Mengonversi bilangan bulat 32-bit ke larik 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) # Mengonversi bilangan bulat 16-bit ke larik 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) # Mengonversi string heksadesimal ke larik 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 # Mengonversi data dari format protokol Alink ke format yang dapat dibaca perangkat. # Parameter input: jsonData (dictionary). Tidak boleh kosong. # Parameter output: rawdata (list). Daftar bilangan bulat dari 0 hingga 255. Tidak boleh kosong. 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 - Di bawah Input Simulation, atur Simulation Type ke Upstreamed Device Data. Tempel Content yang telah Anda salin pada Langkah 3 ke editor, lalu klik Run.
- Setelah memastikan skrip berfungsi sesuai harapan, klik Submit untuk menerapkannya ke IoT Platform.
- Kembali ke platform AEP China Telecom. Di halaman AEP-Online Debugging untuk perangkat nbdevice, laporkan kembali data konsumsi air.
Di area Device Behavior Simulation, atur Service Type ke Data Reporting dan Service ke Business Data Reporting. Atur Water Consumption ke
0.90dan laporkan data tersebut. Pesan sukses akan muncul di Device Log di sebelah kanan. - Kembali ke instans eksklusif Anda di Konsol IoT Platform. Pilih , temukan perangkat 15008261001, lalu klik View di kolom Actions.
Di halaman detail perangkat, buka tab . Data kini telah dikonversi ke format data model TSL untuk IoT Platform. Nilai saat ini dari properti
water_consumptionadalah 0.9 m³.