MQTT中間服務器(mosquitto)安裝(含cmake和libwebsockets安裝)
以下爲本人安裝mosquitto作爲MQTT中間服務器步驟記錄,僅供參考。
測試環境
Ubuntu 12.04
依賴
包括但不限於如下依賴包
1. MQTT(mosquitto)的依賴(使用apt-get 安裝)
libssl-dev
uuid-dev
- libwebsockets的準備
需要 cmake 2.8.9 以上
注:如果mqtt不需要支持websocket,可以不用安裝這個。
安裝
cmake 安裝
版本 2.8.9 及以上,下載網站:https://cmake.org/download/
若版本滿足要求,不用再裝
這裏以 3.11.4 版本爲例
安裝命令如下
tar -xzvf cmake-3.11.4.tar.gz
cd cmake-3.11.4
./configure
make
make install
安裝完後,在命令行輸入cmake 測試是否安裝成功,若提示 No such file. 則給cmake建立快捷方式。
ln -s /usr/local/bin/cmake /usr/bin/cmake
libwebsockets 安裝
github鏈接:https://github.com/warmcat/libwebsockets
選擇下載zip或者使用git命令進行克隆到本地
如果mqtt不需要支持websocket,可以不用安裝這個
安裝命令:
unzip libwebsockets-master.zip
cd libwebsockets-master/
mkdir bulid
cd build/
cmake ../
make
make install
安裝完後,鏈接動態庫
cp lib/libwebsockets.so.13 /usr/lib/
mosquitto安裝
下載網站:https://mosquitto.org/download/
這裏以 1.5 版本爲例
安裝命令分別如下
tar -xzvf mosquitto-1.5.tar.gz
cd mosquitto-1.5
如要提供websocket支持,則安裝前還有如下步驟:
vim config.mk
# 將第72行的 WITH_WEBSOCKETS:=no 中 no 改爲 yes,即
WITH_WEBSOCKETS:=yes
然後安裝即可:
make
make install
提示:修改了 config.mk
之後,重編譯時需要先 make clean
清除一下。
安裝後,鏈接動態庫
ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
安裝mosquitto中,make報錯問題
- 報錯
S_IFDIR undeclared
和S_IFREG undeclared
解決辦法是修改websocket.c部分源碼,如下:
vim src/websockets.c
在 第 45行 (在 #include <sys/stat.h> 這行下面 ) 後,插入如下6行 c 代碼
#ifndef S_IFDIR
#define S_IFDIR (__S_IFDIR)
#endif
#ifndef S_IFREG
#define S_IFREG (__S_IFREG)
#endif
MQTT 使用測試
安裝好 mosquitto 後,系統裏有幾個工具可用了,其中三個是:
mosquitto:mqtt的代理服務器Broker
mosquitto_sub:mqtt的訂閱者Subscribe
mosquitto_pub:mqtt的發佈者Publish
開啓第一個終端,創建代理服務器 Broker
- 啓動一個默認配置的MQTT服務器
執行:
# -v表示輸出詳細信息
mosquitto -v
如果出現 Invalid user ‘mosquitto’
錯誤,則終端輸入adduser mosquitto
,添加該用戶即可。
注:該用戶密碼配置不能爲空,其他配置默認即可。
- 指定
conf
文件進行啓動
例如,要求該代理服務器 接收 websocket 封裝的mqtt 協議,則修改mosquitto.conf
文件即可(該文件在安裝文件中自帶)
vim mosquitto.conf
具體修改如下:
# 163行和178行是MQTT的默認端口配置
# 去除163行註釋,結果如下
port 1883
# 去除178行註釋,結果如下
protocol mqtt
# 310行和330行,是監聽基於websocket客戶端的端口配置
# 去除310行註釋,加上配置的端口,結果如下
listener 8831
# 去除330行註釋,並把mqtt改成websockets,結果如下
protocol websockets
注:1883是mqtt協議的默認端口(此值可定義)
8831是我自定義的用於接收websockets消息的mqtt協議的監聽端口(此值可自定義)
然後,運行時,指定該文件即可:
mosquitto -v -c mosquitto.conf
第二個終端,創建訂閱者 Subscribe
終端執行:
mosquitto_sub -t topic1 -v
注:-t 表示訂閱 topic1 主題,如果使用#
訂閱任意主題,則寫成mosquitto_sub -t "#" -v
,即使用引號括起來。
第三個終端,發佈者 Publish
終端執行
mosquitto_pub -t topic1 -m hhh123
注:-t 表示發佈 topic1 的主題,-m 表示 發送消息 hhh123
執行完之後,訂閱者終端打印消息爲
topic1 hhh123
前端網頁使用Websocket進行MQTT通信示例
MQTT相關js下載 https://github.com/mqttjs/MQTT.js
或參考 https://qtdebug.com/fe-mqtt/
var mqtt = require('mqtt')
// 注意這裏端口不是1883,而是上面配置的8831
var client = mqtt.connect('ws://192.16.10.8:8831')
client.on('connect', function () {
client.subscribe('topic1', function (err) {
if (!err) {
client.publish('topic2', 'Hello mqtt')
}
})
})
client.on('message', function (topic, message) {
// 訂閱的是 topic1
// message is Buffer
console.log(message.toString())
client.end()
})