diff --git a/docs/sbs/zh/mqtt/media/sbs_MQTT_21071401.jpg b/docs/sbs/zh/mqtt/media/sbs_MQTT_21071401.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95ed15504a990db411200df9cf631f7b8162171c Binary files /dev/null and b/docs/sbs/zh/mqtt/media/sbs_MQTT_21071401.jpg differ diff --git a/docs/sbs/zh/mqtt/media/sbs_MQTT_21071402.jpg b/docs/sbs/zh/mqtt/media/sbs_MQTT_21071402.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c582ad8dc77ccef3e780238eff337f0e6f241258 Binary files /dev/null and b/docs/sbs/zh/mqtt/media/sbs_MQTT_21071402.jpg differ diff --git a/docs/sbs/zh/mqtt/media/sbs_MQTT_21071403.jpg b/docs/sbs/zh/mqtt/media/sbs_MQTT_21071403.jpg new file mode 100644 index 0000000000000000000000000000000000000000..507c3544b2bf43a324629d2f6e528762c2a2e5e5 Binary files /dev/null and b/docs/sbs/zh/mqtt/media/sbs_MQTT_21071403.jpg differ diff --git a/docs/sbs/zh/mqtt/mqtt_Faq_use.md b/docs/sbs/zh/mqtt/mqtt_Faq_use.md index 0d0d498409e8224045fc5838b1d2bf1c8f1a63ef..7292fe1ec83409528ac5e53ed6221d39f32802e2 100644 --- a/docs/sbs/zh/mqtt/mqtt_Faq_use.md +++ b/docs/sbs/zh/mqtt/mqtt_Faq_use.md @@ -4,16 +4,17 @@ **修订记录** -| **版本** | **日期** | **作者** | **变更表述** | -| -------- | -------- | -------- | -------------------------------- | -| 1.0.0 | 2021-4-6 | 唐大卫 | 初始版本 | -| 1.0.1 | 2021-4-6 | 周成柱 | 汇总到文件系统中、处理对应的参数 | - +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | --------- | -------- | -------------------------------- | +| 1.0.0 | 2021-4-6 | 唐大卫 | 初始版本 | +| 1.0.1 | 2021-4-6 | 周成柱 | 汇总到文件系统中、处理对应的参数 | +| 1.0.2 | 2021-7-14 | 叶智强 | MQTT常见问题 | ## MQTT连接状态 -### MQTT连接状态的查询 +### MQTT连接状态的查询 +ret = c.get_mqttsta() @@ -29,3 +30,121 @@ [mqtt 断线测试-测试代码](code/mqtt_test_log.py) + + + + + + +## MQTT遗嘱的使用 + +调用函数set_last_will();必须要先设置遗嘱消息,再connect(),才能有效。 + + + +retain=False + +遗嘱的retain参数设置为True时,触发后,订阅者每次subscribe都会收到遗嘱消息。 + +遗嘱的retain参数设置为False时,触发后,一次性通知仅在线的订阅者。 + + + +取消遗嘱消息: + +retain为true时,发布空消息的retain也要为true;retain为False时,发布空消息的retain也要为False; + 客户端没有调用disconnect(),却意外掉线时,才会发布遗嘱消息; + +删除retain消息,可以发布一个空的retain消息,因为每个新的retain消息都会覆盖最后一个retain消息; + + + +示例代码: + +```python + # 创建一个mqtt实例 + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=5) # 必须要 keepalive=30 ,否则连接不上 + # 设置消息回调 + c.set_callback(sub_cb) + # 设置遗嘱消息 + c.set_last_will(topic='set_last_will', msg='set_last_will', retain=False, qos=1) + # 建立连接 + c.connect() + # 订阅主题 + c.subscribe(SUB_TOPIC.format(IMEI)) + # 发布消息 + c.publish(PUB_TOPIC.format(IMEI), "test publish 你好") +``` + + + +## 改为main.py,MQTT连不上服务器 + +自动启动程序时,模组还没来及连接网络。 + + + +```python + PROJECT_NAME = "QuecPython" + PROJECT_VERSION = "1.0.0" + + checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + checknet.poweron_print_once() + + try: + checknet.wait_network_connected() + except BaseException: + print('Not Net, Resatrting...') + utime.sleep_ms(200) + Power.powerRestart() +``` + + + +## 阻塞函数mqtt_msg(),什么时候跳出来 + +正常情况下收到订阅的消息时,会跳出来; + +另外一种情况是心跳包时间到,底层发送ping包时,会跳出来。 + + + +## 在本地EMQ X通信正常,换到aliyun就通信不了了 + +通信不成功时,要检查IP、端口、要看subscribe、publish的topic; + +特别注意有的topic只能publish,不能subscribe; + +同样有的topic只能subscribe,不能publish; + +也不能随便自己定义topic,必须要按照格式来。 + + + +## 在代码里如何编写mqtt_msg和publish的逻辑程序 + +开创两条线程,一条线程专门用于mqtt_msg(),另一条线程专门用于publish消息。 + +在使用线程的时候,每条线程都是while 1:必须有sleep()函数,才能切换线程,否则一直无法执行其他线程代码,在哪里有延时就在哪里切换线程。 + + + +## 使用MQTTs证书连接服务器 + +代码里写入证书时,必须按照下图格式书写 + + + +![sbs_MQTT_21071401](media\sbs_MQTT_21071401.jpg) + +![sbs_MQTT_21071402](media\sbs_MQTT_21071402.jpg) + +![sbs_MQTT_21071403](media\sbs_MQTT_21071403.jpg) + + \ No newline at end of file