本帖最后由 dirty 于 2023-12-15 00:58 编辑
本篇实现nRF7002-DK MQTT发布订阅并实现点灯控制。
一.了解MQTT
MQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议,在物联网云端与设备端数据交互通讯方面应用广泛。MQTT使用发布/订阅消息模式,Topic与Playload组合形式,有三种消息发布服务质量QoS。下图是MQTT网络结构。
图1:MQTT网络结构
二.工程代码
在这里参照官方ncs\v2.5.0\nrf\samples\net\mqtt工程代码,做好配置及适当修改。
1.在pri.conf添加wifi账号密码以便连接服务端。
CONFIG_WIFI_CREDENTIALS_STATIC_SSID="XXX"
CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="XXX"
CONFIG_WIFI_CREDENTIALS_STATIC_TYPE_PSK=y
2.增加控制LED灯代码,由于网络连接状态已使用LED2,这里MQTT订阅控制就用LED1,添加代码如下.
src\modules\led\led.c
#define LED0 0
void led0_on(void)
{
int err = 0;
err = led_on(led_device, LED0);
if (err) {
LOG_ERR("led_on, error: %d", err);
}
}
void led0_off(void)
{
int err = 0;
err = led_off(led_device, LED0);
if (err) {
LOG_ERR("led_off, error: %d", err);
}
}
3.在MQTT订阅里检索关键字,这里是"ON","OFF",并分别控制LED1亮、灭,代码如下
src\modules\transport\transport.c
static void on_mqtt_publish(struct mqtt_helper_buf topic, struct mqtt_helper_buf payload)
{
LOG_INF("Received payload: %.*s on topic: %.*s", payload.size,
payload.ptr,
topic.size,
topic.ptr);
//检索控制LED1
if(strcmp(payload.ptr,"ON")==0)
{
LOG_INF("Light on LED0 \r\n");
led0_on();
}
else if(strcmp(payload.ptr,"OFF")==0)
{
LOG_INF("Light off LED0 \r\n");
led0_off();
}
}
4.配置编译烧录
编译配置,这里使用了TLS加密配置,第1步需要配置上,否则编译不过。编译配置如下图所示,编译完成后烧录。
图2:编译配置
5.打开串口,按复位键,可看到开发板连上服务器test.mosquitto.org ,并间隔定时发布消息,也可以通过按Button1主动触发发布。如下图是MQTT连接与消息发布日志。我们可以看到MQTT的host,Client ID,Port,发布订阅topic.对后面MQTT代理工具配置有用。
图3:MQTT连接与消息发布
三.MQTT发布订阅测验及控灯
1.MQTT代理工具准备及配置连接
这里使用MQTT.fx工具,配置如下图所示
图4:MQTT工具配置
2. 工具连接与订阅设备端消息发布
连接好后工具右侧显示绿色点,在订阅选项卡填上topic并订阅。在设备端按button1可主动发布订阅,在MQTT端订阅收到发布消息。如下图所示
图5:MQTT连接与消息订阅
3.MQTT消息发布,控灯
在MQTT工具发布选项卡填上发布topic,写上消息,点击发布,观察设备端收到订阅消息并LED1按消息亮/灭。如下图所示
图6:MQTT发布消息,设备端订阅
开发板上LED1对订阅的消息受相应控制。
图7:设备MQTT订阅LED1灯效
四.小结
Nordic SDK MQTT 功能集成较为完善,通过实践掌握使用可以根据应用需要很方便快捷实现定制化需求,在与云端交互通讯方面很是好用、有用。