mqtt介紹與使用
mqtt協(xié)議是輕量級的消息訂閱和發(fā)布(publish/subscribe)協(xié)議,建立在TCP/IP協(xié)議之上录豺,物聯(lián)網(wǎng)唠亚、消息推送中用的很多。
如何使用請參考此篇博客,寫的通俗易懂修陡。
本人的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í)^此步驟。
請點擊,下載Apollo服務(wù)器饥追,安裝图仓。
-
命令行進入安裝目錄bin目錄下。
D: cd D:\develop\tools\apache-apollo-1.7.1\bin
輸入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狸臣,可自行更改。
-
進入XXX/bin目錄昌执,輸入apollo-broker.cmd run開啟服務(wù)器烛亦,看到如下界面代表搭建完成
-
在瀏覽器輸入http://127.0.0.1:61680/诈泼,查看是否安裝成功。
客戶端編碼
連接
先介紹API吧煤禽。
ConnectCommand為連接操作類铐达,可以設(shè)置相應(yīng)屬性。
-
setClientId()
設(shè)置客戶身份唯一標識
-
setServer()
設(shè)置建立連接的域名或者服務(wù)器ip
-
setPort
設(shè)置端口號
-
setUserNameAndPassword
設(shè)置連接認證的用戶名和密碼
-
setKeepAlive
設(shè)置保持長連接ping的頻率檬果,單位為秒瓮孙,建議100
-
setTimeout
設(shè)置操作超時時間。
-
setCleanSession
設(shè)置cleansession选脊,若為true杭抠,當 disconnect 時,會移除這個 client 所有的 subscriptions.
-
setSsl
建立ssl長連接,若沒有設(shè)置的話恳啥,默認為tcp長連接偏灿。
-
setLastWill
設(shè)置遺愿消息,即當設(shè)備斷開連接時會主動pub的消息钝的。
-
setTraceEnabled
是否打印日志翁垂,默認false
-
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);
}
});
連接成功后在頁面上顯示如圖:
需要注意幾點:
clientId不同設(shè)備請設(shè)置不同的值硝桩。
server,若使用的是Apollo服務(wù)器沿猜,則為IPv4 地址(ipconfig/all獲取)
-
port ,見下圖:
setUserNameAndPassword,若使用的是Apollo服務(wù)器碗脊,則默認的用戶名是admin邢疙,密碼是:password。
發(fā)送消息
API
-
setMessage
設(shè)置消息內(nèi)容
-
setQos
設(shè)置qos望薄,決定消息到達次數(shù)疟游。
-
setTopic
設(shè)置消息主題
-
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) {
}
});