物模型通信

物模型是阿里云物联网平台为产品定义的数据模型,您可以通过物联网平台提供的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对应物模型中服务对应的identifierrequest_id为区分每次调用的ID,params为服务调用参数。

设备端对服务做出返回响应:

self.__linkkit.thing_answer_service(identifier, request_id, code, params)            

identifier为物模型中服务对应的identifierrequest_idon_thing_call_service中传递的reques_idcode为返回码,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))