MQTT深入淺出系列(一)

mqtt介紹與使用

mqtt協(xié)議是輕量級(jí)的消息訂閱和發(fā)布(publish/subscribe)協(xié)議,建立在TCP/IP協(xié)議之上,物聯(lián)網(wǎng)、消息推送中用的很多。

如何使用請(qǐng)參考此篇博客,寫(xiě)的通俗易懂。

Android APP必備高級(jí)功能,消息推送之MQTT

本人的github地址:
https://github.com/fighter-lee/EasyMqtt

使用

獲取源碼文件

github上是沒(méi)有mqtt源碼的,雖然我們能從遠(yuǎn)程依賴上拿到j(luò)ar包,但是因?yàn)閖ava文件編譯后成class文件后注釋、常量、以及部分方法都發(fā)生了一些變化,可讀性很差,那我們?nèi)绾文迷创a呢,當(dāng)然是jcenter了,如圖:

在jcenter官網(wǎng)上搜索關(guān)鍵字:eclipse.paho.client.mqttv3

點(diǎn)進(jìn)去后,找一下以下文件,如圖的那個(gè)就是java文件(下載下來(lái)后改成zip格式,然后解壓就好啦)

在此源碼上,對(duì)mqtt進(jìn)行封裝,便于調(diào)用,具體實(shí)現(xiàn)請(qǐng)?jiān)L問(wèn)我的github:

https://github.com/fighter-lee/EasyMqtt

如何使用

Androidstudio添加如下依賴:

compile 'top.fighter-lee:mqttlibs:1.0.1'

搭建服務(wù)器

如果有自己的mqtt服務(wù)器的話,請(qǐng)?zhí)^(guò)此步驟。

  1. 請(qǐng)點(diǎn)擊,下載Apollo服務(wù)器,安裝。

  2. 命令行進(jìn)入安裝目錄bin目錄下。

     D:
     cd D:\develop\tools\apache-apollo-1.7.1\bin
    
  3. 輸入apollo create XXX(xxx為創(chuàng)建的服務(wù)器實(shí)例名稱,例:apollo create mybroker),之后會(huì)在bin目錄下創(chuàng)建名稱為XXX的文件夾。XXX文件夾下etc\apollo.xml文件下是配置服務(wù)器信息的文件。etc\users.properties文件包含連接MQTT服務(wù)器時(shí)用到的用戶名和密碼,默認(rèn)為admin=password,即賬號(hào)為admin,密碼為password,可自行更改。

  4. 進(jìn)入XXX/bin目錄,輸入apollo-broker.cmd run開(kāi)啟服務(wù)器,看到如下界面代表搭建完成


  5. 在瀏覽器輸入http://127.0.0.1:61680/,查看是否安裝成功。


客戶端編碼

連接

先介紹API吧。

ConnectCommand為連接操作類,可以設(shè)置相應(yīng)屬性。

  1. setClientId()

    設(shè)置客戶身份唯一標(biāo)識(shí)

  2. setServer()

    設(shè)置建立連接的域名或者服務(wù)器ip

  3. setPort

    設(shè)置端口號(hào)

  4. setUserNameAndPassword

    設(shè)置連接認(rèn)證的用戶名和密碼

  5. setKeepAlive

    設(shè)置保持長(zhǎng)連接ping的頻率,單位為秒,建議100

  6. setTimeout

    設(shè)置操作超時(shí)時(shí)間。

  7. setCleanSession

    設(shè)置cleansession,若為true,當(dāng) disconnect 時(shí),會(huì)移除這個(gè) client 所有的 subscriptions.

  8. setSsl

    建立ssl長(zhǎng)連接,若沒(méi)有設(shè)置的話,默認(rèn)為tcp長(zhǎng)連接。

  9. setLastWill

    設(shè)置遺愿消息,即當(dāng)設(shè)備斷開(kāi)連接時(shí)會(huì)主動(dòng)pub的消息。

  10. setTraceEnabled

    是否打印日志,默認(rèn)false

  11. setTraceCallback

    監(jiān)聽(tīng)日志回調(diào),需要setTraceEnabled(true)

    MqttManager.getInstance()
            .connect(new ConnectCommand()
                            .setClientId(getClientId())
                            .setServer("172.17.3.35")
                            .setPort(61613)
                            .setUserNameAndPassword("admin", "password")
                            .setKeepAlive(30)
                            .setTimeout(10)
                            .setCleanSession(false)
                    , new IMqttActionListener() {
                        @Override
                        public void onSuccess(IMqttToken asyncActionToken) {
                            Trace.d(TAG, "onSuccess() ");
                        }

                        @Override
                        public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                            Trace.d(TAG, "onFailure() ");
                            Trace.e(TAG, exception);
                        }
                    });

連接成功后在頁(yè)面上顯示如圖:

需要注意幾點(diǎn):

  1. clientId不同設(shè)備請(qǐng)?jiān)O(shè)置不同的值。

  2. server,若使用的是Apollo服務(wù)器,則為IPv4 地址(ipconfig/all獲取)

  3. port ,見(jiàn)下圖:

  4. setUserNameAndPassword,若使用的是Apollo服務(wù)器,則默認(rèn)的用戶名是admin,密碼是:password。

發(fā)送消息

API

  1. setMessage

    設(shè)置消息內(nèi)容

  2. setQos

    設(shè)置qos,決定消息到達(dá)次數(shù)。

  3. setTopic

    設(shè)置消息主題

  4. setRetained

    服務(wù)器是否保存消息

     MqttManager.getInstance().pub(new PubCommand()
             .setMessage("哈哈哈,我來(lái)了")
             .setQos(1)
             .setTopic("/fighter-lee.top/mqttlibs")
             .setRetained(false), new IMqttActionListener() {
         @Override
         public void onSuccess(IMqttToken asyncActionToken) {
             Trace.d(TAG, "onSuccess() ");
         }
    
         @Override
         public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
             Trace.e(TAG, exception);
         }
     });
    

訂閱消息主題

MqttManager.getInstance().sub(new SubCommand()
            .setQos(1)
            .setTopic("/fighter-lee.top/mqttlibs"), new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken asyncActionToken) {
            Trace.d(TAG, "onSuccess() ");
        }

        @Override
        public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            Trace.e(TAG, exception);
        }
    });

取消訂閱消息主題

MqttManager.getInstance().unSub(new UnsubCommand()
            .setTopic("/fighter-lee.top/mqttlibs"), new IMqttActionListener() {
        @Override
        public void onSuccess(IMqttToken asyncActionToken) {
            Trace.d(TAG, "onSuccess() ");
        }

        @Override
        public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
            Trace.e(TAG, exception);
        }
    });

接收消息

MqttManager.getInstance().registerMessageListener(new MqttCallback() {
        @Override
        public void connectionLost(Throwable cause) {
            Trace.e(TAG, cause);
        }

        @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {
            Trace.d(TAG, "messageArrived() topic:"+topic);
            Trace.d(TAG, "messageArrived() message:"+message);
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken token) {

        }
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容