1.EMQ X
在上篇 MQTT初入門 中介紹了MQTT,列出了 eclipse-mosquitto 實現MQTT後對外提供的服務產生的一些問題,後面又找了一個MQTT的開源實現 EMQ X,EMQ X解決了mosquitto的問題,而且有中文文檔
MQTT只是一個網絡協議,需要一個消息中間件,目前比較有名的有Mosquitto,Apollo,RabbitMQ,Emqx等,本篇使用Emqx,使用的是docker emqx 鏡像
EMQ X R3.2 (Erlang/Enterprise/Elastic MQTT Broker) 是基於 Erlang/OTP 語言平臺開發,支持大規模連接和分佈式集羣,發佈訂閱模式的開源 MQTT 消息服務器,文檔地址:https://docs.emqx.io/docs/broker/v3/cn/
EMQ X 消息服務器完整支持 MQTT V3.1/V3.1.1/V5.0 版本協議規範,並擴展支持 MQTT-SN 、WebSocket、CoAP、LwM2M、Stomp 以及私有 TCP/UDP 協議。EMQ X 消息服務器支持單節點100萬連接與多節點分佈式集羣。爲大規模設備連接 (C1000K+) 的物聯網、車聯網、智能硬件、移動推送、移動消息等應用,提供完全開放源碼、安裝部署簡便、企業級穩定可靠、可彈性擴展、易於定製開發的 MQTT 消息服務器。
2.使用docker安裝 EMQ X
匿名模式運行emqx,沒有認證,任何人都能訪問
docker run -it -d --name emqx -p 18083:18083 -p 1883:1883 -p 8083:8083 emqx/emqx:latest
# -it 運行爲容器後可以進入容器
# -d 後臺啓動
# --name 容器的名稱爲 emqx
# -p 宿主機的端口與容器的端口進行綁定,18083爲emqx dashboard控制檯,1883爲emqx tcp協議地址,8083爲emqx websocket地址
容器啓動後,在瀏覽器訪問 dashboard控制檯: http://127.0.0.1:18083,默認用戶名: admin,密碼:public
3.瀏覽器websocket測試
emqx dashboard自動websocket工具,輸入用戶名和密碼,點擊連接,可看到當前狀態:已連接
下面有訂閱和發佈,訂閱一個主題,然後向該主題發佈消息,可看到訂閱成功和發佈成功的提示,下面有收到訂閱消息的時間
4.android app測試
MQTT的客戶端有 Eclipse Paho: https://www.eclipse.org/paho/
Paho的android庫是:https://github.com/eclipse/paho.mqtt.android
在Gradle中引入paho sdk,寫上連接MQTT服務的代碼,然後打包到android手機上
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
dependencies {
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
#其餘代碼部分就省略了
運行效果如下:
向352019040642849主題發送消息:zhi lian gu
app收到了發佈的消息
5.使用認證模式訪問MQTT 提升安全性
上面的emqx默認是 匿名模式啓動的,任何人都能訪問,在開發、測試環境時可以使用,但到正式環境則會有安全性問題,下面簡要談談怎麼開啓Username認證模式,只有認證的用戶可連接MQTT,具體可以參考 emqx 官方文檔—>配置說明章節
allow_anonymous默認等於true,默認是匿名模式,通過啓動參數配置爲false,關閉匿名模式
emqx的認證是通過plugins插件實現的,可通過啓用插件,來實現認證,啓用 emqx_auth_username 插件
新的啓動命令如下:
docker run -it -d --rm --name emqx -p 18083:18083 -p 1883:1883 -p 8083:8083 \
-e EMQX_ALLOW_ANONYMOUS=false \
-e EMQX_LOADED_PLUGINS="emqx_auth_username,emqx_management,emqx_dashboard" \
emqx/emqx:latest
運行爲容器後,進入emqx容器:docker exec -it emqx sh
#使用emqx_ctl 命令添加test用戶,密碼爲test123
emqx_ctl users add test test123
#下面命令是操作用戶的
emqx_ctl users
emqx_ctl users list
emqx_ctl users add <Username> <Password>
emqx_ctl users update <Username> <NewPassword>
emqx_ctl users del <Username>
然後就可以使用 test test123連接 mqtt 服務了