Advertisement

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

遇到共享库加载错误,请检查以下几点:

  1. 确认动态链接库文件是否存在
  2. 确认指定的动态链接库路径是否正确
  3. 确保所需的共享对象文件存在于相应目录下

【解决方法】——修改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 [[[out、in、both>_qos-level] local-prefix remote-prefix]

设置桥接的客户端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


转载地址:

全部评论 (0)

还没有任何评论哟~