MQTT深入淺出系列(一)

mqtt介紹與使用

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

如何使用請參考此篇博客,寫的通俗易懂修陡。

Android APP必備高級功能沧侥,消息推送之MQTT

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

使用

獲取源碼文件

github上是沒有mqtt源碼的,雖然我們能從遠程依賴上拿到j(luò)ar包魄鸦,但是因為java文件編譯后成class文件后注釋宴杀、常量、以及部分方法都發(fā)生了一些變化拾因,可讀性很差旺罢,那我們?nèi)绾文迷创a呢,當然是jcenter了绢记,如圖:

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

點進去后扁达,找一下以下文件,如圖的那個就是java文件(下載下來后改成zip格式蠢熄,然后解壓就好啦)

在此源碼上跪解,對mqtt進行封裝,便于調(diào)用签孔,具體實現(xiàn)請訪問我的github:

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

如何使用

Androidstudio添加如下依賴:

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

搭建服務(wù)器

如果有自己的mqtt服務(wù)器的話叉讥,請?zhí)^此步驟。

  1. 點擊,下載Apollo服務(wù)器饥追,安裝图仓。

  2. 命令行進入安裝目錄bin目錄下。

     D:
     cd D:\develop\tools\apache-apollo-1.7.1\bin
    
  3. 輸入apollo create XXX(xxx為創(chuàng)建的服務(wù)器實例名稱但绕,例:apollo create mybroker)救崔,之后會在bin目錄下創(chuàng)建名稱為XXX的文件夾。XXX文件夾下etc\apollo.xml文件下是配置服務(wù)器信息的文件捏顺。etc\users.properties文件包含連接MQTT服務(wù)器時用到的用戶名和密碼帚豪,默認為admin=password,即賬號為admin草丧,密碼為password狸臣,可自行更改。

  4. 進入XXX/bin目錄昌执,輸入apollo-broker.cmd run開啟服務(wù)器烛亦,看到如下界面代表搭建完成


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


客戶端編碼

連接

先介紹API吧煤禽。

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

  1. setClientId()

    設(shè)置客戶身份唯一標識

  2. setServer()

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

  3. setPort

    設(shè)置端口號

  4. setUserNameAndPassword

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

  5. setKeepAlive

    設(shè)置保持長連接ping的頻率檬果,單位為秒瓮孙,建議100

  6. setTimeout

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

  7. setCleanSession

    設(shè)置cleansession选脊,若為true杭抠,當 disconnect 時,會移除這個 client 所有的 subscriptions.

  8. setSsl

    建立ssl長連接,若沒有設(shè)置的話恳啥,默認為tcp長連接偏灿。

  9. setLastWill

    設(shè)置遺愿消息,即當設(shè)備斷開連接時會主動pub的消息钝的。

  10. setTraceEnabled

    是否打印日志翁垂,默認false

  11. setTraceCallback

    監(jiān)聽日志回調(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);
                        }
                    });

連接成功后在頁面上顯示如圖:

需要注意幾點:

  1. clientId不同設(shè)備請設(shè)置不同的值硝桩。

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

  3. port ,見下圖:

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

發(fā)送消息

API

  1. setMessage

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

  2. setQos

    設(shè)置qos望薄,決定消息到達次數(shù)疟游。

  3. setTopic

    設(shè)置消息主題

  4. setRetained

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

     MqttManager.getInstance().pub(new PubCommand()
             .setMessage("哈哈哈,我來了")
             .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)容合作請聯(lián)系作者
  • 序言:七十年代末痕支,一起剝皮案震驚了整個濱河市颁虐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卧须,老刑警劉巖另绩,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異花嘶,居然都是意外死亡笋籽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門椭员,熙熙樓的掌柜王于貴愁眉苦臉地迎上來车海,“玉大人,你說我怎么就攤上這事隘击∈讨ィ” “怎么了研铆?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長州叠。 經(jīng)常有香客問我棵红,道長,這世上最難降的妖魔是什么咧栗? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任逆甜,我火速辦了婚禮,結(jié)果婚禮上致板,老公的妹妹穿的比我還像新娘交煞。我一直安慰自己,他們只是感情好可岂,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翰灾,像睡著了一般缕粹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纸淮,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天平斩,我揣著相機與錄音,去河邊找鬼咽块。 笑死绘面,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的侈沪。 我是一名探鬼主播揭璃,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亭罪!你這毒婦竟也來了瘦馍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤应役,失蹤者是張志新(化名)和其女友劉穎情组,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箩祥,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡院崇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袍祖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底瓣。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蕉陋,靈堂內(nèi)的尸體忽然破棺而出濒持,到底是詐尸還是另有隱情键耕,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布柑营,位于F島的核電站屈雄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏官套。R本人自食惡果不足惜酒奶,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奶赔。 院中可真熱鬧惋嚎,春花似錦、人聲如沸站刑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绞旅。三九已至摆尝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間因悲,已是汗流浹背堕汞。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晃琳,地道東北人讯检。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像卫旱,于是被迫代替她去往敵國和親人灼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容