<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)