799浏览
查看: 799|回复: 0

[K10教程] 利用Nanomq的桥接转发能力实现接入任意的的MQTT服务器

[复制链接]
行空板K10作为一块物联网开发板,内置了MQTT的支持,不过它的MQTT有限制,只支持阿里云、OneNet、EasyIoT和SIoT4种MQTT服务器。这对想使用其他MQTT服务器的用户来说不太方便。本文就尝试使用Nanmq轻量化MQTT代理的桥接转发功能实现行空板K10访问任意的MQTT服务器。

K10程序的编写
K10的程序仍然使用Mind+编写。程序的基本功能是读取并显示温度信息,然后连接WiFi热点,成功后在连接MQTT服务器,然后发送温度信息到device004主题。


利用Nanomq的桥接转发能力实现接入任意的的MQTT服务器图2

其中在MQTT参数设置部分选择SIoT,因为它是K10所支持的4种服务器中可以部署在局域网的唯一一种,其他三种服务器的IP或域名都是写死的,不能修改。SIoT是DFRobot提供的免费MQTT服务器。Mind+的MQTT组件会自动生成clientid,以确保不同开发板产生的id不同,但是不支持自己设置clientid,这使得像巴法云、华为云IoTDA这样的平台就不能直接接入。我们在本地部署EMQ(杭州映云科技有限公司)Nanomq,把它的服务器地址作为SIoT服务器的地址,具体参数设置如下:

利用Nanomq的桥接转发能力实现接入任意的的MQTT服务器图1

在自动生成窗口,可以看到如下的程序:

  1. /*!
  2. * MindPlus
  3. * esp32s3bit
  4. *
  5. */
  6. #include <DFRobot_Iot.h>
  7. #include "unihiker_k10.h"
  8. // 动态变量
  9. String         mind_s_my_string_variable;
  10. volatile float mind_n_temp;
  11. // 静态常量
  12. const String topics[5] = {"device004","","","",""};
  13. // 创建对象
  14. UNIHIKER_K10 k10;
  15. AHT20        aht20;
  16. uint8_t      screen_dir=2;
  17. DFRobot_Iot  myIot;
  18. // 主程序开始
  19. void setup() {
  20.         k10.begin();
  21.         k10.initScreen(screen_dir);
  22.         k10.creatCanvas();
  23.         mind_n_temp = aht20.getData(AHT20::eAHT20TempC);
  24.         mind_n_temp = (mind_n_temp - 8);
  25.         k10.setScreenBackground(0x000000);
  26.         mind_s_my_string_variable = (String("温度:") + String((String(mind_n_temp))));
  27.         k10.canvas->canvasText(mind_s_my_string_variable, 3, 0xFFFFFF);
  28.         k10.canvas->updateCanvas();
  29.         myIot.wifiConnect("CU_fjGX", "12345678");
  30.         while (!myIot.wifiStatus()) {}
  31.         k10.rgb->write(0, 0x0000FF);
  32.         k10.canvas->canvasText(myIot.getWiFiSoftIP(), 5, 0xFFFF00);
  33.         k10.canvas->updateCanvas();
  34.         myIot.init("192.168.1.216","admin","2741576345294361","public", topics, 1883);
  35.         myIot.connect();
  36.         while (!myIot.connected()) {}
  37.         k10.rgb->write(1, 0x0000FF);
  38. }
  39. void loop() {
  40.         myIot.publish("device004", mind_n_temp);
  41.         delay(5000);
  42. }
复制代码

运行Nanomq
NanoMQ 是于 2021 年初发布的边缘计算开源项目,是面向物联网边缘计算场景的下一代轻量级高性能 MQTT 消息服务器。这个服务器下载后直接在本地解压就可以了。然后,使用如下命令启动服务器:

  1. nanomq.exe start --conf=../nanomq.conf
复制代码

我在另外一台电脑上运行MQTTX,然后订阅Nanomq的device004消息。K10开发板启动成功后,连接MQTT服务器,就可以在MQTTX客户端每隔5秒就可以收到消息推送。

利用Nanomq的桥接转发能力实现接入任意的的MQTT服务器图3

设置Nanomq的桥接到巴法云
不是所有MQTT平台都能使用上面的方法进行连接,对于无法连接的平台可以使用Nanomq进行桥接转发数据。桥接是一种连接多个 MQTT 消息中间件的策略。在桥接模式下,节点之间不进行主题树或路由表的复制操作。桥接模式的核心职能包括:根据预定的规则,将消息转发至指定的桥接节点;对桥接节点上的特定主题进行订阅,并在接收到消息后在本地节点或集群内进行传递和转发。

下面以巴法云为例,说明如何利用桥接功能使K10开发板接入MQTT服务器。

Nanomq提供了一个nanomq_bridge.conf文件,我在此基础上进行修改:

首先加入巴法云的登录信息:

  1. # #====================================================================
  2. # # MQTT Broker Bridge
  3. # #====================================================================
  4. bridges.mqtt.emqx1 {
  5.         # # Bridge address: host:port .
  6.         # #
  7.         # # Value: String
  8.         # # Example: mqtt-tcp://127.0.0.1:1883
  9.         # #          tls+mqtt-tcp://127.0.0.1:8883
  10.         # #          mqtt-quic://54.75.171.11:14567
  11.        
  12.         server = "mqtt-tcp://bemfa.com:9501"
  13.         # # Protocol version of the bridge.
  14.         # #
  15.         # # Value: Enum
  16.         # # - 5: mqttv5
  17.         # # - 4: mqttv311
  18.         # # - 3: mqttv31
  19.         proto_ver = 4
  20.         # # The ClientId of a remote bridge.
  21.         # # Default random string.
  22.         # #
  23.         # # Value: String
  24.         clientid="xxxxxxxxxxxxxxx"
复制代码

巴法云默认是用clientid作为登录服务器的标识,所以这里一定要填写。另外,巴法云不支持MQTT 5,所以MQTT版本一定要选MQTT v3.11。

forwards部分是转发到远端 MQTT 服务器的主题数组,应包括消息主题(remote_topic)、(local_topic)和 QoS (qos)。remote_topic和local_topic可以不同。

  1. # # Topics that need to be forward to IoTHUB
  2.         # #
  3.         # # Value: String
  4.         # # Example: topic1/#,topic2/#
  5.         forwards = [
  6.                 {
  7.                         # # Need to forward to remote broker topics
  8.                         # #
  9.                         # # Value: String
  10.                         remote_topic = "device004"
  11.                         # # topic reflection with remote_topic
  12.                         # #
  13.                         # # Value: String
  14.                         local_topic = "device004"
  15.                 }
  16.                 {
  17.                         remote_topic = "fwd/topic2"
  18.                         local_topic = "topic2"
  19.                 }
  20.         ]
复制代码

然后执行下面的命令:

  1. nanomq.exe start --conf=../nanomq_bridge.conf
复制代码

然后在巴法云的后台就可以看到发布者已经登录并发布数据:

利用Nanomq的桥接转发能力实现接入任意的的MQTT服务器图4

使用MQTTX也可以接收到巴法云转发的数据。至此完美实现了功能。

结语
本文的方法实现了K10开发板接入到任意的MQTT服务器。不过这个方法仍然比较麻烦,因为需要安装一个本地的Nanomq。后面将研究如何写个第三方库,使得K10能够直接接入MQTT服务器。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail