天天看點

MQTT C Client實作消息推送(入門指南)何為MQTT?生成dll庫?混合程式設計?MQTT C Client實戰

MQTT C Client實作消息推送(入門指南)

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協定,通過協定,目前已經擴充出了數十個MQTT伺服器端程式,可以通過PHP,JAVA,Python,C,C#等系統語言來向MQTT發送相關消息。随着移動網際網路的發展,MQTT由于開放源代碼,耗電量小等特點,将會在移動消息推送領域會有更多的貢獻,在物聯網領域,傳感器與伺服器的通信,資訊的收集,MQTT都可以作為考慮的方案之一。在未來MQTT會進入到我們生活的各各方面。The Paho MQTT C Client is a fully fledged MQTT client written in ANSI standard C. It avoids C++ in order to be as portable as possible. A C++ layer over this library is also available in Paho.

目錄:

何為MQTT

生成dll庫混合程式設計

MQTT C Client實戰

Synchronous publication example

Asynchronous publication example

Asynchronous subscription example

MQTT主要用于服務端對用戶端進行消息推送,根據這個具體要求,很容易知道它包括兩個部分:用戶端、服務端。

MQTT消息推送是基于主題<code>topic</code>模式的,可以分開來說:

用戶端釋出一條消息時,必須指定消息主題。(如,topic=”天氣”,payload=”北京今天霧霾好大啊~~嗚嗚”),其中topic就是主題,payload是發送的具體内容。

服務端推送消息,也是基于主題的。當伺服器發現有主題(如,topic=“天氣”)時,就會給所有訂閱該主題的用戶端推送payload内容。

這裡需要個前提,就是有用戶端訂閱topic=”天氣”這個主題;

一旦用戶端訂閱該主題,服務端就會每收到該主題的消息,都會推送給訂閱該主題的用戶端。如果用戶端不需要關注該主題了,也就是說不想接受到這樣的推送消息了,隻要取消otpic=”天氣”的主題訂閱即可。

MQTT協定是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠端傳感器和控制裝置通訊而設計的協定,它具有以下主要的幾項特性:

使用釋出/訂閱消息模式,提供一對多的消息釋出,解除應用程式耦合;

對負載内容屏蔽的消息傳輸;

使用 TCP/IP 提供網絡連接配接;

有三種消息釋出服務品質:

“至多一次”,消息釋出完全依賴底層 TCP/IP 網絡。會發生消息丢失或重複。這一級别可用于如下情況,環境傳感器資料,丢失一次讀記錄無所謂,因為不久後還會有第二次發送。

“至少一次”,確定消息到達,但消息重複可能會發生。

“隻有一次”,確定消息到達一次。這一級别可用于如下情況,在計費系統中,消息重複或丢失會導緻不正确的結果。(在實際程式設計中,隻需要設定QoS值即可實作以上幾種不同消息釋出服務品質模式)

小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協定交換最小化,以降低網絡流量;

使用 Last Will 和 Testament 特性通知有關各方用戶端異常中斷的機制;

在開始開發之前需要做一些準備工作,MQTT已經把所有的APIs封裝好了,我們可以使用它的dll庫,也可以直接導入源碼進行混合程式設計,一般要求不高的話(因為不太懂得話,最好不要修改源碼)可以直接将源碼生成dll,然後使用即可,下文就是使用該方式:

git clone https://github.com/eclipse/paho.mqtt.c.git

從這裡獲得C Client源碼之後,可以直接使用VS打開(我是VS2013):

MQTT C Client實作消息推送(入門指南)何為MQTT?生成dll庫?混合程式設計?MQTT C Client實戰

對于上圖的說明,下載下傳源碼後,打開将是以上界面,包括十來個工程,這裡講解幾個:

paho-mqtt3a : 一般實際開發中就是使用這個,a表示的是異步消息推送(asynchronous)。

paho-mqtt3as : as表示的是 異步+加密(asynchronous+OpenSSL)。

paho-mqtt3c : c 表示的應該是同步(Synchronize),一般性能較差,是發送+等待模式。

paho-mqtt3cs : 同上,增加了一個OpenSSL而已。

這裡根據自身的需要選擇不同的項目生成DLL即可,右擊單個項目-&gt;生成。由于你電腦中可能沒有OPenSSL環境,如果點選VS工具欄中的生成解決方案,十有八九會失敗,因為它會生成所有項目的解決方案,其實你根本用不着這麼多。

另外,上圖中無法打開包括檔案<code>VersionInfo.h</code>,你隻需要在src檔案夾中找到VersionInfo.h.in檔案,去掉.in字尾-&gt;重新生成即可。

了解更多可以閱讀《MQTT C Client for Posix and Windows》一文,下面根據官網資料,摘錄了幾個C語言實作MQTT的小DEMO。

MQTT使用起來也十分容易,基本上就那四五個函數:MQTTClient_create(建立用戶端)、MQTTClient_connect(連接配接服務端)、MQTTClient_publishMessage(用戶端-&gt;服務端發送消息)、MQTTClient_subscribe(用戶端訂閱某個主題)等等。其中,很多異步回調函數,需要自己去實作,如,

MQTTAsync_setCallbacks中,

connlost函數指針,是當MQTT意外斷開連結時會回調的函數,由自己實作;

msgarrvd函數指針,是當伺服器有消息推送回來時,用戶端在此處接受服務端消息内容。

另外,就是一些函數執行是否成功的回調函數,C語言封裝回調之後,就是這麼寫法,看起來有些變扭。有興趣的可以看《淺談C/C++回調函數(Callback)&amp; 函數指針》文章,再了解以下回調函數。

最後,不得不說的就是,MQTT有些發送或者是訂閱的内容時(某些函數中),在程式設計最好将參數中傳進來的值在記憶體中拷貝一份再操作,筆者當時開發時,就是因為這樣的問題,折騰了較長時間,後來在wireshark中發現資料包中根本沒有内容,才知道是由于函數參數是指針形式,直接在異步中使用可能會發生一些未知的錯誤。

繼續閱讀