文章插图
Url:a1tETt7fUG1.iot-as-mqtt.cn-shanghai.aliyuncs.com
port:1883
文章插图
可见服务器回复20 02 00 00,接受我们连接了(其中20,表示报文类型,20是回复包,02是剩余长度——后面还有两个字节,00相当于站位字节,最后以一个00,表示已经接受)
MQTT协议定义的响应命令如下:
文章插图
阿里云上也显示我们的设备在线:
文章插图
如果连接包存在错误会是怎么样的结果,我们来看一下:
文章插图
04提示我们无效的密码或者用户名 , 因为我们把原来的39改为了00,密码错误 。
以上就是对CONNECT报文的讲解,那么我在上一篇博客使用了一个阿里云的计算器,其实就是完成上面我们复制的计算,只要复制我们的设备信息,就可以一键生成我们的密码名称等 。工具连接如下:阿里云参数小工具 (lovemcu.cn),这里值得注意的是每一个云的情况不一样 , 要去根据云的文档确定,但是报文格式是一样的 。
上面是为了使用PC端工具进行连接,以便于我们更好的理解CONNNECT报文包,那下我们来使用nrf9160连接阿里云 , 本节获取的云连接信息如下:
3.3.1、连接信息(有三元组计算得到)综上所述连接信息如下:
clientid:T123|securemode=3,signmethod=hmacmd5|username:T123&a1tETt7fUG1password: 86a087f11cad5c325127ae5f79305109三、mqtt_simple程序修改(NCSV1.8)使用vs code创建一个mqtt_simple工程,不会的请参看我起那么的不可或者顶部的官方中文博客连接,这就不细讲了,然后我们对程序进行修改 。
1、prj.conf文件修改1)、打开工程中的prj.conf配置文件 , 修改联网方式,中国只有NB网络,从LTE修改为NBCONFIG_LTE_NETWORK_MODE_NBIOT_GPS=y
文章插图
2)、加入PDN定义,为了把PDN的函数编译进来CONFIG_PDN=yCONFIG_PDN_LEGACY_PCO=yCONFIG_PDN_SYS_INIT=y编译后,对于1.8的NCS需要确定pdn.c文件中的AT%%XEPCO=0处为2个%分号,如果不是,请修改为
文章插图
修改后如下:
文章插图
然后再编译
3)、加入连接参数和推送订阅的主题CONFIG_MQTT_PUB_TOPIC="/a1tETt7fUG1/T123/user/get"CONFIG_MQTT_SUB_TOPIC="/a1tETt7fUG1/T123/user/update"CONFIG_MQTT_CLIENT_ID="T123|securemode=3,signmethod=hmacmd5|"CONFIG_MQTT_BROKER_HOSTNAME="a1tETt7fUG1.iot-as-mqtt.cn-shanghai.aliyuncs.com"CONFIG_MQTT_BROKER_PORT=1883#对于端口1883和前面的等号不要有空格,这一点要注意
发布和订阅的主题需要在阿里云中,即我们前面建立的设备端下topic中去找一个有订阅和发布权限的类型即可(不知道在哪的可以去看上一篇文章) 。
文章插图
如图中间的${deviceName}换为我们的设备名T123 。
4)、用户名和密码缓冲区配置加入如果不加入这 , 当你用户名和密码过长时会包-12的错误 , 我们给他大一点的空间
CONFIG_MQTT_MESSAGE_BUFFER_SIZE=512CONFIG_MQTT_PAYLOAD_BUFFER_SIZE=5122、程序修改打开main.c找到client_init()函数
添加如下代码:
#define CONFIG_MQTT_BROKER_USERNAME_test"T123&a1tETt7fUG1"#define CONFIG_MQTT_BROKER_PASSWORD_test"86a087f11cad5c325127ae5f79305109"#这加成宏定义#以下放置在client_init中struct mqtt_utf8 password_test={.utf8=CONFIG_MQTT_BROKER_PASSWORD_test,.size=strlen(CONFIG_MQTT_BROKER_PASSWORD_test)};struct mqtt_utf8 user_name_test={.utf8=CONFIG_MQTT_BROKER_USERNAME_test,.size= strlen(CONFIG_MQTT_BROKER_USERNAME_test)};#以下直接修改client->password =&password_test;client->user_name =&user_name_test;修改后:
文章插图
3、mqtt_simple链接阿里云然后我们就编译下载:
文章插图
连接成功过,然后再阿里云端可以看到设备在线: