【nRF7002-DK Wi-Fi® 6开发套件】MQTT通讯与点灯
<div class='showpostmsg'> 本帖最后由 dirty 于 2023-12-15 00:58 编辑<p> 本篇实现nRF7002-DK MQTT发布订阅并实现点灯控制。</p>
<p>一.了解MQTT</p>
<p> MQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议,在物联网云端与设备端数据交互通讯方面应用广泛。MQTT使用发布/订阅消息模式,Topic与Playload组合形式,有三种消息发布服务质量QoS。下图是MQTT网络结构。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图1:MQTT网络结构</div>
<p>二.工程代码</p>
<p> 在这里参照官方ncs\v2.5.0\nrf\samples\net\mqtt工程代码,做好配置及适当修改。</p>
<p>1.在pri.conf添加wifi账号密码以便连接服务端。</p>
<pre>
<code class="language-cpp">CONFIG_WIFI_CREDENTIALS_STATIC_SSID="XXX"
CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="XXX"
CONFIG_WIFI_CREDENTIALS_STATIC_TYPE_PSK=y</code></pre>
<p> 2.增加控制LED灯代码,由于网络连接状态已使用LED2,这里MQTT订阅控制就用LED1,添加代码如下.</p>
<p>src\modules\led\led.c</p>
<pre>
<code class="language-cpp">#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);
}
}
</code></pre>
<p> 3.在MQTT订阅里检索关键字,这里是"ON","OFF",并分别控制LED1亮、灭,代码如下</p>
<p>src\modules\transport\transport.c</p>
<pre>
<code class="language-cpp">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();
}
}
</code></pre>
<p> 4.配置编译烧录</p>
<p> 编译配置,这里使用了TLS加密配置,第1步需要配置上,否则编译不过。编译配置如下图所示,编译完成后烧录。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图2:编译配置</div>
<p>5.打开串口,按复位键,可看到开发板连上服务器test.mosquitto.org ,并间隔定时发布消息,也可以通过按Button1主动触发发布。如下图是MQTT连接与消息发布日志。我们可以看到MQTT的host,Client ID,Port,发布订阅topic.对后面MQTT代理工具配置有用。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图3:MQTT连接与消息发布</div>
<p> </p>
<p>三.MQTT发布订阅测验及控灯</p>
<p>1.MQTT代理工具准备及配置连接</p>
<p> 这里使用MQTT.fx工具,配置如下图所示</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图4:MQTT工具配置</div>
<p>2. 工具连接与订阅设备端消息发布</p>
<p> 连接好后工具右侧显示绿色点,在订阅选项卡填上topic并订阅。在设备端按button1可主动发布订阅,在MQTT端订阅收到发布消息。如下图所示</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图5:MQTT连接与消息订阅</div>
<p>3.MQTT消息发布,控灯</p>
<p> 在MQTT工具发布选项卡填上发布topic,写上消息,点击发布,观察设备端收到订阅消息并LED1按消息亮/灭。如下图所示</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图6:MQTT发布消息,设备端订阅</div>
<p> 开发板上LED1对订阅的消息受相应控制。</p>
<div style="text-align: center;"></div>
<div style="text-align: center;">图7:设备MQTT订阅LED1灯效</div>
<p> </p>
<p>四.小结</p>
<p> Nordic SDK MQTT 功能集成较为完善,通过实践掌握使用可以根据应用需要很方便快捷实现定制化需求,在与云端交互通讯方面很是好用、有用。</p>
<div style="text-align: center;"> </div>
<p><br />
</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>楼主的分享十分有用,先收藏起来,慢慢学习,非常感谢楼主的无私奉献</p>
页:
[1]