1. MQTT(MessageQueuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時通訊協議,有可能成爲物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯網)的通信協議。
2. MQTT協議是爲大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:
1、使用發佈/訂閱消息模式,提供一對多的消息發佈,解除應用程序耦合;
2、對負載內容屏蔽的消息傳輸;
3、使用 TCP/IP 提供網絡連接;
4、有三種消息發佈服務質量:
o “至多一次”,消息發佈完全依賴底層TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送。
o “至少一次”,確保消息到達,但消息重複可能會發生。
o “只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重複或丟失會導致不正確的結果。
5、小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量;
6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制;
3. Mqtt核心代碼
1) 服務器連接和消息訂閱
String url = String.format(Locale.US, MQTT_URL_FORMAT, MQTT_BROKER,
MQTT_PORT);
Log.i(DEBUG_TAG, "Connecting with URL: " + url);
try {
if (mDataStore != null) {
Log.i(DEBUG_TAG, "Connecting with DataStore");
mClient = new MqttClient(url, mDeviceId, mDataStore);
} else {
Log.i(DEBUG_TAG, "Connecting with MemStore");
mClient = new MqttClient(url, mDeviceId, mMemStore);
}
} catch (MqttException e) {
e.printStackTrace();
}
mConnHandler.post(new Runnable() {
@Override
public void run() {
try {
mClient.connect(mOpts);
mClient.subscribe("/anyclink/5", 0);
mClient.setCallback(MqttService.this);
mStarted = true; // Service is now connected
Log.i(DEBUG_TAG,
"Successfully connected and subscribed starting keep alives");
startKeepAlives();
} catch (MqttException e) {
e.printStackTrace();
}
}
});
2) Mqtt消息訂閱的取消
if (mClient != null) {
try {
mClient.disconnect();
mClient.unsubscribe("/anyclink/5");
} catch (MqttException ex) {
ex.printStackTrace();
}
stopKeepAlives();
mClient = null;
}
4. 服務器搭建
1) 安裝文件的下載地址:點擊打開鏈接
2) 服務器搭建方法:點擊打開鏈接
3) 源碼下載地址:點擊打開鏈接