002-STM32+BC26|260Y(NB-IOT)基本控制篇(阿里雲物聯網平臺)-STM32+BC260Y使用MQTT+SSL(mbedtls)加密方式接入阿里雲物聯網平臺(不驗證伺服器證書)
阿新 • • 發佈:2022-03-20
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLBC26AA/aly.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
阿里雲的TCP和TCP+SSL方式連線MQTT伺服器使用的埠號都是 1883;
如果使用SSL連線, 拼接的ClientID引數時 securemode=2
在網路通訊中,如果不加上SSL,那麼資訊就以明文的方式暴露在網路通訊中
這節移植上mbedtls庫,讓裝置以SSL方式連線MQTT伺服器.
首先簡單說明一下SSL, 實際上呢整個的就是TCP和伺服器通訊,
只不過TCP連線上伺服器之後先和伺服器協商好加密方式和加密密碼,
當然協商什麼的mbedtls庫自己就完成了, 然後咱呼叫其介面傳送和接收資料就可以了;
其實通訊是下面的樣子:
傳送的資料 ----> 經過mbedtls庫加密 ---> 通過模組使用TCP傳送給伺服器
伺服器下發的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函式;
明文資料只是經過了加密;