简介

Mosqitto 是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件, 提供轻量级的, 支持可发布/可订阅的的消息推送模式, 使设备对设备之间的短消息通信变得简单, 比如现在应用广泛的低功耗传感器, 手机, 嵌入式计算机, 微型控制器等移动设备.

而消息推送协议 MQTT 是物联网(loT)常用的一种协议, 它的特点有:

  1. 使用发布/订阅消息模式, 提供一对多的消息发布, 解除应用程序耦合.
  2. 小型传输, 开销很小(固定长度的头部是2字节), 协议交换最小化, 以降低网络流量. 这也是它在物联网领域广泛应用的主要原因之一.
  3. 支持三种QoS(Quality of Service,服务质量):
    • “至多一次”, 消息发布完全依赖底层TCP/IP网络. 会发生消息丢失或重复. 这一级别可用于如下情况, 环境传感器数据, 丢失一次读记录无所谓, 因为不久后还会有第二次发送. 这一种方式主要普通APP的推送, 倘若你的智能设备在消息推送时未联网, 推送过去没收到, 再次联网也就收不到了.
    • “至少一次”, 确保消息到达, 但消息重复可能会发生.
    • “只有一次”, 确保消息到达一次. 在一些要求比较严格的计费系统中, 可以使用此级别. 在计费系统中, 消息重复或丢失会导致不正确的结果. 这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送, 确保用户收到且只会收到一次.

下载安装

这里我用的Ubuntu系统, 首先将mosquitto添加到储存库列表

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

再更新软件包

sudo apt-get update

然后安装mosquitto:

sudo apt-get install mosquitto

根据需要确定是否安装命令行客户端(因为mqtt已经有非常多的gui客户端了, 命令行客户端反而显得没那么好用了, 这里我推荐一个 MATTX , 各个平台都能用, 倒是挺方便的):

sudo apt-get install mosquitto-clients

mosquitto详解

mosquitto主要分为几个部分, 分别为 mosquitto(运行服务器), mosquitto.conf(配置文件), mosquitto_passwd(用户配置), aclfile(用户权限配置).

mosquitto

命令

mosquitto [-c config file] [ -d | —daemon ] [-p port number] [-v]

参数:

  • -c config file: 从config文件加载配置. 如果没有给出, 则使用配置文件的默认值.
  • -d 或者 —daemon: 将mosquitto在后台以守护进程的身份运行.
  • -p port number: 指定监听的端口, 默认的端口是1883. 也可以指定监听多个端口.
  • -v: 使用详细日志记录, 也可以在配置文件中设置.

关于重启mosquitto

一般来说, mosquitto是默认开机自动启动的, 可以通过删除/etc/init.d/mosquitto来关闭开机自启.

通常可以用 ps -aux | grep mosquitto 查找 mosquitto 运行的进程, 再用 kill -9 进程号 来关闭mosquitto, 但这很多时候会出现各种问题, 以至于无法关闭. 这时可以用 ‘/etc/init.d/mosquitto stop’来关闭, 或者用’/etc/init.d/mosquitto restart’来实现重启.

mosquitto.conf

主要的设置

  • acl_file file path: 设置访问控制列表文件的路径. 如果定义了该文件,则使用该文件的内容来控制客户端对代理上的主题的访问. 如果定义了此参数,则只有列出的主题才能访问.主题访问权限添加的行格式为:

    topic [read|write|readwrite]
    访问类型由”Read”, “Write” 或 “ReadWrite” 控制. 此参数是可选的, 如果未指定, 则访问权限为读/写. 与订阅中一样, 可以包含 + 或 # 通配符.
    如果允许匿名的话, 第一组主题将应用于匿名客户端.

    user
    指定要控制访问的用户名

    pattern [read|write|readwrite]
    可以使用正则来控制访问的话题, 其中 %c 是匹配客户端的 client id, %u 是匹配客户端的 username.

例如:

1
2
3
4
5
6
7
# 第一行是匿名客户端可以访问的topic, 所有匿名用户都可以订阅话题 topic/anonymous.
topic read topic/anonymous
# 下面是用户admin可以访问的topic, admin可以订阅和发布 topic/ 下所有话题的信息.
user admin
topic readwirte topic/#
# 正则限制, 所有用户都可以在话题 topic/username/data 发布消息.
pattern write topic/%u/data

  • password_file: 用户/密码文件, 默认格式: username:password
  • include_dir /etc/mosquitto/conf.d: 自己的配置可以放到以下目录中
  • allow_anonymous [ true | false ]: 是否允许匿名, 默认是true.
  • allow_duplicate_messages [ true | false ]: 是否允许重复/重叠订阅, 默认是true.
  • allow_zero_length_clientid [ true | false ]: 是否允许零长度客户端id, 默认为true.
  • use_username_as_clientid [ true | false ]: 使用用户名为客户端id, 默认为false.
  • pid_file /var/run/mosquitto.pid: 服务进程的PID.
  • user username: 服务进程的系统用户.
  • port port number: 服务绑定的端口, 默认的是1883
  • retry_interval: 当QoS为1或2的消息已经被发送后, mosquitto在一段时间内仍未接收到客户端的反馈消息, 将重新发送消息. 默认为20秒.
  • max_connections -1: 最大连接数, -1代表不限制.
  • require_certificate false: 必须提供证书以保证数据安全性.
  • cafile: CA证书文件.
  • capath: CA证书目录.
  • certfile: PEM证书文件.
  • keyfile: PEM密钥文件.
  • autosave_interval 1800: 消息自动保存的间隔时间
  • autosave_on_changes false: 消息自动保存功能的开关
  • persistence true: 持久化功能的开关
  • persistence_file mosquitto.db: 持久化DB文件
  • persistence_location /var/lib/mosquitto/: 持久化DB文件目录
  • log_dest none: 4种日志模式: stdout, stderr, syslog, topic, none 则表示不记日志, 此配置可以提升些许性能.
  • log_type error: 选择日志的级别(可设置多项), 包括error, warning, notice, information.
  • connection_messages true: 是否记录客户端连接信息.
  • log_timestamp true: 是否记录日志时间

推荐的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
pid_file /var/run/mosquitto.pid

persistence true

persistence_location /var/lib/mosquitto/

include_dir /etc/mosquitto/conf.d

allow_anonymous false

password_file /etc/mosquitto/pwfile

acl_file /etc/mosquitto/aclfile

mosquitto_passwd

mosquitto_passwd [ -c | -D ] passwordfile username
mosquitto_passwd -b passwordfile username password
mosquitto_passwd -U passwordfile

mosquitto_passwd用于管理mosquitto代理的mqtt服务器的密码文件, 其中username不能包含”:”.

参数:

  • -b: 以批量模式运行. 这允许在命令行中提供密码, 这可以很方便, 但应小心使用, 因为密码将在命令行和命令历史记录中可见.
  • -c: 创建新的密码文件. 如果文件已经存在, 它将被覆盖.
  • -D: 从密码文件中删除指定的用户.
  • -U: 此选项可用于升级/将带有纯文本密码的密码文件升级/转换为使用哈希密码的文件. 它将修改指定的文件, 它无法检测密码是否已经哈希,因此在已经包含哈希密码的密码文件中使用它将根据旧哈希生成新的哈希, 并使密码文件无法使用.
  • passwordfile: 要修改密码的文件.
  • username: 添加/更新/删除的用户名.
  • password: 在批次模式下使用的密码.

例如:
将用户test添加到新的密码文件:
mosquitto_passwd -c /etc/mosquitto/passwd test

从密码文件中删除用户test:
mosquitto_passwd -D /etc/mosquitto/passwd test

aclfile

详见 主要的设置

参考资料

[1]mosquitto
[2]mosquitto.conf
[3]mosquitto_passwd
[4]mosquitto.conf配置参数详细说明