STM32+ESP8266+AIR202/302基本控制篇-47-功能测试-STM32+Air302(NB-IOT)+Mdebtls使用SSL单向认证方式连接MQTT服务器(不校验服务器证书)

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

说明

这节说明一下STM32+Air302+Mdebtls以SSL单向认证(不校验服务器证书)方式连接MQTT服务器.

Air302内部没有做上SSL,所以只能先使用单片机控制模组连接上TCP服务器,

然后再利用Mdebtls包实现SSL.

注意:受内存影响开发板不能测试此节的程序

用户需要选择STM32F103RET6及其以上型号的单片机测试!

提示(单向SSL认证,忽略服务器证书通信过程)

1.TCP客户端连接上TCP服务器

2.TCP客户端发送消息(明文消息)给服务器,告诉他自己都支持哪种加密方式(加密套件)

3.TCP服务器返回消息(明文消息)告诉客户端咱使用的加密套件,当然还有服务器的证书数据

4.TCP客户端不用程序解析服务器证书,二者直接通过TCP通信协商对称加密的密码

5.使用协商好的密码进行对称加密通信

反正记住一句话:证书只是验证是不是真实的服务器,最终二者把数据经过对称加密然后再通过TCP传输.

测试功能(我以外置一块STM32F103RET6的板子为例)

1.短接BOOT0和3.3V,复位下单片机,目的是不要让此开发板工作.调整波动开关如下

2.连线如下

图示白线 :  外置板(PA2)  --  开发板NB-IOT(RX) 

图示白线 :  外置板(PA3)  --  开发板NB-IOT(TX) 

图示紫线 :  外置板(PB2)  --  开发板(PB2)  复位模块

图示黑线 :  外置板(GND)  --  开发板(GND)  共地

 

3.提醒
串口1在程序里面作为了日志打印输出口,用户可以监控下自己板子的串口1,查看打印的日志

4.下载此节的单片机程序到自己的板子

5.部分日志说明

程序说明

1.程序中使用Mdebtls这个包完成的SSL

2.关于详细的移植和简单使用参见开源教程资料

https://www.cnblogs.com/yangfengwu/category/1566194.html

3.为方便使用,SSL配置程序单独建立一个文件

4.初始化配置SSL

5.配置发送数据接口

注:咱使用SSL发送的时候使用的是  mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len )

经过SSL底层程序的封装以后,就会调用咱的发送数据函数.把数据发送出去.

6.配置接收数据接口

在执行SSL通信过程中,SSL的底层会调用这个函数获取网络数据.

模块是使用串口把数据发给单片机,为了适应底层的调用方式,我把模组发来的网络数据存储到了环形队列

7.串口接收分为两个部分

普通的接收

凡是网络返回的数据存储到环形队列(这也是为了配合SSL底层程序)

8.接下来看下执行步骤, 首先配置模组连接TCP服务器

9.在配置模组还没SSL握手成功之前都是在普通接收的数组里面获取的数据

10.初始化和轮训调用SSL握手函数

注意:其实是调用的mbedtls_ssl_handshake

在轮训调用mbedtls_ssl_handshake的时候,SSL底层会自动的执行握手协议的发送,接收和解析

发送和接收解析就是使用的这两个函数

11.SSL握手成功以后发送连接MQTT消息

注:握手成功以后加密已经协商好了,咱只需要把数据传递给mbedtls_ssl_write函数

然后底层把数据加密之后通过咱配置的发送数据函数发送出去

12.现在是SSL网络通信了,网络数据需要通过SSL解析之后的接口去获取

12.连接MQTT成功以后调用连接回调

13.发送缓存的MQTT消息自然也需要使用SSL函数发送

细节说明1

需要把heap加大,因为SSL内部使用 malloc 申请内存

细节说明2

1.发送完MQTT数据以后去掉延时等待发送下一条数据

 

以前都是使用的中断发送的数据,有可能中断发送还没执行完又进来了这个函数.导致数据被覆盖,导致发送错误.

所以在以前的程序中这个变量放在了串口发送数据完成里面.

这次没有使用串口中断发送,而是使用的普通的发送函数

究其原因呀,是因为为了节省内存好多数组是共用的,比如上面的 MainBuffer MainBufferCopy

如果这个地方设置了中断发送,那么在发送完成之前其他地方就不能使用这些数组....

但是我为了省内存,其他地方也使用了这个数组,所以就改为了普通方式发送!

细节说明3

串口2接收数据缓存我定义到了3582,是因为这个NB-IOT模组每两个字符作为一个16进制

那么即使是返回1024个数据,那么其实是返回 2048个!!!!!

当然只是执行SSL握手的时候返回的数据非常多...因为里面有服务器证书文件

1340*2 + 237*2 = 3154  这种16进制字符串表示的数据确实给单片机带来了很大的负担....

提示

为节省内存,程序里面只加入了一个控制继电器的数据处理.

用户可以用手机扫码绑定以后控制继电器.(需要连接PB1)

原文地址:https://www.cnblogs.com/yangfengwu/p/14451086.html