-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
androidmqtt庫
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于androidmqtt庫的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
ChatGPT國內(nèi)免費(fèi)在線使用,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、android消息推送怎么實現(xiàn)?
極光推送可以輕松實現(xiàn)android消息推送。具有操作步驟如下:
1、到極光官網(wǎng)注冊賬號:https://www.jpush.cn/
2、創(chuàng)建應(yīng)用,按照要求填寫你的應(yīng)用名稱,包名提交
3、下載案例,一般情況測試是能收到信息的
4、集成到自己的項目中,按照官網(wǎng)的集成http://docs.jpush.cn/pages/viewpage.action?pageId=557214
5、集成時將注意的要點(diǎn),官網(wǎng)上也有說,但是我再強(qiáng)調(diào)一下要注意兩個權(quán)限的包名填寫,有可能直接用案例上的拷貝到自己的manifest中時沒有替換掉包名,切記,要替換成自己的項目的包名。
極光推送已經(jīng)覆蓋了近10億Android、IOS終端,30多萬款A(yù)PP應(yīng)用,服務(wù)總用戶數(shù)超過30億,每天消息推送量達(dá)5億多條,已成為移動應(yīng)用數(shù)據(jù)平臺。極光分享幫助應(yīng)用具備國內(nèi)主流社交平臺分享功能,提供新浪微博、QQ、微信等第三方社會化分享服務(wù),提高產(chǎn)品推廣效率,幫助產(chǎn)品提高用戶體驗,獲得更多用戶。
二、# Paho MQTT Android 源碼分析 — MqttAndroidClient
客戶端有兩種接口:
主要區(qū)別:1 為同步接口,2 為異步接口。
異步接口,提供非阻塞式的方法,后臺處理任務(wù),以連接為例,連接到MQTT server是一個耗時操作,非阻塞方式在后臺進(jìn)行連接的時候,可以通知調(diào)用方,連接busy的狀態(tài)。
非阻塞方式在時間驅(qū)動型程序和圖形界面程序中較為多用,不會影響UI線程的繪制。
舉例:連接,同步方式
連接,異步方式
異步回調(diào)中如果需要使用context上下文,可以通過異步方法傳入,最終可在回調(diào)中,返回給調(diào)用方。
同步阻塞方法
與異步client相似, ~~ 表示同上
Android client的主要實現(xiàn)類,extends BroadcastReceiver ,實現(xiàn) IMqttAsyncClient
通過 Android的service服務(wù)于 MQTT服務(wù)進(jìn)行通信。提供了包含 一下方法的簡單易用的MQTT 客戶端:
主要進(jìn)行的操作:
創(chuàng)建連接
消息重發(fā)機(jī)制:在發(fā)送消息的時候,如果期間連接中斷或client停止,消息會在滿足所有以下條件且再次創(chuàng)建連接后,被已設(shè)定好的QoS被發(fā)送。
關(guān)于Topic
方式1:
方式2:
省略了方式1的 MqttMessage 的構(gòu)造。
注意:
機(jī)制:
訂閱單一Topic
訂閱多個Topic
優(yōu)勢:優(yōu)化比逐一訂閱
取消訂閱與訂閱是相反的,取消訂閱需要在服務(wù)端收到取消后,查詢是否有match的訂閱,然后移除。
取消訂閱
取消多個訂閱
注意:
斷線時候消息發(fā)送的機(jī)制:
方式1:
方式2:帶超時機(jī)制
方式3:帶回調(diào)
在客戶端stop的時候,可能還有未發(fā)送的message,這種情況下,可以通過 getPendingDeliveryTokens 方法在客戶端重啟后獲取為發(fā)送消息(in-flight message)的token,從而追蹤這些消息的狀態(tài)。
替代方法:MqttCallback中的deliveryComplete 也可以獲取到消息送達(dá)的狀態(tài)。
注意:
設(shè)置 MqttTraceHandler ,和使能在service中trace的功能
MqttTraceCallback 是最簡單的 MqttTraceHandler 的實現(xiàn),直接輸出到Android的Logcat
使用 BroadcastReceiver 的方式接收從 MqttService 的返回消息:
具體以sub的消息接收為參考(messageArrivedAction):
從SparseArray的tokenMap中移除token:
注意:
三、如何采用MQTT協(xié)議實現(xiàn)android消息推送
MQTT是一項消息傳遞技術(shù),由IBM再2001年發(fā)布。
總結(jié)一下,機(jī)制就是使用一個代理服務(wù)器messagebroker,
客戶端client連接上這個服務(wù)器,然后告訴服務(wù)器說,我可以接收哪些類型的消息,
同時,client也可以發(fā)布自己的消息,這些消息根據(jù)協(xié)議的內(nèi)容,可以被其他client獲取。
只要手機(jī)客戶端,連上服務(wù)器,然后就可以接收和發(fā)布消息了,不用自己寫socket什么了,
低帶寬,低耗電量,代碼量也少,很簡單吧。
package com.pig.test.mqtt;
import com.ibm.mqtt.MqttClient;
import
com.ibm.mqtt.MqttException;
import com.ibm.mqtt.MqttSimpleCallback;
public class SubscribeClient {
private final static String
CONNECTION_STRING = "tcp://192.168.1.60:1883";
private final static boolean
CLEAN_START = true;
private final static short KEEP_ALIVE =
30;//低耗網(wǎng)絡(luò),但是又需要及時獲取數(shù)據(jù),心跳30s
private final static String CLIENT_ID =
"client1";
private final static String[] TOPICS =
{
"Test/TestTopics/Topic1",
"Test/TestTopics/Topic2",
"Test/TestTopics/Topic3",
"tokudu/client1"
};
private
final static int[] QOS_VALUES = {0, 0, 2,
0};
//////////////////
private MqttClient mqttClient =
null;
public SubscribeClient(String i){
try {
mqttClient =
new MqttClient(CONNECTION_STRING);
SimpleCallbackHandler
simpleCallbackHandler = new
SimpleCallbackHandler();
mqttClient.registerSimpleHandler(simpleCallbackHandler);//注冊接收消息方法
mqttClient.connect(CLIENT_ID+i,
CLEAN_START, KEEP_ALIVE);
mqttClient.subscribe(TOPICS,
QOS_VALUES);//訂閱接主題
/**
*
完成訂閱后,可以增加心跳,保持網(wǎng)絡(luò)通暢,也可以發(fā)布自己的消息
*/
mqttClient.publish(PUBLISH_TOPICS, "keepalive".getBytes(), QOS_VALUES[0],
true);
} catch (MqttException e) {
// TODO Auto-generated
catch block
e.printStackTrace();
}
}
/**
* 簡單回調(diào)函數(shù),處理client接收到的主題消息
* @author pig
*
*/
class SimpleCallbackHandler implements MqttSimpleCallback{
/**
* 當(dāng)客戶機(jī)和broker意外斷開時觸發(fā)
* 可以再此處理重新訂閱
*/
@Override
public void connectionLost() throws Exception {
//
TODO Auto-generated method
stub
System.out.println("客戶機(jī)和broker已經(jīng)斷開");
}
/**
* 客戶端訂閱消息后,該方法負(fù)責(zé)回調(diào)接收處理消息
*/
@Override
public void
publishArrived(String topicName, byte[] payload, int Qos, boolean retained)
throws Exception {
// TODO Auto-generated method
stub
System.out.println("訂閱主題: " +
topicName);
System.out.println("消息數(shù)據(jù): " + new
String(payload));
System.out.println("消息級別(0,1,2): " +
Qos);
System.out.println("是否是實時發(fā)送的消息(false=實時,true=服務(wù)器上保留的最后消息): " +
retained);
}
}
/**
* 高級回調(diào)
* @author pig
*
*/
class AdvancedCallbackHandler implements MqttSimpleCallback{
@Override
public void connectionLost() throws Exception {
//
TODO Auto-generated method stub
}
@Override
public void publishArrived(String arg0, byte[] arg1, int
arg2,
boolean arg3) throws Exception {
// TODO Auto-generated
method stub
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated
method stub
new SubscribeClient("" + i);
}
}
broker服務(wù)器,MQTT的jar包,記得下載啊,沒有就消息我咯~
到這里,如果完成IBM的MQTT協(xié)議實現(xiàn)push消息的實例的,
都會有個問題,好像沒考慮到安全問題,如果客戶端連上來作亂怎么辦呢?
上面用的broker時rsmb的,mqtt的簡單服務(wù)器。
IBM已經(jīng)推出了MQTT V3.1版本,已經(jīng)加入了安全驗證機(jī)制,不要怕啦。
四、為什么每份 Android 簡歷都說 “熟悉 MQTT 協(xié)議”?
MQTT (Message Queuing Telemetry Transport,消息隊列遙測傳輸) 是一種基于 TCP/IP 協(xié)議族的應(yīng)用層協(xié)議。MQTT 協(xié)議是專門針對硬件性能低下 & 網(wǎng)絡(luò)狀況不穩(wěn)定的場景設(shè)計的,這使得 MQTT 在物聯(lián)網(wǎng)和移動應(yīng)用等受限場景得到廣泛應(yīng)用。
目前,MQTT 主要分為兩個大版本:
物聯(lián)網(wǎng)和移動應(yīng)用場景的特點(diǎn)是硬件性能低下和網(wǎng)絡(luò)狀況不穩(wěn)定,而 MQTT 協(xié)議就是專門針對這種環(huán)境設(shè)計的,主要在四個方面有優(yōu)勢:
結(jié)論:這三種協(xié)議并沒有絕對的優(yōu)勝者,最好的協(xié)議取決于具體的需求和限制條件。但如果只從帶寬、電池、功能多樣性這些基本條件看,MQTT 在其中是更占優(yōu)的選擇。
MQTT 協(xié)議的設(shè)計特性中包含了一項 “高可靠性交付”,它需要一個保證可靠的底層傳輸層協(xié)議,因此 TCP 協(xié)議、TLS 協(xié)議、WebSocket 協(xié)議都可以作為 MQTT 的底層協(xié)議。而無連接的 UDP 協(xié)議會丟失或重排數(shù)據(jù),不能滿足 MQTT 協(xié)議的傳輸需要。
MQTT 是基于發(fā)布 - 訂閱模型 (pub/sub) 的消息傳遞協(xié)議,與請求 - 響應(yīng)模型不同,發(fā)布 - 訂閱模型主要有三種角色: publisher & subscriber & subscriber :
當(dāng) client 發(fā)布某個主題的消息時,broker 會將該消息分發(fā)給任何已訂閱該主題的 client。通常來說,client 不會存儲消息,一旦消息被發(fā)送到這些 client,消息就會從 broker 上刪除。另外,保留消息、持久連接和服務(wù)質(zhì)量 QoS 可能會導(dǎo)致消息臨時存儲在 broker 上。
發(fā)布 - 訂閱模式使得 消息的發(fā)布者和訂閱者解耦 ,主要體現(xiàn)為空間解耦和時間解耦:
圖片引用自 https://juejin.cn/post/6976441705067184135 —— cxuan 著
一個 MQTT 消息由三部分組成:
1、固定報頭: 每一個 MQTT 消息都包含一個固定報頭,包含消息類型、標(biāo)志位和剩余長度三個部分。固定報頭長度為 2 ~ 5 字節(jié),具體取決于 “剩余長度” 的大小,格式如下:
2、可變報頭: 不同消息的可變報頭內(nèi)容不一樣,不過其中有一個比較通用的字段:
3、載荷: 某些 MQTT 消息會包含一個有效載荷,對于 PUBLISH 消息來說,有效載荷就是應(yīng)用消息。
MQTT 的連接總是發(fā)生在 client 和 broker 之間,兩個 client 之間不會互相感知。請求連接時,client 會向 broker 發(fā)送 CONNECT 連接消息,broker 接受連接后會響應(yīng) CONNACK 連接確認(rèn)消息。一旦連接建立,連接會一直保持打開狀態(tài),直到 client 發(fā)送 DISCONNECT 斷開連接消息或連接異常中斷。
CONNECT 是 client 發(fā)送給 broker 的首個消息,并且在一次連接中,client 只能發(fā)送一次 CONNECT 消息,發(fā)送的第二個 CONNECT 消息會被 broker 當(dāng)作違反協(xié)議處理,并斷開連接。在 CONNECT 消息中,主要包含以下內(nèi)容:
CONNACK 消息用于確認(rèn) CONNECT 消息。CONNECT 是 client 發(fā)送給 broker 的首個消息,相應(yīng)地,broker 發(fā)送給 client 的首個消息一定是 CONNACK 消息。在 CONNACK 消息中,主要包含以下內(nèi)容:
DISCONNECT 消息由 client 發(fā)送給 broker,用于斷開連接。 DISCONNECT 消息沒有可變報頭和有效載荷,也沒有對應(yīng)的確認(rèn)應(yīng)答消息,表示一個干凈利索地斷開連接操作 。斷開連接后,client 不能再發(fā)送除 CONNECT 消息之外的消息,broker 也需要丟棄和當(dāng)前會話有環(huán)的遺囑消息。
MQTT 是基于發(fā)布訂閱模型的協(xié)議,在建立連接后,client 可以向 broker 訂閱感興趣的一個或多個話題。
SUBSCRIBE 消息由 client 發(fā)送給 broker,用于訂閱感興趣的話題,SUBSCRIBE 消息主要包含以下內(nèi)容:
SUBACK 消息用于確認(rèn) SUBSCRIBE 消息。SUBACK 消息主要包含以下內(nèi)容:
UNSUBSCRIBE 消息由 client 發(fā)送給 broker,用于退訂不感興趣的話題,UNSUBSCRIBE 消息主要包含以下內(nèi)容:
UNSUBACK 消息用于確認(rèn) UNSUBSCRIBE 消息。UNSUBACK 消息非常簡單,只有一個包唯一標(biāo)識(位于可變報頭)。
當(dāng) MQTT client 在連接到 broker 之后就可以發(fā)送消息了,每條 PUBLISH 消息都包含一個 topic ,broker 會根據(jù) topic 將消息發(fā)送給感興趣的 client。除此之外,每條消息還會包含一個 Payload,Payload 是真正發(fā)布的應(yīng)用消息,載荷的內(nèi)容和格式由應(yīng)用層決定,MQTT 協(xié)議層不關(guān)心。
PUBLISH 消息可以由 client 發(fā)送給 broker,也可以由 broker 發(fā)送給 client,用來運(yùn)送應(yīng)用層消息。PUBLISH 消息主要包含以下內(nèi)容:
PUBLISH 消息的接收方需要發(fā)送確認(rèn)應(yīng)答,不同 QoS 等級的 PUBLISH 消息響應(yīng)的消息不同:
當(dāng) client 和 broker 在一段時間內(nèi)沒有數(shù)據(jù)交互時,client 會發(fā)送 PINGREQ 探測消息,用于判斷連接是否正常,來決定是否要關(guān)閉該連接,這就是 MQTT 協(xié)議的保活機(jī)制。
PINGREQ 消息由 client 發(fā)送給 broker。
PINGRESP 消息由 broker 發(fā)送給 client,代表 client 是存活的。
MQTT 主題本質(zhì)上是一種 “尋址形式” ,用于將應(yīng)用層消息分發(fā)到期望的客戶端。MQTT 主題是一種類似于文件系統(tǒng)的分層結(jié)構(gòu),使用 “/” 正斜杠 作為分隔符。
客戶端訂閱主題時,可以訂閱確定的主題(例如 “group/group123”),也可以使用 “通配符” 來同時訂閱多個主題。需要注意的是: 在發(fā)布消息是不允許使用主題通配符,client 每次發(fā)布消息只能發(fā)布到單個主題。
$SYS 主題是 broker 上默認(rèn)創(chuàng)建的只讀主題,除此之外,broker 不會默認(rèn)創(chuàng)建任何主題,所有主題都是由客戶端訂閱或發(fā)布才創(chuàng)建的,都不是永久性的。關(guān)于 $SYS 主題的更多介紹在 這里
當(dāng) client 連接到 broker 時,可以使用持久連接或非持久連接,這是通過 CONNECT 消息中的 CleanSession 標(biāo)志來決定的(當(dāng) CleanSession = 0 時表示持久連接)。對于持久會話,broker 會存儲會話狀態(tài);而對于非持久會話,broker 不會存儲 client 的任何內(nèi)容。會話狀態(tài)主要包含以下內(nèi)容:
QoS 0 等級的 PUBLISH 消息的交付能力完全依賴于底層傳輸層,QoS 1 和 QoS 2 等級開始在應(yīng)用層提高 PUBLISH 消息的交付能力。當(dāng)消息丟失時,發(fā)送端會重新發(fā)送早前嘗試發(fā)送過的 PUBLISH 消息(DUP = 1),接收者收到消息也會發(fā)送確認(rèn)響應(yīng)消息。
在 QoS 0 的等級的 PUBLISH 消息中不包含包唯一標(biāo)識。發(fā)送者不考慮消息交付結(jié)果,接收者也不發(fā)送響應(yīng)。接收者最多只能收到一次消息,也有可能一次也收不到。
在 QoS 1 等級的 PUBLISH 消息中包含包唯一標(biāo)識,發(fā)送方會一直將該消息當(dāng)作 “未確認(rèn)” 的消息,直到收到對應(yīng)的 PUBACK 確認(rèn)消息。具體消息流如下:
QoS 2 是最高的服務(wù)質(zhì)量,保證消息不會丟失也不會重復(fù),缺點(diǎn)是會增加開銷。在 QoS 2 等級的 PUBLISH 消息中包含包唯一標(biāo)識,發(fā)送者會一直將該消息當(dāng)作 “未確認(rèn)” 的消息,知道收到對應(yīng)的 PUBCOMP 確認(rèn)消息。
當(dāng) client 發(fā)布某個主題的消息時,broker 會將該消息分發(fā)給任何已訂閱該主題的 client,隨后這條消息會從 broker 上刪除??梢栽O(shè)置 RETAIN 保留標(biāo)志設(shè)置該 PUBLISH 消息為保留消息,broker 會存儲該主題的最后一條保留消息,當(dāng)新的 client 注冊訂閱時,并且匹配該消息主題時,該保留消息會發(fā)送給訂閱者。 需要注意:broker 只會為每個主題保存最近一條保留消息,新收到的 RETAIN = 1 的消息會覆蓋原本那條保留消息;
持久會話 & 服務(wù)質(zhì)量等級 & 保留消息都會影響新訂閱者是否接受消息,總結(jié)如下表:
標(biāo)記 DUP = 1 的消息是重復(fù)發(fā)送的消息,MQTT 消息重傳有兩種場景:
需要注意:DUP 標(biāo)志只對 OoS > 0 的消息有效,所有 QoS = 0 的消息 DUP 標(biāo)志必須設(shè)置為 0;
TCP 協(xié)議的報文重傳機(jī)制是對所有 TCP 報文有效的重傳機(jī)制,而 MQTT 協(xié)議的消息重傳機(jī)制只對一小部分消息有效,用于實現(xiàn)更可靠的消息交付保證。雖然 TCP 協(xié)議在一般情況下可以保證不丟包,但是這并不是絕對的,依然存在請求超時或者連接中斷等情況。而 MQTT 協(xié)議的 QoS 1 和 QoS 2 要求更可靠的交付能力,并且需要在客戶端重連后也能保證交付。因此,MQTT 協(xié)議也定義了一個消息重傳機(jī)制。
到這里,關(guān)于 MQTT 協(xié)議的工作原理 & 協(xié)議消息格式 & 核心特性等內(nèi)容就介紹完了。我知道你應(yīng)該會對 MQTT 協(xié)議的實戰(zhàn)應(yīng)用更加感興趣,下一篇文章里,我將帶你實現(xiàn)基于 MQTT 協(xié)議的 IM 服務(wù),請關(guān)注。
以上就是關(guān)于androidmqtt庫相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
商標(biāo)買賣平臺排行榜(商標(biāo)買賣平臺排行榜前十名)
猜你喜歡
你無權(quán)訪問該文件夾win11(你無權(quán)訪問該文件夾win10)
哪個網(wǎng)址可以免費(fèi)觀看(哪個網(wǎng)址可以免費(fèi)觀看你的婚禮)
人工智能研究生就業(yè)方向及前景(人工智能碩士畢業(yè)多少月薪)
wifi正常但有的app沒網(wǎng)(wifi有的app有網(wǎng)絡(luò)有的app沒有網(wǎng)絡(luò))
win10無法訪問c盤拒絕訪問(windows10無法訪問c盤)
國外sms短信驗證碼(國外sms短信驗證碼怎么收費(fèi))