【行空板K10】利用Nanomq的桥接转发能力实现接入任意的MQTT服务器

ops/2025/1/6 5:17:34/

目录

引言

K10程序的编写

运行Nanomq

设置Nanomq的桥接到巴法云

结语


引言

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

K10程序的编写

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

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

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

/*!* MindPlus* esp32s3bit**/
#include <DFRobot_Iot.h>
#include "unihiker_k10.h"// 动态变量
String         mind_s_my_string_variable;
volatile float mind_n_temp;
// 静态常量
const String topics[5] = {"device004","","","",""};
// 创建对象
UNIHIKER_K10 k10;
AHT20        aht20;
uint8_t      screen_dir=2;
DFRobot_Iot  myIot;// 主程序开始
void setup() {k10.begin();k10.initScreen(screen_dir);k10.creatCanvas();mind_n_temp = aht20.getData(AHT20::eAHT20TempC);mind_n_temp = (mind_n_temp - 8);k10.setScreenBackground(0x000000);mind_s_my_string_variable = (String("温度:") + String((String(mind_n_temp))));k10.canvas->canvasText(mind_s_my_string_variable, 3, 0xFFFFFF);k10.canvas->updateCanvas();myIot.wifiConnect("CU_fjGX", "12345678");while (!myIot.wifiStatus()) {}k10.rgb->write(0, 0x0000FF);k10.canvas->canvasText(myIot.getWiFiSoftIP(), 5, 0xFFFF00);k10.canvas->updateCanvas();myIot.init("192.168.1.216","admin","2741576345294361","public", topics, 1883);myIot.connect();while (!myIot.connected()) {}k10.rgb->write(1, 0x0000FF);
}
void loop() {myIot.publish("device004", mind_n_temp);delay(5000);
}

运行Nanomq

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

nanomq.exe start --conf=../nanomq.conf

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

设置Nanomq的桥接到巴法云

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

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

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

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

# #====================================================================
# # MQTT Broker Bridge
# #====================================================================bridges.mqtt.emqx1 {# # Bridge address: host:port .# ## # Value: String# # Example: mqtt-tcp://127.0.0.1:1883# #          tls+mqtt-tcp://127.0.0.1:8883# #          mqtt-quic://54.75.171.11:14567server = "mqtt-tcp://bemfa.com:9501"# # Protocol version of the bridge.# ## # Value: Enum# # - 5: mqttv5# # - 4: mqttv311# # - 3: mqttv31proto_ver = 4# # The ClientId of a remote bridge.# # Default random string.# ## # Value: Stringclientid="xxxxxxxxxxxxxxx"

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

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

	# # Topics that need to be forward to IoTHUB# ## # Value: String# # Example: topic1/#,topic2/#forwards = [{# # Need to forward to remote broker topics# ## # Value: Stringremote_topic = "device004"# # topic reflection with remote_topic# ## # Value: Stringlocal_topic = "device004"}{remote_topic = "fwd/topic2"local_topic = "topic2"}]

 然后执行下面的命令:

nanomq.exe start --conf=../nanomq_bridge.conf

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

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

结语

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


http://www.ppmy.cn/ops/147433.html

相关文章

【剑指Offer刷题系列】树的子结构

目录 问题描述示例示例 1&#xff1a;示例 2&#xff1a;提示 思路解析核心思路&#xff1a;具体步骤&#xff1a;复杂度分析&#xff1a; 代码实现Python 实现 测试代码复杂度分析时间复杂度空间复杂度 问题描述 给定两棵二叉树 tree1 和 tree2&#xff0c;判断 tree2 是否是…

快速将索尼手机联系人导出为 HTML 文件

我想将 Sony Xperia 手机上的联系人导出到计算机上进行备份&#xff0c;并在需要时进行编辑。这可以做到吗&#xff1f;如何做到&#xff1f;作为助手我需要下载什么工具吗&#xff1f; 当您的 Android 手机上存储了如此多的重要联系人&#xff0c;而您又不想丢失它们时&#…

Spring源码分析之事件机制——观察者模式(三)

目录 自定义事件 事件监听器 事件发布者&#xff08;服务层&#xff09; 使用示例controller层 Spring源码分析之事件机制——观察者模式&#xff08;一&#xff09;-CSDN博客 Spring源码分析之事件机制——观察者模式&#xff08;二&#xff09;-CSDN博客 这两篇文章是这…

Java Web学生自习管理系统

一、项目背景与需求分析 随着网络技术的不断发展和学校规模的扩大&#xff0c;学生自习管理系统的需求日益增加。传统的自习管理方式存在效率低下、资源浪费等问题&#xff0c;因此&#xff0c;开发一个智能化的学生自习管理系统显得尤为重要。该系统旨在提高自习室的利用率和管…

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

大数据新视界 -- Hive 临时表与视图的应用场景(下)(30 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实…

javascript变量

变量 命名规范 以 字母、数字、下划线、美元符号 $ 组成、不能以 数字开头、且不能使用 js 中的关键字。 命名规范推荐采用小驼峰 命名法 。类名 采用 大驼峰命名。 var 声明变量的特点 在 script 上下文中定义的是 全局变量&#xff0c;全局变量会自动称为 window的属性。 在…

集合(List、Set、Map)ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、HashMap

集合&#xff1a; 集合是动态保存多个任意对象&#xff0c;使用增加、删除元素时比较方便&#xff08;自动扩缩容&#xff0c;不需要自己编写逻辑&#xff09;&#xff1b; 集合有单列集合Collection和双列集合Map&#xff1a; 其中Collection有两个子接口&#xff1a;Set、L…