设备可使用物联网平台提供的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")
快速生成一个topic
。to_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
返回值rc
为0
表明请求已写入缓存区,其它值失败。当回调on_unsubscribe_topic
时表明取消成功。