1. 程式人生 > >MQTT 移植STM32+GPRS(串列埠透傳)(三)

MQTT 移植STM32+GPRS(串列埠透傳)(三)


昨天,去參觀了AWE(中國家電及消費電子博覽會),智慧家居,智慧插座、智慧LED燈、智慧攝像頭、智慧櫥櫃等等,大開眼界,原來這些別的公司的產品都正式投產了。還順便打聽了幾家提供雲服務的公司,他們一聽MQTT就說支援MQTT的協議,2家開發通訊模組的公司甚至直接可以提供支援MQTT的韌體。看來我要加快了。
##開發環境:
stm32f103 + esp6288(韌體中支援自動連線伺服器) 裸機開發

##步驟
首先在 https://github.com/eclipse/paho.mqtt.embedded-c 下載原始碼![ ](http://omp77n3im.bkt.clouddn.com/MQTT_scoure.png)

MQTTPacket 檔案全部新增到keil工程當中,參考samples提供的例子,刪除不需要的標頭檔案。
MQTTPacket/samples/transport.c和transport.h也要新增到工程中去,這是我們要改寫的介面。
因為MQTT使用JSON打包封裝的資料處理會很簡單,因此還要下載一個基於c 的檔案用於格式轉換。
https://github.com/DaveGamble/cJSON 拷貝cJSON.c和cJSON.h到工程中。
改寫串列埠中斷接收函式,其中socket連線伺服器是在串列埠轉wifi模組中設定好伺服器的ip和port,這樣移植到gprs模組時會很方便。在每次串列埠中斷中清定時器的計數值,同時接收長度變數加1,並約定在50ms內收不到資料,認為接收完成,完成標誌位置1。
*transport.c中修改裡面的四個介面:
![ ](http://omp77n3im.bkt.clouddn.com/MQTT_API.png)

open/close函式暫時用不到,裡面初始化相應的AT命令。
transport_sendPacketBuffer();傳送訊息改成串列埠傳送姐可以了
transport_getdata();要進行改寫裡面的recv()函式,因為要接收完成後才能處理,但因為官方原始碼構架比較嚴謹,而且相當有水準。因此等待接收完成,放在MQTTRead_package();外面去做。

###最後
當設定好這些,就可以訂閱和釋出了。完成相應的初始化和引數設定後主函式中while(1)執行等待讀訊息,timer3定時器中斷中傳送採集到的感測器數值,timer4定時器中斷中傳送ping報,不然伺服器會認為超時而斷開連線。
詳細的步驟下篇繼續,目前程式尚未完善暫不獻醜。
######說明:在sectong公司期間的週末休息時間所整理。