一、本教程中說明的內容
先說說本文化的適用范圍吧:
一、使用的芯片是STM32F103C8T6,但是并沒有任何與平臺相關的代碼,應該在所有STM32芯片中都是可以用的。
二、本文使用的是SIM800C模塊,驅動是用C++實現的,基于ARM mbed平臺寫的。但是從原理上來講,C和C++差別不大,本文的代碼經過修改也可以直接用于其他平臺的使用。
三、本文數據傳輸使用的是“透傳模式”,對于所有的透傳模塊,本文都有很大的參考意義。
二、MQTT的使用
首先,推薦一個MQTT的庫:Paho,這個庫支持非常多的平臺,當然也包括了嵌入式平臺:GitHub – paho.mqtt.embedded-c。將該庫中的MQTTPacket文件夾下載下來,MQTTPacket文件夾下面主要有三個文件夾,我們使用的文件主要集中在src文件夾和samples文件夾中。
src文件夾中存放著MQTT核心功能的代碼,而samples中存放著三個例子:pub00sub1、pub0sub1_nc、qos0pub和網絡驅動(transport.c和transport.h)。
由于三個驅動都有一個main函數,所以無法同時存在,本文中只使用了pub0sub,所以將此文件夾內容精減到只有pub0sub1.c、transport.c、transport.h三個文件。
當然,在實現使用時可能會改變目錄結構,使目錄結構更加清楚,可以根據自己的喜好來進行更改,并不影響使用。
將transport.h的內容精減到以下內容:
主要的工作有:
1、為了方便表示,刪除了版權信息,有實際使用時請保留。
2、沒有使用pub0sub1_nc這個例子,所以將transport_getdatanb方法去除。
3、透傳模塊中使用不到socket,所以將與socket相關的參數去掉。
這些方法實現的主要功能是:
1、transport_open的作用是初始化模塊連網的信息、transport_close作用是關閉鏈接。
2、transport_sendPacketBuffer用于發送數據、transport_getdata用于接收數據。
然后用transport.c來實現transport.h中聲明的4個函數。
三、在ARM mbed中使用MQTT
首先說句題外話,自我感覺mbed是一個非常不錯的平臺,很大程度上提高了代碼的可重用性。但也有一個問題,就是其支持是以開發板為單位的,所以并不是對每一種芯片的支持都很好。
首先介紹一個例子,HelloMQTT – a mercurial repository | mbed。但這個例子其中有很多不完善的地方,而且該例子使用的網絡驅動也不是GPRS模塊。
如果要用不同的連網方式,那么就寫一個驅動,驅動中至少要包含以下兩個方法:
這兩個方法會在MQTTClient中自動調用,timeout表示毫秒。返回值為讀或寫的字節數。
對此,我寫了驅動程序:MQTTGRPSEthernet.h
MQTTGRPSEthernet.cpp
主程序
lient的yield函數中用調用messageArrived函數,之前的示例給出的是100,可能是由于間太短的緣故,總是調用不了回調函數,所以我將其改的非常大,便于調試。實際使用時可以使用1000。
四、總結
其實paho embeded-c用起來還是挺方便的,但是代碼的重要性不高,所以移植起來往往會讓人無從下手。但深放研究就會發現其實使用起來是非常簡單的。
-
STM32
+關注
關注
2270文章
10904瀏覽量
356338 -
GPRS
+關注
關注
21文章
984瀏覽量
129473 -
MQTT
+關注
關注
5文章
651瀏覽量
22533 -
sim800c
+關注
關注
1文章
7瀏覽量
6878
發布評論請先 登錄
相關推薦
評論