1. 程式人生 > 其它 >002-STM32+BC26|260Y(NB-IOT)基本控制篇(阿里雲物聯網平臺)-STM32+BC260Y使用MQTT+SSL(mbedtls)加密方式接入阿里雲物聯網平臺(不驗證伺服器證書)

002-STM32+BC26|260Y(NB-IOT)基本控制篇(阿里雲物聯網平臺)-STM32+BC260Y使用MQTT+SSL(mbedtls)加密方式接入阿里雲物聯網平臺(不驗證伺服器證書)

<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函式;

明文資料只是經過了加密;