【前言】
【nRF7002DK】作为一个物联网开发板,可以同时实现wifi与蓝牙的无线连接。因此配置wifi联网与MQTT服务器连接,实现消息的订阅与发布是最为基础的测试。虽然【nRF7002DK】在前面有很多的测试,但是介绍的wifi联网以及MQTT的具体还是不够多,我经过两天的摸索,把我填的坑记录在此,希望对大家有帮助。
【工程的创建】
nRF的Zephyr工程创建是非常简单的,在装好nrfconnectsdk的基础之上,只需要几个步骤便可以生成一个新的工程。我这里选择copy一个mqtt的基础工程,具体如下:
1、新建一个工程,然后选择复制工程示例:
2、选择你需要的SDK版本号:
3、在搜索框输入mqtt然后找到对应的示例,如下图所示:
4、最后选择工程目录,按回车键后就可以生成工程了:
5、生成工程后,在工程中有三个配置文件是必须添加到工程编译中的,如下图所示:
6、配置工程编译:
如图所示,我这里把上面提到的3个配置文件添加到工程编译配置中。点击编译后,第一次编译有点长如果成就会出现下图:
到此我们的工程创建就结束了。接下来进行wifi配置。
【WIFI联网配置】
由于Zephry是通过配置来实现wifi的联网设置的,所以第一步就需要添加wifi的SSD以及密码,还有连接的加密方式。这些配置,在我上面提到的三个.conf里面都可以添加,我这里先择在prj.conf里面添加如下配置:
CONFIG_WIFI_CREDENTIALS_STATIC=y CONFIG_WIFI_CREDENTIALS_STATIC_SSID="HUAWEI-H10R9U" CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="pwd" CONFIG_WIFI_CREDENTIALS_STATIC_TYPE_PSK=y
这四个配置参数,解释为:
定义了静态Wi-Fi配置的凭据信息,具体功能如下:
CONFIG_WIFI_CREDENTIALS_STATIC=y # 启用静态Wi-Fi凭据配置。
CONFIG_WIFI_CREDENTIALS_STATIC_SSID="HUAWEI-H10R9U" # 设置Wi-Fi网络的SSID为"HUAWEI-H10R9U"。
CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="pwd" #设置Wi-Fi网络的密码为"pwd"。
CONFIG_WIFI_CREDENTIALS_STATIC_TYPE_PSK=y # 指定认证类型为PSK(预共享密钥)。
保存好后,重新全编译并下载到开发板。
打开串口终端看到日志信息如下:
从反馈的信息说明已经联上网了。
【mqtt配置】
在工程编译好后,默认是连上了test.mosquitto.org和MQTT的服务器,在我们没有经过MQTT的配置,示例已经有了连接了的。在日志打印中有如下信息:
*** Booting nRF Connect SDK v2.9.0-7787b2649840 *** *** Using Zephyr OS v3.7.99-1f8f3dc29142 *** [00:00:00.568,115] <inf> network: Bringing network interface up and connecting to the network [00:00:09.142,761] <inf> wifi_mgmt_ext: Connection requested [00:00:19.497,741] <inf> network: Network connectivity established [00:00:19.964,752] <inf> network: Network connectivity lost [00:00:20.479,705] <inf> network: Network connectivity established [00:00:27.332,061] <inf> transport: Connected to MQTT broker [00:00:27.332,916] <inf> transport: Hostname: test.mosquitto.org [00:00:27.332,977] <inf> transport: Client ID: F4CE36001328 [00:00:27.332,977] <inf> transport: Port: 8883 [00:00:27.333,007] <inf> transport: TLS: Yes [00:00:27.333,038] <inf> transport: Subscribing to: F4CE36001328/my/subscribe/topic [00:00:27.622,467] <inf> transport: Subscribed to topic F4CE36001328/my/subscribe/topic [00:01:00.572,509] <inf> transport: Published message: "Hello MQTT! Current uptime is: 60569" on topic: "F4CE36001328/my/publish/topic" [00:02:00.573,059] <inf> transport: Published message: "Hello MQTT! Current uptime is: 120569" on topic: "F4CE36001328/my/publish/topic"
我这里使用MQTTx调试工具,连上test.mosquitto.org,并订阅F4CE36001328/my/subscribe/topic
连接到服务器后,我们可以看到互发消息成功:
这是基于例程创建的工程,那么mqtt就跑起来了。下面我将介绍如何配置连接到自己的mqtt服务器中。
【mqtt连接配置分析】
Zephyr的mqtt示例中有一个配置文件src/modules/transport/Kconfig.transport,在这里有一个mqtt的域名设置的宏MQTT_SAMPLE_TRANSPORT_BROKER_HOSTNAME
如果我们需要连接到自己的指定的服务,那么我就把这个宏的值进行修改就行了。
在mqtt的连接中,除了域名,还有一个是端口号,通常使用1883。当然也可以通过服务器的设置,改变为其的端口号。这个域名端口号的配置,在工程中是在配置文件overlay-tls-nrf70.conf中来定义的:
拿到这两个参数,我就可以修改这两个宏定义来连接我自己的mqtt服务器了。
我使用emqx来搭建了一个自己的服务器:ip地址为19.168.3.231,端口为1883,我使用mqttx进行了连接:
同时我修改参数并下载到开发板
下载到开发板,我打开日志,看到可以连接到wifi,但是没有连接上mqtt服务器:
【问题查找】
因为我是第一次使用Zephyr来进行mqtt的连接,我起先使用免费的服务器的test.mosquitto.org 的8883端口进行连接是正常的,我这里只修改了IP与端口号,说明程序没有问题。还有我使用mqttx客户端连接到我的服务器也是正常的。想起来应该没有问题呀。然后我就折磨了一晚上,当我睡时突然想到了8883是基于TLS连接的,是不是问题出在这里。
【解决方法】
我使用AI工具对overlay-tls-nrf70.conf进行了解析,重新配置了参数,参数如下:
# TLS CONFIG_MQTT_LIB_TLS=n CONFIG_MQTT_HELPER_PORT=1883 CONFIG_MQTT_KEEPALIVE=30 # Credentials located under <sample-dir>/src/modules/transport/credentials/ will be automatically # provisioned prior to connecting to the server by the MQTT helper library. # CONFIG_MQTT_HELPER_SEC_TAG=955 # CONFIG_MQTT_HELPER_PROVISION_CERTIFICATES=y # CONFIG_MQTT_HELPER_CERTIFICATES_FOLDER="src/modules/transport/credentials" # Native network stack CONFIG_NRF_SECURITY=n CONFIG_MBEDTLS=n CONFIG_MBEDTLS_ENABLE_HEAP=n # CONFIG_MBEDTLS_HEAP_SIZE=81920 CONFIG_MBEDTLS_RSA_C=n # NET Sockets CONFIG_NET_SOCKETS_SOCKOPT_TLS=n # TLS credentials CONFIG_TLS_CREDENTIALS_BACKEND_PROTECTED_STORAGE=n
就是把TLS的配置项都修改为n,重新编译工程并下载到开发板打印日志如下:
*** Booting nRF Connect SDK v2.9.0-7787b2649840 *** *** Using Zephyr OS v3.7.99-1f8f3dc29142 *** [00:00:00.605,926] <inf> network: Bringing network interface up and connecting to the network [00:00:09.222,564] <inf> wifi_mgmt_ext: Connection requested [00:00:19.591,308] <inf> network: Network connectivity established [00:00:20.181,640] <inf> network: Network connectivity lost [00:00:20.705,474] <inf> network: Network connectivity established [00:00:25.740,142] <inf> transport: Connected to MQTT broker [00:00:25.740,173] <inf> transport: Hostname: 192.168.3.20 [00:00:25.740,203] <inf> transport: Client ID: F4CE36001328 [00:00:25.740,234] <inf> transport: Port: 1883 [00:00:25.740,234] <inf> transport: TLS: No [00:00:25.740,295] <inf> transport: Subscribing to: F4CE36001328/my/subscribe/topic [00:00:25.751,953] <inf> transport: Subscribed to topic F4CE36001328/my/subscribe/topic [00:01:00.608,123] <inf> transport: Published message: "Hello MQTT! Current uptime is: 60606" on topic: "F4CE36001328/my/publish/topic" [00:01:23.971,832] <inf> transport: Received payload: "msg": "hello" on topic: F4CE36001328/my/subscribe/topic [00:02:00.608,642] <inf> transport: Published message: "Hello MQTT! Current uptime is: 120607" on topic: "F4CE36001328/my/publish/topic" [00:03:00.608,520] <inf> transport: Published message: "Hello MQTT! Current uptime is: 180607" on topic: "F4CE36001328/my/publish/topic" [00:04:00.608,764] <inf> transport: Published message: "Hello MQTT! Current uptime is: 240607" on topic: "F4CE36001328/my/publish/topic" uart:~$
说明连接成功了。
打开mqttx客户端,也成功的收到消息,同时发布消息在开发板上也成功收到了:
【总结】
经过两天的学习,终于把mqtt给调通了。在调试的过程中,我用win11开的服务器,有时开发板连不上,后面我用macOS重新了服务器,就成功收到了。如果报错误码:-116,说明开发板与服务器连接不成功,需要重启一下服务端。
[00:05:40.917,846] <err> mqtt_helper: mqtt_connect, error: -116 [00:05:40.917,877] <err> transport: Failed connecting to MQTT, error code: -116
在连接好mqtt后,我接下来就可以实现物联网的其他工作了。