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ò)此步驟。
請(qǐng)點(diǎn)擊,下載Apollo服務(wù)器,安裝。
-
命令行進(jìn)入安裝目錄bin目錄下。
D: cd D:\develop\tools\apache-apollo-1.7.1\bin 輸入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,可自行更改。
-
進(jìn)入XXX/bin目錄,輸入apollo-broker.cmd run開(kāi)啟服務(wù)器,看到如下界面代表搭建完成
-
在瀏覽器輸入http://127.0.0.1:61680/,查看是否安裝成功。
客戶端編碼
連接
先介紹API吧。
ConnectCommand為連接操作類,可以設(shè)置相應(yīng)屬性。
-
setClientId()
設(shè)置客戶身份唯一標(biāo)識(shí)
-
setServer()
設(shè)置建立連接的域名或者服務(wù)器ip
-
setPort
設(shè)置端口號(hào)
-
setUserNameAndPassword
設(shè)置連接認(rèn)證的用戶名和密碼
-
setKeepAlive
設(shè)置保持長(zhǎng)連接ping的頻率,單位為秒,建議100
-
setTimeout
設(shè)置操作超時(shí)時(shí)間。
-
setCleanSession
設(shè)置cleansession,若為true,當(dāng) disconnect 時(shí),會(huì)移除這個(gè) client 所有的 subscriptions.
-
setSsl
建立ssl長(zhǎng)連接,若沒(méi)有設(shè)置的話,默認(rèn)為tcp長(zhǎng)連接。
-
setLastWill
設(shè)置遺愿消息,即當(dāng)設(shè)備斷開(kāi)連接時(shí)會(huì)主動(dòng)pub的消息。
-
setTraceEnabled
是否打印日志,默認(rèn)false
-
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):
clientId不同設(shè)備請(qǐng)?jiān)O(shè)置不同的值。
server,若使用的是Apollo服務(wù)器,則為IPv4 地址(ipconfig/all獲取)
-
port ,見(jiàn)下圖:
setUserNameAndPassword,若使用的是Apollo服務(wù)器,則默認(rèn)的用戶名是admin,密碼是:password。
發(fā)送消息
API
-
setMessage
設(shè)置消息內(nèi)容
-
setQos
設(shè)置qos,決定消息到達(dá)次數(shù)。
-
setTopic
設(shè)置消息主題
-
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) {
}
});


