ESP32
学习笔记
MQTT5
共享订阅
什么是共享订阅?
在普通的订阅中,每发布一条消息,所有匹配的订阅端都会收到该消息的副本。然而,当某个订阅端的消费速度无法跟上消息的生产速度时,我们无法将其中一部分消息分流到其他订阅端中来分担压力。这使得订阅端容易成为整个消息系统的性能瓶颈。
因此,MQTT 5.0 引入了共享订阅特性,它使得 MQTT 服务端可以在使用特定订阅的客户端之间均衡地分配消息负载。具体而言,当我们有两个客户端共享一个订阅时,那么每个匹配该订阅的消息都只会有一个副本投递给其中一个客户端。
共享订阅不仅为消费端带来了极佳的水平扩展能力,使我们可以应对更高的吞吐量,还为其带来了高可用性。即使共享订阅组中的一个客户端断开连接或发生故障,其他客户端仍然可以继续处理消息,并在必要时接管原先流向该客户端的消息流1 2.
共享订阅如何工作?
使用共享订阅,我们不需要对客户端的底层代码进行任何改动,只需要在订阅时使用遵循以下命名规范的主题即可:
$share/{共享名}/{主题过滤器}
其中:
$share
是一个固定的前缀,以便服务端知道这是一个共享订阅主题。{主题过滤器}
是我们实际想要订阅的主题。{共享名}
是一个由客户端指定的字符串,表示当前共享订阅使用的共享名。
需要共享同一个订阅的一组订阅会话,必须使用相同的共享名。因此,$share/consumer1/sport/#
和 $share/consumer2/sport/#
属于不同的共享订阅组。
共享订阅和普通订阅互不影响。当某个消息同时与共享订阅和普通订阅匹配时,服务端会向每个匹配的普通订阅的客户端发送该消息的副本,同时向每个匹配的共享订阅组中的其中一个会话发送该消息的副本。如果这些订阅来自同一个客户端,那么这个客户端可能会收到该消息的多个副本。
ESP32 in PIO
踩坑问题
- esp32串口设置为SERIAL_8E1,电脑串口助手在115200下通信不正常,换1.5/2停止位就正常,在921600和1停止位下也正常,但是在115200下和zigbee模块通信正常。。。
- esp32 PubSubClient库的MQTT回调函数似乎是发生在核心1,而且看起来像是一个低优先级的任务挂着的,写一个优先级为3的任务然后死循环,程序都不跑了。如果是在回调函数里写死循环,低优先级的任务依旧正常运行
- pio路径不能有中文,否则无法编译
ESP32 in IDF
sdkconfig
在 ESP-IDF 的各 example 文件夹中,都能看见sdkconfig sdkconfig.old sdkconfig.defaul
,乐鑫官方对这些文件也有准备说明文档。
踩坑问题
-
更新 ESP-IDF 后,idf相关tools在 vscode内无法调用
相关原因:
- 如果是使用git命令拉取了新的IDF,其实只是更新了esp-idf文件夹,还有一个.espressif文件夹没有更新,更新方式为运行 esp-idf文件夹下的 install.bat 文件
- 如果运行了 install.bat 文件还是无法在vscode使用相关tool,则有可能是.vscode文件夹内的配置文件内的相关路径还是老版本的名字,一个解决方法是全部修改正确,一个方法是删了.vscode文件夹,重启vscode重新自动生成解决问题
-
VSCode 内编写IDF工程很多头文件路径绑定问题“无法打开源文件xxx.h”
相关原因:
-
VSCode的C/C++插件配置并非是esp-idf适配版(在vscode的界面右下角,一个铃铛的左边,一般是写着win32),
解决方法是:- 删除 .vscode 文件夹,然后按下 Ctrl+Shift+P 输入 ESP-IDF:Add vscode Configuration Folder 按下回车,即可
-