002-STM32+W5500基本控制篇(阿里雲物聯網平台)-STM32+W5500使用MQTT+SSL(mbedtls)加密方式接入阿里雲物聯網平台


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

說明

在網絡通信中,如果不加上SSL,那么信息就以明文的方式暴露在網絡通信中

這節移植mbedtls庫,讓W5500以SSL方式連接MQTT服務器.

 

首先簡單說明一下SSL, 實際上呢整個的就是TCP和服務器通信,

只不過TCP連接上服務器之后先和服務器協商好加密方式和加密密碼,

然后數據進行加密傳遞;

 

測試

1.打開本節代碼

 

2.修改為自己的阿里雲設備信息

 

 

3.下載到單片機(接上網線)

 

 

4.觀察日志打印口,確定連接了服務器

 

 

 

程序說明

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

 

 

 

現在看具體使用的

1.連接TCP以后輪訓等待SSL成功

 

 

2.成功以后發送連接MQTT協議

注意哈, 阿里雲規定,如果使用SSL連接的, 需要把mqtt的client_id的參數 securemode=2

 

 

 

 

 

 

3.從SSL里面獲取數據

 

 

4.當然那個MQTT底層發送數據的地方也改為使用SSL發送

 

 

結語

其實實際上還是TCP通信,只不過明文數據經過了加密;

TCP連接上以后,和服務器協商加密方式和密碼都是使用mbedtls內部實現的,

協商好以后咱就就正常發送和接收數據就可以, 只不過中間通過mbedtls內部函數而已;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM