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

目录

引言

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:14567
	
	server = "mqtt-tcp://bemfa.com:9501"
	# # Protocol version of the bridge.
	# #
	# # Value: Enum
	# # - 5: mqttv5
	# # - 4: mqttv311
	# # - 3: mqttv31
	proto_ver = 4
	# # The ClientId of a remote bridge.
	# # Default random string.
	# #
	# # Value: String
	clientid="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: String
			remote_topic = "device004"
			# # topic reflection with remote_topic
			# #
			# # Value: String
			local_topic = "device004"
		}
		{
			remote_topic = "fwd/topic2"
			local_topic = "topic2"
		}
	]

 然后执行下面的命令:

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

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

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

结语

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

### 行空 K10 在信息科技创新大赛中的创意智造代码示例 行空 K10 是一款专为快速体验物联网和学习人工智能设计的开发学习,其易用性和强大的功能使其成为适合各个年龄段学生的理想选择[^1]。以下是一个基于行空 K10 的屏幕显示循环图文“行空 K10”的代码示例,该示例展示了如何初始化屏幕、设置背景颜色并实现循环显示文字。 #### 初始化屏幕并显示循环图文的代码示例 ```python from pinpong.board import Board, Pin from pinpong.extension.unihiker import * # 初始化行空对象 k10 = Unihiker() def setup(): # 初始化行空 k10.begin() # 初始化行空对象[^2] # 初始化屏幕方向 k10.initScreen(screen_dir=3) # 设置屏幕方向[^2] # 创建画布 k10.creatCanvas() # 创建画布[^2] # 设置屏幕背景颜色为黑色 k10.setScreenBackground(0x000000) # 设置背景颜色为黑色 def loop(): while True: # 显示文字 k10.clearDisplay() # 清除屏幕内容 k10.setTextSize(2) # 设置文字大小 k10.setTextColor(0xFFFFFF) # 设置文字颜色为白色 k10.drawText("行空 K10", 50, 50) # 在屏幕上绘制文字 k10.display() # 刷新屏幕显示 time.sleep(1) # 延时一秒 # 显示图案(例如一个简单的矩形) k10.drawRect(50, 100, 100, 50, 0xFFFFFF) # 绘制矩形 k10.display() # 刷新屏幕显示 time.sleep(1) # 延时一秒 # 调用函数 setup() loop() ``` #### 代码说明 - `k10.begin()`:初始化行空对象,确保硬件正常工作[^2]。 - `k10.initScreen(screen_dir)`:设置屏幕方向,参数`screen_dir`可选值为0至3,分别代表不同的屏幕旋转角度。 - `k10.creatCanvas()`:创建一个用于绘图的画布[^2]。 - `k10.setScreenBackground(color)`:设置屏幕背景颜色,参数`color`为十六进制颜色值。 - `k10.drawText(text, x, y)`:在屏幕上指定位置`(x, y)`绘制文字。 - `k10.drawRect(x, y, width, height, color)`:绘制矩形,参数分别为左上角坐标、宽高和颜色。 此代码示例展示了如何使用行空 K10 实现屏幕上的循环图文显示,适用于信息科技创新大赛中的创意智造项目。 #### 硬件控制扩展示例 以下是一个扩展示例,展示如何通过按钮控制 LED 灯的开关状态: ```python from pinpong.board import Board, Pin # 初始化引脚 button_pin = Pin(Pin.P16, Pin.IN) # 按钮连接到P16 led_pin = Pin(Pin.P17, Pin.OUT) # LED连接到P17 def loop(): while True: button_state = button_pin.read_digital() # 读取按钮状态 if button_state == 0: # 按钮按下时 led_pin.write_digital(1) # 打开LED灯 else: led_pin.write_digital(0) # 关闭LED灯 # 调用函数 loop() ``` #### 代码说明 - `Pin(Pin.P16, Pin.IN)`:将 P16 引脚设置为输入模式,用于检测按钮状态。 - `Pin(Pin.P17, Pin.OUT)`:将 P17 引脚设置为输出模式,用于控制 LED 灯。 - `button_pin.read_digital()`:读取按钮的数字状态,返回值为 0 或 1。 - `led_pin.write_digital(state)`:设置 LED 灯的状态,`state` 参数为 0 或 1。 此代码示例展示了如何通过按钮控制 LED 灯的开关状态,适用于信息科技创新大赛中的互动硬件设计项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值