mqtt - Mqtt 发布响应和 Mqtt 订阅消息可以混淆吗?
问题描述
我正在微控制器上编写一个 mqtt 客户端。它通过 LTE 调制解调器连接并连接到 mqtt 代理。我在 LTE 调制解调器上使用 tcp/ip 堆栈和 mqtt 堆栈。我将 LTE 调制解调器连接到我的 UART,然后解析收到的数据。
我向调制解调器发送命令以连接到 mqtt 代理的“驱动程序”部分是简单的部分。当我在线和操作时,它变得很难看。然后我定期发送(发布)消息,同时我可以响应我订阅的“服务器请求”。
因此,每当我向代理发布消息时,理论上我可以“同时”收到来自代理的订阅消息(就在我收到对我的发布请求的响应之前或之后)。
我通常如何处理这个问题?处理此问题的最佳做法是什么?
一些例子来澄清我的问题:
MQTT开始:
Send: AT+CMQTTSTART
Receive: [CR][NL]OK[CR][NL]
[CR] = \r
[NL] = \n
由于 mqtt 代理还不知道我存在,所以我不必担心“意外”发送任何字节。因此,在我订阅主题之前,一切都很容易。
但是当我开始发布一些东西时,在我成功订阅了一些主题之后,以下几种可能性处理起来有点棘手:
Send: AT+CMQTTTOPIC=0,3
Receive: [CR][NL]> This is the expected reply for the given command
Receive: [CR][NL]+CMQTTRXSTART:.... This is the start of a published message
当然,顺序甚至可以反过来。如果发布的消息足够长,以至于它被分成不同的数据包,那么对我的主题命令的响应可能会在发布的消息数据包之间的某个位置结束。
我觉得我做错了什么,这让我陷入了这种过于复杂的境地。由于 mqtt 应该是“简单的”,我一定做错了什么。
希望有人可以帮助我一点!
解决方案
推荐阅读
- java - 如何为两个 Android 应用程序制作一个后端和数据库
- laravel - 使用 bootstrap class="custom-select" 多重选择不起作用
- python - 在 Altair (Python) 中标记分层图表
- r - 如何根据R中的列名绘制一行
- javascript - 如何选择一个随机变量,然后从变量列表中选择一个随机变量?
- ios - 无法为模拟器构建应用程序。在 iPhone 11 Pro Max 上启动应用程序时出错
- android - 材质组件默认为 colorAccent 而不是 colorPrimary
- html - 导航栏切换器处于固定位置
- python - 在 ubuntu 18.04 上为 python 3.7.5 安装 mysqclient 时出错
- c - 如何在c中删除链表中的头?