zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    Linux系统下DedeCMS安全设置详细教程
    乐淘网CEO毕胜:中国不具备购买玩具的文化
    生意
    Sql Server Cpu 100% 的常见原因及优化
    认准了就去做
    雷军谈互联网七字诀:天下武功唯快不破
    电商需要与实体结合才可行
    Xml Schema命名空间
    高效的MySQL分页
    正则
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14451086.html
Copyright © 2011-2022 走看看