MQTT中間服務器(mosquitto)安裝(含cmake和libwebsockets安裝)

以下爲本人安裝mosquitto作爲MQTT中間服務器步驟記錄,僅供參考。

測試環境

Ubuntu 12.04

依賴

包括但不限於如下依賴包
1. MQTT(mosquitto)的依賴(使用apt-get 安裝)

   libssl-dev
   uuid-dev
  1. 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報錯問題

  1. 報錯S_IFDIR undeclaredS_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

  1. 啓動一個默認配置的MQTT服務器
    執行:
# -v表示輸出詳細信息
mosquitto -v

如果出現 Invalid user ‘mosquitto’錯誤,則終端輸入adduser mosquitto,添加該用戶即可。
注:該用戶密碼配置不能爲空,其他配置默認即可。

  1. 指定 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()
})

參考資料

  1. https://blog.csdn.net/houjixin/article/details/79789448
  2. https://blog.csdn.net/aidem_brown/article/details/75136826
  3. https://qtdebug.com/fe-mqtt/
  4. https://blog.csdn.net/qq_28877125/article/details/78325003
  5. https://blog.csdn.net/yannanxiu/article/details/52716997
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章