Mosquitto安装和使用
0 前言
MQTT(http://mqtt.org/)是由IBM创建的一个实时通信协议。它专为M2M和物联网场景设计,在资源受限的设备间实现高效的消息传递。 Mosquitto(http://mosquitto.org/)是一款基于MQTT v3.1协议构建的开源消息代理软件,在保障通信安全性的同时提供了简便易用的发布与订阅功能,默认配置即可实现高效的消息推送服务
若初次接触MQTT协议,可先理解以下概念:
MQTT协议特点
MQTT协议特点
MQTT协议特点
MQTT协议特点
MQTT协议角色
MQTT协议角色
MQTT协议消息
MQTT协议消息
MQTT协议消息
【MQTT协议主题】——MQTT中的主题可理解为相同类型或相似类型的消息集合。
1 安装和使用注意点
1.1 安装
截止2015年12月,最新版本为mosquitto-1.4.5
下载源代码包
wget http://mosquitto.org/files/source/mosquitto-1.4.5.tar.gz
解压
tar zxfv mosquitto-1.4.5.tar.gz
进入目录
cd mosquitto-1.4.5
编译
make
安装
sudo make install
1.2 安装注意点
【1】编译找不到openssl/ssl.h
【解决方法】——安装openssl
sudo apt-get install libssl-dev
【2】编译过程找不到ares.h
sudo apt-get install libc-ares-dev
【3】 编译过程找不到uuid/uuid.h
sudo apt-get install uuid-dev
如果uuid-dev无法安装时,则可以尝试以下方法:
wget https://answers.launchpad.net/ubuntu/+archive/primary/+files/util-linux_2.20.1.orig.tar.gz
tar xzvf util-linux_2.20.1.orig.tar.gz
cd util-linux-2.20.1
./configure --without-ncurses
cd libuuid
make
make install
代码解读
当成功后执行mosquitto命令时,默认使用端口号1883。为了调整端口号,在etc/mosquitto/mos quit to mos quit to.conf进行配置。原先并没有 mos quit to confined.example 文件;建议对其进行重命名操作,并将其命名为 mos quit to.conf。
【4】使用过程中找不到libmosquitto.so.1
遇到共享库加载错误,请检查以下几点:
- 确认动态链接库文件是否存在
- 确认指定的动态链接库路径是否正确
- 确保所需的共享对象文件存在于相应目录下
【解决方法】——修改libmosquitto.so位置
创建链接
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
更新动态链接库
sudo ldconfig
【5】make: g++:命令未找到
【解决方法】
安装g++编译器
sudo apt-get install g++
6
6
7
是否开启SSL/TLS支持
#WITH_TLS:=yes
是否开启TLS/PSK支持
#WITH_TLS_PSK:=yes
Uncomment to disable client-to-client threading support.
[WITH_THREADING] = yes
是否采用严格遵循新标准的协议版本?该方案在支持与老版本的兼容性方面存在一定的问题。
#WITH_STRICT_PROTOCOL:=yes
是否开启桥接模式
#WITH_BRIDGE:=yes
是否开启持久化功能
#WITH_PERSISTENCE:=yes
是否监控运行状态
#WITH_MEMORY_TRACKING:=yes
通常情况下,在安装Mosquitto时,默认会要求系统具备OpenSSL支持。若不需配置SSL相关功能,则应在配置文件(config.mk)中禁用WITH_TLS和WITH_TLS_PSK选项。通过执行make install命令完成安装流程。完成后可以在启动后的系统命令行界面中发现mosquitto、mosquitto_passwd、mosquitto_pub和mosquitto_sub四个工具(截图如下)。其中 mosquitto用于启动代理服务;mosquito_passwd负责管理代理使用的密码; mosquitos_pub用于发布消息; mosquitos_sub则用于订阅消息队列。
在完成make安装操作后,
我们需要配置文件的信息如下:
该配置文件位于etc/mosquitto/mosquitto.conf中。
具体内容如下:
=================================================================
General configuration
=================================================================
客户端心跳的间隔时间
#retry_interval 20
系统状态的刷新时间
#sys_interval 10
系统资源的回收时间,0表示尽快处理
#store_clean_interval 10
服务进程的PID
#pid_file /var/run/mosquitto.pid
服务进程的系统用户
#user mosquitto
客户端心跳消息的最大并发数
#max_inflight_messages 10
客户端心跳消息缓存队列
#max_queued_messages 100
指定客户端长连接的超时时间为永不更改 # persistent_client_expiration
=================================================================
Default listener
=================================================================
服务绑定的IP地址
#bind_address
服务绑定的端口号
#port 1883
允许的最大连接数,-1表示没有限制
#max_connections -1
cafile:CA证书文件
capath:CA证书目录
certfile:PEM证书文件
keyfile:PEM密钥文件
#cafile
#capath
#certfile
#keyfile
必须提供证书以保证数据安全性
#require_certificate false
如果require_certificate字段被设置为true,则必须确保use_identity_as_username字段也被设置为true
设置use_identity_as_username字段的值为false.
启用PSK(Pre-shared-key)支持
#psk_hint
SSL/TLS 加密是一种基于 cipher algorithm 的技术
可以通过执行‘openssl ciphers’命令来获取
cipher algorithms
=================================================================
Persistence
=================================================================
消息自动保存的间隔时间
#autosave_interval 1800
消息自动保存功能的开关
#autosave_on_changes false
持久化功能的开关
persistence true
持久化DB文件
#persistence_file mosquitto.db
持久化DB文件目录
#persistence_location /var/lib/mosquitto/
=================================================================
Logging
=================================================================
四种日志输出方式包括:标准输出(stdout)、标准错误(stderr)、系统日志(syslog)以及 topic 日志
none选项表示不记录任何日志信息,并采用该配置后可略微提高系统性能
默认设置为 log_dest 为 none
选择记录的日志级别时可选择以下几种类型:
error级别的日志记录将被发送到指定路径
warning级别则会发送到指定路径
notice级别的也会发送到指定路径
information级别的同样适用
是否记录客户端连接信息
#connection_messages true
是否记录日志时间
#log_timestamp true
=================================================================
Security
=================================================================
客户端ID的前缀限制,可用于保证安全性
#clientid_prefixes
允许匿名用户
#allow_anonymous true
用户/密码文件,默认格式:username:password
#password_file
PSK格式密码文件,默认格式:identity:key
#psk_file
定义模式写入传感器数据
#acl_file
用户和话题权限配置分别如下:
: user
: topic [read|write]
: pattern write sensor/%u/data
ACL权限配置说明
=================================================================
Bridges
=================================================================
支持服务间采用"连接"模式实现互操作性(适用于分布式架构)
connection
address
$topic
设置桥接的客户端ID
#clientid
桥接断开时,是否清除远程服务器中的消息
#cleansession false
是否发布桥接的状态信息
#notifications true
启用桥接模式时,该消息将被发送至指定的话题地址
启用桥接模式时, 该消息将被发送至指定的话题地址
设置桥接的keepalive数值
#keepalive_interval 60
桥接模式,目前有三种:automatic、lazy、once
#start_type automatic
桥接模式automatic的超时时间
#restart_timeout 30
桥接模式lazy的超时时间
#idle_timeout 60
桥接客户端的用户名
#username
桥接客户端的密码
#password
bridge_cafile:连接到远程服务器代理的客户端程序中使用的公钥基础设施(PKI)私钥文件
bridge_capath:连接到远程服务器代理的客户端程序中使用的PKI私钥目录位置
bridge_certfile:连接到远程服务器代理的客户端程序中使用的基于PEM格式的安全参数化表达式文件
bridge_keyfile:连接到远程服务器代理的客户端程序中使用的基于PEM格式的安全密钥文件
bridged_pk certificate file
bridged_pk cert directory
bridged_pk cert file
bridged_pk key file
自己的配置可以放到以下目录中
include_dir /etc/mosquitto/conf.d
一般我们只修改监听端口,CARfile
2 简单测试
完整的一个MQTT实例由三个主要组件构成:代理节点、发布节点以及订阅节点。测试流程主要包含以下几个步骤。
【1】启动服务mosquitto。
【2】订阅者通过mosquitto_sub订阅指定主题的消息。
【3】发布者通过mosquitto_pub发布指定主题的消息。
【4】代理服务器把该主题的消息推送到订阅者。
【测试说明】
测试环境:ubuntu 14.04 虚拟机
在本例中,在线服务提供方、中间代理节点以及客户端订阅方均使用localhost地址;然而,在实际情况中这三类并非同一设备。通过在mosquitto工具中使用--host选项指定hostname参数即可实现这一配置;为了完成这一简化的测试案例,请确保需在Linux系统中开启三个终端窗口分别作为代理服务器运行状态指示器、发布方运行状态指示器以及订阅方运行状态指示器

图1 示例
2.1 启动代理服务
mosquitto -v
【-v】打印更多的调试信息
2.2 订阅主题
mosquitto_sub -v -t sensor
【-t】指定主题,此处为sensor
【-v】打印更多的调试信息
2.3 发布内容
mosquitto_pub -t sensor -m 12
【-t】指定主题
【-m】指定消息内容
2.4 运行结果
当发布者推送消息之后,订阅者获得以下内容
sensor 12
在代理服务器控制台中会显示——连接状态、消息发送以及心跳数据等多种调试信息。借助代理服务器的调试输出工具可以深入分析MQTT协议的相关过程。

图2 代理服务器调试输出
3 总结
通过 Mosquitto 开发一个 MQTT 协议代理服务器(即 Mosquitto 代理),为其未来 MQTT 应用打下基础。本文不深入探讨 MQTT 协议的具体细节,并非要通过一个简明扼要的例子展示如何使用 MQTT 协议。相反,在操作过程中仔细观察并记录疑问是提升理解的有效方法:通过实践操作来掌握该协议的核心逻辑,在进一步阅读其详细说明后就能更好地理解其实质。(即使 MQTT 协议内容不过40多页 yet 初次阅读仍难以完全 grasp 其精髓只能归因于个人智力有限 学术造诣欠佳)
4 参考资料
1
1
2
2
2
3
3
4
4
5
5
6
6
6
6
