<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內部函數而已;
