HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務(wù)案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    androidmqtt庫

    發(fā)布時間:2023-03-14 05:09:42     稿源: 創(chuàng)意嶺    閱讀: 57        問大家

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于androidmqtt庫的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    ChatGPT國內(nèi)免費在線使用,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端

    官網(wǎng):https://ai.de1919.com

    本文目錄:

    androidmqtt庫

    一、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、集成時將注意的要點,官網(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)品提高用戶體驗,獲得更多用戶。

    androidmqtt庫

    二、# 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)用場景的特點是硬件性能低下和網(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ī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ù),缺點是會增加開銷。在 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)容。


    推薦閱讀:

    animal的中文諧音是什么(animals的中文諧音)

    acquaintance諧音記憶

    行李箱banner圖(行李箱banner圖制作方法)

    商標(biāo)買賣平臺排行榜(商標(biāo)買賣平臺排行榜前十名)

    市場營銷推廣方案范文(市場營銷推廣方案范文模板)