002-STM32+BC26|260Y(NB-IOT)基本控制篇(阿里云物联网平台)-STM32+BC260Y使用MQTT+SSL(mbedtls)加密方式接入阿里云物联网平台(不验证服务器证书)


说明

阿里云的TCP和TCP+SSL方式连接MQTT服务器使用的端口号都是 1883;

如果使用SSL连接, 拼接的ClientID参数时  securemode=2

服务器下发的TCP数据 --->  经过mbedtls库解密 ---> 获得真实数据

 

测试

1.打开本节代码

2.修改自己的阿里云设备信息

3.编译下载程序, 观察日志打印口(日志都是加密的数据,就大体说一下)

程序说明

1,为便于使用mbedtls的SSL功能,我封装了下

2.先说几个自己需要实现的函数,mbedtls底层会调用这些函数

随机数函数和返回时间戳函数(不验证证书时间的话用不到)

网络接收处理函数(mbedtls底层会自动调用这个函数)

SSL的底层获取数据的方式是指明需要多少个数据,然后咱再返回多少个数据.

所以我把数据接收以后存储到了环形队列, 然后SSL要多少我就给多少.

网络发送函数(mbedtls底层会自动调用这个函数)

3.使用SSL发送数据函数和从SSL里面取数据函数

其实这两个函数咱可以直接用,不过我为了方便调用就套了一层函数;

完成了ssl协商以后, 咱发送的数据需要调用mbedtls提供的函数, 

内部会把咱的数据加密以后再通过TCP发送出去; 

同理TCP接收的数据咱也需要使用mbedtls提供的函数里面获取数据;

4. SSL初始化

最后两个底下画红线的函数就是咱上面写的tcp发送数据函数和tcp接收数据函数

5.等待SSL握手完成函数

这个函数在咱TCP连接成功以后需要轮训调用, 这个函数内部自动实现的SSL, 只要完成了SSL, 便会返回0

现在看具体使用的

提示: MQTT部分就不多说了, 只说明一下SSL部分,

和前面的不带SSL的程序相比,发送和接收数据中间是使用的mbedtls内部的函数.

1,控制模块连接TCP服务器

2.连接TCP以后,初始化下SSL, 然后等待SSL协商成功

2.成功以后发送连接MQTT协议

3.从SSL里面获取数据

4.当然那个MQTT底层发送数据的地方也改为使用SSL发送

结语

其实实际上还是TCP通信,只不过中间经过了mbedtls函数;

明文数据只是经过了加密;

相关