nrf9160 做modem—— 连接云(接入方式MQTT)
今天测试把nrf9160作为modem的例程Serial LTE Modem程序(后面简称slm),何为做modem,通俗来说就是将nrf9160作为无线模块,主控由其余MCU做,主控通过AT命令控制nrf9160工作。
前期开发准备:
- nrf9160-DK版
- nRF Connect for Desktop(桌面版)
- NCS(官方最新开发SDK,笔者写这篇博客时更新到NCS1.9)
- 一张新的移动物联网卡(特别注意一定是要移动的,还要是激活的物联网卡,购买时让移动公司进行激活,因为设备会进行绑定,如果需要迁移到其余设备,需要去找移动客服进行解绑)。
一、开发环境安装。
环境安装请参考nrf9160开机测试——连接nrfcloud云 - 星辰_start - 博客园 (cnblogs.com)。
二、连接测试
1、连接MQTT云(无证书连接)
由于我没建立自己的云网站,在这利用一个免费的MQTT测试云进行硬件测试。
1.1、下载modem固件
第一步先去官网上下载mfw_nrf9160的固件(这注意一下版本,固件版本和NCS版本是有对应的,官网下载固件处,点击向下的箭头直接查看适用于那个NCS版本),下载链接如下:
Compatible Downloads - nordicsemi.com,(或者在官网,搜索9160进入9160 DK,然后下拉网页同样找到如图界面进行下载)。
1.2、下载mfw_nrf9160固件到nrf9160
打开nrf connect 下的programmer软件,进行固件下载:
第一步链接开发板和PC端,然后打开programmer软件,链接开发板,然后擦除,在解压刚刚下载的nrf9160dk_fw_2022-02-17_ec486dab.zip其中有一个mfw_nrf9160_1.3.1.zip固件直接拖到文件添加区,然后点击write,进行烧写。
等待烧写完成:
这一步完成后我们就可以,打开SES或者VS code编译NCS中的官方程序进行程序下载。
1.3、APP程序下载
打开VS code,按照如图所示操作,选择好先前下载NCS文件。
如下为选择的NCS和编译工具链,1为下载好的NCS目录,2为目录中的工具链目录toolchain,选择好有如图显示即可,笔者使用了NCS1.9,其余版本同样的选择。选择完毕不用其余操作。
然后建立镜像工程:流程如图,
在弹出的窗口中选择如下工程:slm。然后点击open in browser,会打开一个网页有对这个工程的解释与指导,然后创建工程。
然后选择板子:
从而得到一个nrf9160的项目,编译并下载。
1.4、MQTT云客户端准备
由于我使用了mosquitto进行测试,首先我们去到mosquitto的官网下载一个mosquitto客户端:连接如下 :Download | Eclipse Mosquitto,如图为官网选择和自己环境相关的客户端进行下载,由于nordic的LTE Link Monitor也运行于Windows,所以建议在开发时使用Windows版本的,便于联合调试。如图选择Windows进行下载安装。
下载后双击选择安装:
一路next,注意在安装路径,你可以选择其他盘,或者你想要安装的路径,请记住这个路径,并点击安装等待安装完成。
安装完毕后,去到刚刚选择安装的路径下,并进入到这个文件中:
在文本框中直接输入cmd然后回车
会弹出一个命令行窗口,同样的方式,在打开一个(一共两个),我们进行一下测试,看你的mosquitto客户端是否可以正常订阅与发布,便于稍后的测试
测试如下:
以上测试代码如下:
订阅: mosquitto_sub -h test.mosquitto.org -t "mqtt" -v 【-h】指定要连接的MQTT服务器 【-t】订阅主题,此处为mqtt 【-v】打印更多的调试信息 发布: mosquitto_pub -h test.mosquitto.org -t "mqtt" -m "test——9160" 【-h】指定要连接的MQTT服务器 【-t】订阅主题,此处为mqtt 【-v】打印更多的调试信息
1.5、nrf9160消息订阅与发布
在前面2.1.3有说到过,我们建立工程时可以打开一个关于nrf9160作为modem的slm程序网页指导教程,现在我们打开它,找到MQTT AT commands,在这有我们需要的所有关于如何连接MQTT云,并进行连接、订阅,发布的相关AT控制指令。注意一点如果你想连接其余类型的云,那也可以在这找到其余相关的AT指令,如(http)。指令连接网站如下:MQTT client AT commands — nRF Connect SDK 1.9.99 documentation (nordicsemi.com)
在nrf connect中打开LTE Link Monitor,给硬件插入好物联网卡,并用LTE Link Monitor连接(也可以用其余工具,具体可以在网页指导中查看)上硬件后复位一下看到有Ready输出,说明硬件已经准备好了,我们可以进行配置,让我们的设备去订阅与发布了。
1.5.1、nrf9160设置
第一次使用时,需要运行如下命令进行模式配置,才可以在进行测试(在中国):(以下使用到的AT指令都可以在官方AT指令集中进行查询,或者使用通用的3GPP指令(部分通用)去查询)
第一步:先设置为离线模式
AT+CFUN=4
0:关闭电源并存储。通过停用LTE和GNSS服务来禁用射频电路。
1-正常的模式。主动模式是LTE或GNSS,或两者都有
2:活动系统模式下的仅接收模式。
4:飞行模式,通过停用LTE和GNSS服务来禁用射
第二步:设置为NB网络,默认为LTE但是国内为NB,所以要进行切换,如果你确定你的地区有LTE覆盖,那就不用进行切换。
AT%XSYSTEMMODE=0,1,0,0
第三步:设置使用PCO
AT%XEPCO=0 0:使用 PCO 1:使用 ePCO
第四步:开启modem
AT+CEREG=5
第五步:开始联网
AT+CFUN=1
等待CEREG返回为1时说明已经联网了,2为搜索网络
有时候你需要确定你的物联网卡是有可以连接运营商的网络,那么我可以使用下面的指令进行查询,看其返回值:
AT+CGATT? 返回: 1——说明连网成功 2——说明没有连网
如果出现返回为2,那么需要从新去搜索连接网络,如果一直无法连接,请和运营商确定一下你的SIM看是否可以连接网络,或者你所在的区域是否有NB网络覆盖到。
1.5.2、MQTT连接命令:
如果连网成功,那么我们就开始进行连接测试云,下面是官方AT指令中关于MQTT连接云的命令格式:其中涉及几个参数客户端ID、主机名、端口号都是很重要的参数。
所以连接命令就可以设置为(注意该命令在使用时要保证没有填写参数的字符端有至少一个空格,否则会出错):
由于我只有一个设备,所以客户机ID字段为零,当你有多个设备时,请顺序给你的设备命名,并且可以利用查询指令进行查询,知道这是第几个设备,连接的云地址是什么,连接端口号是什么等信息
命令如下,相关参数说明在指导中也有说明:
AT#XMQTTCON?
以下是我测试时得到的返回:
根据我们连接的test.mosquitto.org云相关说明,选择端口1883为不用加密,不用认证的开放连接,所以可以不用账户密码,还有证书等,如果你需要其余加密连接或者有CA证书的连接,还需要去生成证书,并导入相关云平台的证书:
发送指令后返回第一个参数为零,说明我们连接成功,如果连接成功了,不能再次去运行这个连接指令,否则报错,只有用断开指令后,才能再次运行连接指令。
断开指令如下:
AT#XMQTTCON=0,"0"," "," ","test.mosquitto.org",1883
或者
AT#XMQTTCON=0
1.5.3、MQTT订阅
AT命令格式如下:
AT#XMQTTSUB="nrf9160_test",0
订阅成功后,使用mosquitto客户端去发布一条消息:
可以看到我们的LTE中既收到了订阅的关于“nrf9160_test”的消息:
1.5.3、MQTT发布
我们先在mosquitto客户端也去订阅一下:
指令如下:
mosquitto_sub -h test.mosquitto.org -t "nrf9160" -v
然后在LTE中去发布一下:
相关命令参如下(也可在指导文档中直接查看):
命令:
AT#XMQTTPUB="nrf9160","nrf916 test message",0,0
还有一下其余指令,可以自行进行测试。
2、连接MQTT云(有证书连接方式)
前面测试并连接了无需证书端口的连接,那么我接下来测试一下去连接需要证书的端口,步骤如下:
2.1、获取test.mosquitto.org云颁发的CA证书,实际项目运用过程中也请去你云的所在平台申请这个CA证书。test.mosquitto.org平台证书获取如下图所示,点击红框所示连接即可获取一个.crt证书。
我获取的CA证书如下:
2.2、接下来就是客户端证书获取,点击生成客户端证书的连接会跳转到下面界面:
根据说明,我们需要openssl程序来生成我们的私钥和CSR,所以我们想要去配置会在搭建一个openssl的环境,如果你已经有了请忽略下列步骤,如果没有那么可以在下列开源平台去下载一个可以直接运行的openssl软件,如果你方便可以给相关提供该软件的作者进行一下打赏,毕竟制作不易,连接如下:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions (slproweb.com),选择下载后我们双击下载的.exe文件:
会弹出安装界面,请记住你的安装路径,稍后我们需要进入到这个目录,然后一路Next:
安装好之后找到软件的安装目录,并找到如图所示目录,并输入cmd调出命令行窗口,:
然后在打开的命令窗口中运行CSR和私钥生成命令:
私钥生成命令:
openssl genrsa -out client.key
然后执行CSR生成命令:
openssl req -out client.csr -key client.key -new
执行该命令时需要根据提示输入一些信息,意义如下
在刚刚的软件目录下即可看到两个文件,分别为私钥和CSR。
现在需要把CSR打开提供给Generate client certificates for test.mosquitto.org,会获得客户端证书。
2.3、给nrf9160提供私钥,CA证书和客户端证书
第一步:打开LTE Link Monitor工具链,并连接nrf9160然后利用AT指令让其处于离线不工作状态,我们开始上传证书:
离线命令:
AT+CFUN=4
然后分别打开前面生成的私钥,服务端给到我们的CA证书,客户端证书,把内容添加到如下界面响应的字段出,并设定自己的凭证(图中12345678)。
等待上传成功, 然后在配置按无证书时一样配置一道网络,几个命令同样列举如下:
AT%XSYSTEMMODE=0,1,0,0 AT%XEPCO=0 AT+CEREG=5 AT+CFUN=1
等待接入网络后。即可去连接需要证书的端口了,命令如下(一定要加入写入证书的凭证,下列命令中111为凭证,请使用你自己设置的凭证):
AT#XMQTTCON=1,"0"," "," ","test.mosquitto.org",8884,111
返回0,说明我们连接成功,接下来订阅一下后,利用客户端发送一下消息测试一下是否可以接收到订阅消息
订阅:
AT#XMQTTSUB="CA_CER_nrf9160_test",0
PC端mosquitto客户机发布命令:
mosquitto_pub -h test.mosquitto.org -t "CA_CER_nrf9160_test" -m "test--9160"
可在LTE中看到订阅消息,说明我们通讯成功。
发布:
PC端mosquitto客户机订阅命令:
mosquitto_sub -h test.mosquitto.org -t "CA-nrf9160_test" -v
LTE端发布命令:
AT#XMQTTPUB="CA-nrf9160_test","nrf916 test message",0,0
结果如下:
到此为止我们测试完毕,实际应用中也差不多的操作流程。