MQTT中间服务器(mosquitto)安装(含cmake和libwebsockets安装)

MQTT中间服务器(mosquitto)安装(含cmake和libwebsockets安装)

    • 测试环境
    • 依赖
    • 安装
      • cmake 安装
      • libwebsockets 安装
      • mosquitto安装
        • 安装mosquitto中,make报错问题
    • MQTT 使用测试
      • 参考资料

以下为本人安装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 这行下面 ) 后,插入如下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

你可能感兴趣的:(物联网学习)