測試環(huán)境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、網(wǎng)絡硬件使用ec800m移植at_socket使用sal框架。
1、添加網(wǎng)絡硬件
RyanMqtt依賴SAL框架 / LWIP。
此步驟不做過多解釋,是lwip就用lwip,是at設備就用at_socket。推薦所有平臺都使用SAL框架(RyanMqtt軟件包會自動使能)。
2、添加RyanMqtt
這里使用的Studio開發(fā)環(huán)境,點擊 RT-Thread Settings,選擇添加軟件包,搜索RyanMqtt添加。
開啟RyanMqtt msh示例,版本建議選擇latest (latest包含了最新的錯誤修復和特性,推送前都經(jīng)過測試的。但是rt-thread使用gitee鏡像,同步需要1-3天,如果要使用最新latest版本請修改為github源)
添加后如下圖所示,直接編譯然后燒錄

3、使用msh測試例子
網(wǎng)絡硬件必須要能連接到網(wǎng)絡,否則mqtt沒有任何意義
編譯燒錄后在串口終端輸入 “help” / table鍵,打印shell命令信息,查看是否有mqtt命令,如下圖所示。
注:沒有mqtt命令的請查看RyanMqtt軟件包是否開啟了msh示例

接著我們輸入 “mqtt” / “mqtt help” 命令,打印信息如下圖所示

可以看到msh示例程序給出的部分mqtt功能命令,左側(cè)為mqtt示例命令,中間為命令介紹,右側(cè)為需要傳遞的參數(shù)。
接下來我們依次試試每個命令的功能。
mqtt state (打印mqtt客戶端狀態(tài))
打印當前mqtt的狀態(tài)。狀態(tài)定義為
typedef enum
{
RyanMqttInvalidState = -1, // 無效狀態(tài)
RyanMqttInitState = 0, // 初始化狀態(tài)
RyanMqttStartState, // 開始狀態(tài)
RyanMqttConnectState, // 連接狀態(tài)
RyanMqttDisconnectState, // 斷開連接狀態(tài)
RyanMqttReconnectState, // 重新連接狀態(tài)
} RyanMqttState_e;
讓我們嘗試一下
無效狀態(tài),因為我們還沒有調(diào)用連接函數(shù),mqtt客戶端還沒有被初始化,所以為無效狀態(tài)

mqtt connect (mqtt連接服務器)
連接mqtt服務器,可以看到參數(shù)為null。連接服務器的配置信息在RyanMqttTest.c文件的頭部,如下所示
修改下面配置信息來連接你的mqtt服務器,”broker.emqx.io” 為emqx的開放mqtt服務器。
注意:mqtt客戶端id必須唯一,請務必進行修改!

讓我們嘗試一下connect

可以看到打印了一條 “mqtt連接成功回調(diào)” 。為什么會打印呢? 這我們就要看看mqtt connect命令做了什么?
首先我們要找到cmdTab,這里存放了示例的所有命令。

我們點擊connect示例對應的函數(shù) “MqttConnect”秘密就發(fā)生在mqttConfig的回調(diào)函數(shù)和注冊事件中。我們在注冊事件回調(diào)中選擇了所有事件,其中就包括了mqtt連接成功事件。如下圖所示
當mqtt連接成功時就會調(diào)用mqttConfig中的mqttEventHandle函數(shù)指針。在mqttEventHandle內(nèi)部我們打印了一條 “mqtt連接成功回調(diào)”

回調(diào)函數(shù)內(nèi)部

可注冊的回調(diào)事件定義為

mqtt disc (mqtt斷開連接服務器)
主動斷開mqtt服務器的連接,使用效果如下,回調(diào)函數(shù)中打印了 “mqtt斷開連接回調(diào)”
圖中 “204” 為斷開連接事件的eventData,可查看可注冊的回調(diào)事件定義對于eventData的定義。
注:為什么斷開連接后會自動重連呢? 我們在調(diào)用connect示例的時候使能了 “自動重連” 并定義了重連時間。

mqtt reconnect (mqtt斷開連接時重新連接服務器)
當我們沒有使能 “自動重連” 時,我們可以手動調(diào)用 RyanMqttReconnect 函數(shù)來進行重連
注:如果mqtt客戶端不為 RyanMqttDisconnectState 狀態(tài),此接口不會進行任何操作
mqtt destory (mqtt銷毀客戶端)
銷毀mqtt客戶端,釋放mqtt客戶端申請的所有資源。
銷毀mqtt客戶端因為安全問題,設置為異步操作,當接收到 RyanMqttEventDestoryBefore 事件后才真正開始銷毀。真正開始銷毀速度非常快!就只是釋放資源。
至于最多要多長時間才可以銷毀?如果網(wǎng)絡層移植的沒有問題,最長時間為初始化config里的recvTimeout
注:客戶端需要初始化后的才可以被銷毀,否則會忽視

mqtt pub (mqtt發(fā)布消息)
根據(jù)命令提示,需要傳入 主題、消息等級、發(fā)送內(nèi)容、發(fā)送條數(shù)、間隔時間(可以為0)
這里我們使用 mqttx工具來做上位機
使用命令:mqtt pub testup 2 hello 10 0

-
單片機
+關注
關注
6076文章
45494瀏覽量
670260 -
STM32
+關注
關注
2309文章
11162瀏覽量
373406 -
硬件設計
+關注
關注
18文章
459瀏覽量
45614 -
代碼
+關注
關注
30文章
4967瀏覽量
73954 -
上位機
+關注
關注
27文章
1002瀏覽量
57045 -
回調(diào)函數(shù)
+關注
關注
0文章
95瀏覽量
12195 -
LwIP協(xié)議棧
+關注
關注
0文章
19瀏覽量
7907 -
RT-Thread
+關注
關注
32文章
1613瀏覽量
44821 -
STM32F401
+關注
關注
1文章
16瀏覽量
10965
發(fā)布評論請先 登錄
RyanMqtt實現(xiàn)MQTT3.1.1協(xié)議的客戶端
RyanMqtt在間隔1s發(fā)送消息時常就報錯RyanSocketFailedError
python代碼示例之基于Python的日歷api調(diào)用代碼實例
ESP-NOW技術的介紹和使用方式及示例代碼資料免費下載
自己編寫函數(shù)示例代碼很難嗎?分享幾個示例!
RyanMqtt使用介紹和示例代碼(1)
評論