以下为本人安装mosquitto作为MQTT中间服务器步骤记录,仅供参考。
Ubuntu 12.04
包括但不限于如下依赖包
1. MQTT(mosquitto)的依赖(使用apt-get 安装)
libssl-dev
uuid-dev
版本 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
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/
下载网站: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
S_IFDIR undeclared
和S_IFREG undeclared
解决办法是修改websocket.c部分源码,如下:
vim src/websockets.c
在 第 45行 (在 #include
#ifndef S_IFDIR
#define S_IFDIR (__S_IFDIR)
#endif
#ifndef S_IFREG
#define S_IFREG (__S_IFREG)
#endif
安装好 mosquitto 后,系统里有几个工具可用了,其中三个是:
mosquitto:mqtt的代理服务器Broker
mosquitto_sub:mqtt的订阅者Subscribe
mosquitto_pub:mqtt的发布者Publish
开启第一个终端,创建代理服务器 Broker
# -v表示输出详细信息
mosquitto -v
如果出现 Invalid user ‘mosquitto’
错误,则终端输入adduser mosquitto
,添加该用户即可。
注:该用户密码配置不能为空,其他配置默认即可。
conf
文件进行启动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()
})