物模型通訊
物模型是阿里雲物聯網平台為產品定義的資料模型,您可以通過物聯網平台提供的Python Link SDK實現裝置與物聯網平台之間的物模型通訊,包括屬性上報、事件上報和服務調用。
前提條件
背景資訊
物模型是實體裝置映射到阿里雲物聯網平台的資料模型。您可在物聯網平台控制台產品詳情頁面,單擊功能定義頁簽,單擊物模型TSL,查看或匯出JSON格式的物模型檔案(TSL)。
物聯網平台物模型功能的更多資訊,請參見什麼是物模型。
物模型資料格式的更多資訊,請參見裝置屬性、事件、服務。
物模型:ICA標準資料格式(Alink JSON)
初始化
請參考代碼中的thing_alink.py檔案, 在__init__函數中完成對象的初始化。
def __init__(self):
self.__linkkit = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="a18wP******",
device_name="LightSwitch",
device_secret="uwMTmVAMnGGHaAkqmeDY6cHxxB******")配置物模型檔案
使用者需要從雲端控制台下載物模型檔案,該檔案需要整合到應用工程中,這樣對應的Topic才能正確接收和發送訊息:
self.__linkkit.thing_setup("tsl.json") tsl.json預設為utf-8格式,如果需要修改,請確保在儲存檔案時格式為utf-8。該設定需要在串連雲端之前調用。
物模型功能可通過on_thing_enable通知使用者,然後使用者可以進行屬性上報、事件上報和服務響應:
self.__linkkit.on_thing_enable = self.on_thing_enable
def on_thing_enable(self, userdata):
print("on_thing_enable") 物模型功能不可用時,通過on_thing_disable通知使用者,屬性上報、事件上報、服務響應不可用。
self.__linkkit.on_thing_disable = self.on_thing_disable
def on_thing_disable(self, userdata):
print("on_thing_disable") 屬性上報、事件上報、設定屬性、服務響應等介面的應用,需在裝置完成認證與串連之後。
屬性上報
Python Link SDK的1.0.0至1.2.11版本中,裝置與物聯網平台串連斷開後,如果繼續調用以下介面發送訊息會拋出異常,需要您做好異常處理。在1.2.12版本後,該API執行失敗後,會返回非零錯誤值,不再拋出異常。
通過thing_post_property上報屬性,傳入參數為屬性名稱及值:
prop_data = {
"abs_speed": 11,
"power_stage": 10
}
self.__linkkit.thing_post_property(prop_data) 服務端對上報的屬性做出處理髮出響應,SDK通過on_thing_prop_post通知使用者:
self.__linkkit.on_thing_prop_post = self.on_thing_prop_post
def on_thing_prop_post(self, request_id, code, data, message,userdata):
print("on_thing_prop_post request id:%s, code:%d, data:%s message:%s" %
(request_id, code, str(data), message)) thing_post_property傳回值rc為0時,表明請求寫入發送緩衝區成功,rc為其它值時,表示寫入發送緩衝失敗。當on_thing_prop_post調用時,表明結果從雲端返回了請求結果,code為200時表明解析成功,code為其它值表示解析失敗,失敗資訊可在message中查看。
事件上報
Python Link SDK的1.0.0至1.2.11版本中,裝置與物聯網平台串連斷開後,如果繼續調用以下介面發送訊息會拋出異常,需要您做好異常處理。在1.2.12版本後,該API執行失敗後,會返回非零錯誤值,不再拋出異常。
通過thing_trigger_event上報事件,傳入參數為事件identifier和物模型中定義事件對應的對象,如下所示:
event_data = {
"power": 10,
"power_style": 1
}
self.__linkkit.thing_trigger_event(("power_state", event_data)) 服務端對上報的事件處理後發出響應,SDK通過on_thing_event_post通知使用者:
self.__linkkit.on_thing_event_post = self.on_thing_event_post
def on_thing_event_post(self, event, request_id, code, data, message, userdata):
print("on_thing_event_post event:%s,request id:%s, code:%d, data:%s, message:%s" %
(event, request_id, code, str(data), message))
pass 設定屬性
服務端發送設定屬性訊息後,SDK通過設定的回呼函數on_thing_prop_changed通知使用者,回呼函數中params為包含屬性名稱與值的JSON對象,使用者需要對接收到的新屬性進行處理:
self.__linkkit.on_thing_prop_changed = self.on_thing_prop_changed
def on_thing_prop_changed(self, params, userdata):
print("on_thing_prop_changed params:" + str(params)) SDK不會主動上報屬性變化,如果需要修改後再次上報雲端,需要使用者自行調用thing_post_property()發送。
服務響應(非同步)
服務端發送服務要求訊息後,SDK通過設定的回呼函數on_thing_call_service通知使用者:
註:所有的服務均通過on_thing_call_service進行通知使用者,通過identifier區分不同服務:
self.__linkkit.on_thing_call_service = self.on_thing_call_service
def on_thing_call_service(self, identifier, request_id, params, userdata):
print("on_thing_call_service identifier:%s, request id:%s, params:%s" %
(identifier, request_id, params))
self.__call_service_request_id = request_id
pass identifier對應物模型中服務對應的identifier,request_id為區分每次調用的ID,params為服務調用參數。
裝置端對服務做出返迴響應:
self.__linkkit.thing_answer_service(identifier, request_id, code, params) identifier為物模型中服務對應的identifier,request_id為on_thing_call_service中傳遞的reques_id,code為返回碼,200為本地處理成功,params為字典類型的參數,與物模型中服務返回參數進行對應。
物模型:自訂格式
初始化
Python Link SDK支援您使用自訂格式(非物模型格式)傳輸資料。
請參考代碼thing_custom.py檔案, 在__init__函數中完成對象的初始化。
def __init__(self):
self.__linkkit = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="a18wP******",
device_name="LightSwitch",
device_secret="uwMTmVAMnGGHaAkqmeDY6cHxxB******")配置物模型檔案
首先需要將物模型檔案參數設定為空白:
self.__linkkit.thing_setup() 上報資料
Python Link SDK的1.0.0至1.2.11版本中,裝置與物聯網平台串連斷開後,如果繼續調用以下介面發送訊息會拋出異常,需要您做好異常處理。在1.2.12版本後,該API執行失敗後,會返回非零錯誤值,不再拋出異常。
裝置上行資料,通過thing_raw_post_data向服務端發送自訂格式資料:
def protocolToRawData(self, params):
# command set
payload_bytes = b'\x00'
# id
payload_bytes += b'\x00'
payload_bytes += b'\x00'
payload_bytes += b'\x00'
payload_bytes += b'\x01'
# prop_int16 big en
prop_int16 = params["prop_int16"]
payload_bytes += bytes([prop_int16 // 256])
payload_bytes += bytes([prop_int16 % 256])
return payload_bytes
params = {
"prop_int16": 11
}
payload = self.protocolToRawData(params)
print("payload:%r" % payload.hex())
self.__linkkit.thing_raw_post_data(payload) 服務端收到自訂格式資料後給出回複,SDK通過on_thing_raw_data_post通知使用者:
self.__linkkit.on_thing_raw_data_post = self.on_thing_raw_data_post
def on_thing_raw_data_post(self, payload, userdata):
print("on_thing_raw_data_post: %s" % str(payload)) 接收下行訊息
服務端發送資料後,SDK通過on_thing_raw_data_arrived通知使用者:
self.__linkkit.on_thing_raw_data_arrived = self.on_thing_raw_data_arrived
def on_thing_raw_data_arrived(self, payload, userdata):
print("on_thing_raw_data_arrived:%r" % payload)
print("prop data:%r" % self.rawDataToProtocol(payload))