基于MQTT Topic通信

设备可使用物联网平台提供的Python Link SDK通过MQTT协议Topic与物联网平台进行通信。本文介绍设备如何直接基于MQTT Topic向物联网平台发送消息,以及接收物联网平台云端下发的消息。

背景信息

Topic是设备与物联网平台之间通信的管道,设备可通过Topic实现消息的发送和接收。

Topic格式必须以/进行分层,区分每个类目。自定义Topic的前三个类目已经规定好,第一个代表产品标识ProductKey,第二个${deviceName}通配DeviceName,第三个user用来标识产品的自定义Topic类。

更多有关Topic的信息,请参见什么是Topic

从云端接收消息

rc, mid = lk.subscribe_topic(topic,qos=1)         
说明

mqtt_sub_pub_on.py这个demo代码示例中,我们通过lk.to_full_topic("user/test")快速生成一个topicto_full_topic是一个Topic自动生成接口,您在前面已经填入了ProductKey、DeviceName等参数,该接口调用后将返回一个字符串,其值等同于/YourProductKey/YourDeviceName/user/test

订阅结果通过on_subscribe_topic通知用户:

lk.on_subscribe_topic = on_subscribe_topic
def on_subscribe_topic(mid, granted_qos, userdata):
    print("on_subscribe_topic mid:%d, granted_qos:%s" %
          (mid, str(','.join('%s' % it for it in granted_qos))))
    pass
            

granded_qos为订阅Topic列表对应的QoS返回结果,正常值为0或1,128表示订阅失败。

接收与处理来自云端的消息

通过on_topic_message()回调告知用户:

lk.on_topic_message = on_topic_message
def on_topic_message(topic, payload, qos, userdata):
    print("on_topic_message:" + topic + " payload:" + str(payload) + " qos:" + str(qos))
    pass
            

发送消息到云端

重要

Python Link SDK的1.0.0至1.2.11版本中,设备与物联网平台连接断开后,如果继续调用以下接口发送消息会抛出异常,需要您做好异常处理。在1.2.12版本后,该API执行失败后,会返回非零错误值,不再抛出异常。

发送消息

通过调用publish_topic()实现将消息发送到云端:

rc, mid = lk.publish_topic(topic, payload)     

发布消息结果通知

消息发送后,云端是否成功接收通过on_publish_topic回调通知用户:

lk.on_publish_topic = on_publish_topic
def on_publish_topic(mid, userdata):
    print("on_publish_topic mid:%d" % mid)
            

publish_topic rc返回值为0则表明已经写入到了发送缓冲区,回调on_publish_topic表明publish成功。

取消消息订阅

重要

Python Link SDK的1.0.0至1.2.11版本中,设备与物联网平台连接断开后,继续调用以下接口取消消息订阅会抛出异常,需要您做好异常处理。在1.2.12版本后,该API执行失败后,会返回非零错误值,不再抛出异常。

通过调用unsubscribe_topic()取消对指定Topic消息的订阅:

rc, mid = lk.unsubscribe_topic(topic)           

取消订阅的结果通过on_unsubscribe_topic回调通知用户:

lk.on_unsubscribe_topic = on_unsubscribe_topic
def on_unsubscribe_topic(mid, userdata):
    print("on_unsubscribe_topic mid:%d" % mid)
    pass
            

unsubscribe_topic返回值rc0表明请求已写入缓存区,其它值失败。当回调on_unsubscribe_topic时表明取消成功。