MQTT简介

简述

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议。

安装

检查epel

1
2
3
4
5
## 如下已存在epel源,则不需要安装
➜ yum repolist | grep epel

## 如果不存在,则需要安装 epel
➜ yum -y install epel-release

安装

  • Mac:brew install mosquitto
  • CentOS:yum install mosquitto 启动mosquitto
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ## 启动
    ➜ systemctl start mosquitto
    ## 停止
    ➜ systemctl stop mosquitto
    ## 重新启动
    ➜ systemctl restart mosquitto
    ## 查看运行状态
    ➜ systemctl status mosquitto
    ## 设为开机启动
    ➜ systemctl enable mosquitto

设置账号密码

1
2
3
4
5
6
7
## username1 为你的用户名
➜ mosquitto_passwd -c /etc/mosquitto/passwd username1
## 输入密码,确认密码

## 如果要添加多个用户使用 -b 参数
## 必须在控制台输入明文的密码,且文件不会覆盖之前的
➜ mosquitto_passwd -b /etc/mosquitto/passwd username2 password2

备份配置文件

1
2
cd /etc/mosquitto/
cp mosquitto.conf mosquitto.conf.bak

修改配置文件

1
2
3
4
5
6
# 禁止匿名访问
allow_anonymous false
# 用户及密码存储文件
password_file /etc/mosquitto/passwd
# 端口号
port 1883

重启MQTT


TIPS:

  • 防火墙状态:firewall-cmd --state

  • 防火墙停止:systemctl stop firewalld.service

  • 查看防火墙zone:firewall-cmd --get-active-zones

  • 防火墙永久开放端口:firewall-cmd --zone=public --add-port=1888/tcp --permanent

  • 防火墙重启:firewall-cmd --reload

  • 查看所有打开的端口:firewall-cmd --zone=public --list-ports

  • iptables状态:systemctl status iptables

  • iptables影响mqtt远程连接,直接关闭了:systemctl stop iptables


订阅主题

1
2
3
4
5
6
[root@c7-ehotel-liudf-201 ~]# mosquitto_sub -d -h 192.168.5.201 -p 1883 -u tcl -P tcl801 -t tv/marquee/0440001/103/520012518815
Client mosqsub|30292-c7-ehotel sending CONNECT
Client mosqsub|30292-c7-ehotel received CONNACK
Client mosqsub|30292-c7-ehotel sending SUBSCRIBE (Mid: 1, Topic: tv/marquee/0440001/103/520012518815, QoS: 0)
Client mosqsub|30292-c7-ehotel received SUBACK
Subscribed (mid: 1): 0

解析:

  • -d: debug模式,输出详细的连接以及数据收发过程
  • -h: host
  • -p: port 端口
  • -u: user 用户名
  • -P: possword 密码
  • -t: topic 订阅主题

sending SUBSCRIBE (Mid: 1, Topic: tv/marquee/0440001/103/520012518815, QoS: 0)表示发送订阅请求:

  • Mid是Message Id,从1开始计算,当一个连接发送多条消息时,Mid是递增的。
  • Topic 表示要订阅的主题时topic1。
  • QoS:0指定了QoS等级,默认是0。

发布消息

1
2
3
4
5
$ mosquitto_pub -d -h 192.168.5.201 -p 1883 -u tcl -P tcl801 -t tv/0440001/marquee -m "Hello MQTT"
Client mosqpub|12796-SCNWCL012 sending CONNECT
Client mosqpub|12796-SCNWCL012 received CONNACK (0)
Client mosqpub|12796-SCNWCL012 sending PUBLISH (d0, q0, r0, m1, 'tv/0440001/marquee', ... (10 bytes))
Client mosqpub|12796-SCNWCL012 sending DISCONNECT

解析:

  • -m 发送消息的内容
  • d0表示DUP为0,DUP是是否重复标记,如果是第一次发送消息,则设置为0。如果是重复投递,比如QoS设置为1,客户端发送消息超时后服务器还没有回复,客户端为确保消息能发出去,于是再发一次,这是DUP就设置为1,表明这个消息是重复发送的。
  • q0表示QoS为0。
  • r0表示RETAIN为0。RETAIN意思是是否要求Broker帮我保留这条消息,如果设置为1,则服务器会保留当前消息。当下一次有新的客户端连接并订阅topic1时,服务器自动发送这条保留的消息给客户端。
  • m1表示消息序号,默认从1开始。

接收消息

发布完消息后,再回到之前订阅的终端,会显示接收到的消息。

1
2
Client mosqsub|30443-c7-ehotel received PUBLISH (d0, q0, r0, m0, 'tv/0440001/marquee', ... (10 bytes))
Hello MQTT

第一行显示收到PUBLISH数据包,第二行打印出接收到的数据。