MQTT——工具mosquitto使用及问题记录


================================================================================================

在CentOS服务器使用Mosquitto安装和部署MQTT

 

之前在Windows服务器上安装部署RabbitMQ3.8,今天又双叒叕换了软件,叫MQTT,首先先了解下软件,RabbitMQ : 是一个支持AMQP协议的消息中间件,用于在多个应用程序之间传递消息。它有助于分发任务,协调过程,实现异步通信,而MQTT : 是一种轻量级的发布/订阅消息协议,用于在网络连接的设备之间传递消息数据。它使用基于可移植的文本协议,可以节约带宽和电力,帮助物联网开发人员在受限网络中运行应用程序。

rabbitmq和mqtt区别

传输协议不同:RabbitMQ采用AMQP协议,而MQTT采用MQTT协议。

投递策略不同:RabbitMQ支持各种投递策略,包括可靠性投递、事务投递、穿透投递、发布订阅等,而MQTT只支持发布订阅模式。

安全性不同:RabbitMQ支持SSL安全传输,而MQTT则不支持。

消息分发能力不同:RabbitMQ支持消息路由、分组多队列分发,MQTT支持多主题广播分发。

性能不同:RabbitMQ的性能要比MQTT高,支持更多的功能,支持更多的消息分发策略。

了解完程序就开始安装吧,在CentOS上安装和部署MQTT通常意味着安装一个MQTT代理(broker),安装步骤如下:

添加EPEL仓库

Mosquitto可能不在CentOS默认的Yum仓库中,因此需要先添加EPEL(Extra Packages for Enterprise Linux)仓库。

代码语言:
sudo yum install -y epel-release

更新Yum包索引: 添加了新的仓库后,更新Yum包管理器的索引。

代码语言:
sudo yum update

在安装过程中会提示:有2个软件包,升级41个软件包等信息,总下载大小:230 M

询问是否需要,[y/d/N]:直接【y】即可,

安装Mosquitto:

使用Yum安装Mosquitto及其客户端。

代码语言: mosquitto-1.6.10-1.el7.x86_64
sudo yum install -y mosquitto

配置Mosquitto

启动Mosquitto服务: 安装完成后,启动Mosquitto服务。

sudo systemctl start mosquitto

设置开机自启: 如果希望在系统启动时自动启动Mosquitto服务,可以设置开机自启。

sudo systemctl enable mosquitto

检查服务状态: 确认Mosquitto服务正在运行。

sudo systemctl status mosquitto

如图“active”表示运行状态,没有问题。

[root@VM-8-12-centos software]# systemctl status mosquitto
● mosquitto.service - Mosquitto MQTT v3.1/v3.1.1 Broker
   Loaded: loaded (/usr/lib/systemd/system/mosquitto.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-09-13 08:20:17 CST; 25s ago
     Docs: man:mosquitto.conf(5)
           man:mosquitto(8)
 Main PID: 28356 (mosquitto)
   CGroup: /system.slice/mosquitto.service
           └─28356 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Sep 13 08:20:17 VM-8-12-centos systemd[1]: Starting Mosquitto MQTT v3.1/v3.1.1 Broker...
Sep 13 08:20:17 VM-8-12-centos mosquitto[28356]: 1726186817: mosquitto version 1.6.10 starting
Sep 13 08:20:17 VM-8-12-centos mosquitto[28356]: 1726186817: Config loaded from /etc/mosquitto/mosquitto.conf.
Sep 13 08:20:17 VM-8-12-centos mosquitto[28356]: 1726186817: Opening ipv4 listen socket on port 1883.
Sep 13 08:20:17 VM-8-12-centos mosquitto[28356]: 1726186817: Opening ipv6 listen socket on port 1883.
Sep 13 08:20:17 VM-8-12-centos systemd[1]: Started Mosquitto MQTT v3.1/v3.1.1 Broker.
 

关闭匿名登录:

编辑【/etc/mosquitto/mosquitto.conf】文件,设置【allow_anonymous false】,

[root@VM-8-12-centos software]# updatedb
[root@VM-8-12-centos software]# locate mosquitto.conf
/etc/mosquitto/mosquitto.conf
/usr/share/man/man5/mosquitto.conf.5.gz

vim /etc/mosquitto/mosquitto.conf

设置认证:使用mosquitto_passwd命令生成用户名和密码,并在mosquitto.conf文件中指定密码文件。

mosquitto_passwd -c /etc/mosquitto/passwd.conf user

注意:-c参数会创建新文件,如果文件已存在,则使用-b参数添加新用户。

用户名 user

将密码配置选项配置如下:

password_file /etc/mosquitto/passwd.conf

# Port to use for the default listener.
port 1883
 

开放端口: MQTT默认使用1883端口,确保防火墙已开放此端口。

firewall-cmd --zone=public --add-port=1883/tcp --permanent
firewall-cmd --reload

在云上也开1883端口


测试MQTT

发布消息:

mosquitto_pub -h localhost -t test -m "hello world" -u "user" -P "password"

订阅消息:

mosquitto_sub -h localhost -t test -u "user" -P "password"

注意事项

确保在安装和配置过程中遵循官方文档和最佳实践。根据实际需求调整MQTT代理的配置,如端口号、认证方式等。在生产环境中,务必确保MQTT代理的安全性,包括使用强密码、限制访问IP等。

 

https://cloud.tencent.com/developer/article/2445996

========================

 

https://mosquitto.org/download/

mosquitto-2.0.18a-install-windows-x64.exe          16-May-2024 19:12  

================================================================================================

Windows

 

1,Mosquitto 简介

Mosquitto是一款开源消息代理软件,实现了MQTT(Message Queuing Telemetry Transport)协议。Mosquitto提供了一个可靠的消息传输机制,提供轻量级的,支持可发布/可订阅的的消息推送模式,允许设备和应用程序通过发布和订阅消息进行通信,使设备对设备之间的短消息通信变得简单。它支持多种编程语言和平台,并且具有低延迟和高可扩展性的特点。

Mosquitto的一个典型应用案例就是Andy Stanford-ClarkMosquitto(MQTT协议创始人之一)在家中实现的远程监控和自动化。并在OggCamp的演讲上,对MQTT协议进行详细阐述。

Mosquitto的主要特性包括:

1)支持发布/订阅模式:设备可以发布消息到特定的主题,其它设备可以订阅这些主题来接收消息。

2)安全性:支持TLS/SSL加密传输,可以保证消息的安全性。

3)持久化:支持消息的持久化存储,确保即使在断开连接后也能接收到未读消息。

4)认证和授权:可以配置用户认证和访问控制规则,确保只有授权的设备可以发布和订阅消息。

5)集群支持:可以通过配置多个Mosquitto实例来实现高可用和负载均衡。
2,下载Mosquitto

Download | Eclipse Mosquitto

3,安装Mosquitto

双击 mosquitto-2.0.18a-install-windows-x64.exe 进行安装
4,本地使用 Mosquitto

默认按照好的mosquitto只能在本地使用。
如果要在客户端计算机和远程mqtt服务器之间进行mqtt操作(订阅消息,上传消息),需要修改配置文件mosquitto.conf

在本地使用mosquitto,在安装目录中的README.md中有描述

修改配置文件

4.1,本地启动mqtt服务

打开新的cmd

4.2,从本地mqtt服务器订阅消息

打开新的cmd

4.3,本地发送消息到本地mqtt服务器

这块文档上写的不对,会报错。原因是消息必须用"符号包裹,而不是用’符号包裹。
打开新的cmd

这里要注意的是发送消息时的主题,必须和订阅的主题一样才行. e.g. 都是 ‘test/topic’
5,远程使用 Mosquitto

将服务装在远程计算机上,在本地发送mqtt消息
正常用的话,mqtt客户端和mqtt服务器都不在一台计算机上。
默认安装的 mosquitto,是不支持从本地mqtt客户端访问远程mqtt客户端的。

假设远程装了mosquitto的计算机IP为 10.4.22.37

现在远程计算机上安装mosquitto,这个步骤和本地相同。

从本地mqtt客户端访问远程mqtt服务器,需要认证,要配置用户名,口令。
用 mosquitto_passwd.exe 来配置mqtt登陆认证的存根文件,用户名是明文,口令是密文HASH, 防止有人登入mqtt服务器所在物理计算机,看到口令明文。
5.1,修改配置文件

修改配置文件如下:其中端口号1999 可更改,IP等信息亦可更改;

直接用命令行启动
因为安装后的目录需要管理员权限,先用管理员模式启动cmd(假设服务没启动)

5.2,添加用户

.\mosquitto_passwd.exe .\pwfile.example user1

pwfile.example 内容如下:

5.3,mqtt服务器订阅消息

打开新的cmd

5.4,发送消息到mqtt服务器

这块文档上写的不对,会报错。原因是消息必须用"符号包裹,而不是用’符号包裹。
打开新的cmd

6,问题记录
问题1:Error: 由于目标计算机积极拒绝,无法连接。

 解决方法:.\mosquitto.exe 服务未启动
问题2:无法将“mosquitto_sub”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

解决方法:写全命令名

问题3:Error:通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

解决方法:

1)查找被占用的端口

    // 查找使用的端口
    netstat -ano
    // 查找指定的端口
    netstat -ano |findstr 1883

2)停用端口

    // 停用端口
    taskkill -PID 66836 -F
    // 查看占用此端口的进程,在任务管理器中强制结束
    tasklist|findstr 66836



                        
原文链接:https://blog.csdn.net/FREEDOM_X/article/details/139856669

================================================================================================

Windows

 

一、安装

搭建一个mqtt服务器,这里我们采用mosquitto

1、 下载地址:https://mosquitto.org/download/

 

2、 选择windows:https://mosquitto.org/files/binary/win64/mosquitto-2.0.18-install-windows-x64.exe

 

3、 右键安装即可

默认的安装路径在这里:C:\Program Files\mosquitto

 

 

二、修改配置文件

1、 进入mosquitto的安装目录,找到配置文件

 C:\Program Files\mosquitto\ mosquitto.conf

 

2、 修改mosquitto指定的监听端口

 listener 8899

 

 

3、 关闭mosquitto的匿名登录功能

 

allow_anonymous false

 

 

 

4、 修改配置用户的配置文件路径(这里要用绝对路径)

 

password_file D:\other\mosquitto\pwd.emample

 

 

三、启动

1、 进入windows的service。启动mqtt broker服务

 

2、命令行启动:mosquitto.exe -c mosquitto.conf -v

 

四、使用

1、用python写一个订阅者的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import paho.mqtt.client as mqtt
import ssl
 
context = ssl.create_default_context()
# 加载证书
context.load_default_certs()
 
# 将证书转换为常量
cert_data = ssl.DER_cert_to_PEM_cert(context.get_ca_certs()[0])
 
 
broker = '127.0.0.1'
port = 7788
topic = "AIOT"
 
# 当客户端和服务端连接成功后执行的回调函数
def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
 
    # 当连接成功后,客户端订阅一个主题,并消费该主题的消息
    client.subscribe(topic=topic)
 
# 当客户端订阅的主题收到消息的时候执行的回调函数
def on_message(client, userdata, msg):
    # client 那个客户端
    # userdata 用户数据
    # msg 实际的消息对象
    print(msg.topic+" "+str(msg.payload))
 
# 实例化一个客户端,实现mqtt协议版本3.1、3.1.1、5.0的客户端类,是一个主要的与MQTT服务端通信的类
client = mqtt.Client()
 
# 实例化的时候可以传递参数进去
# client_id="",
# 唯一的客户端ip字符串,当前连接mqtt服务器时候使用,如果cliendid长度为0,则会自动随机生产一个clientid,这种情况下,clean_session参数必须是true
 
 
# clean_session=None,
# 决定clint类型的参数,如果为true,当client失去连接时候中间人将删除所有关于这个client的信息,如果为false,则说明这是一个永久的client,当失去连接的时候,发布的消息和队列里的消息
# 都会被保持。
# 注意,当失去连接的时候clinet永远不会抛弃自己需要发布的消息,当调用connetc()/reconnect()会重新发送这些消息
# userdata=None,
 
# 用户定义的任何类型的数据将被传输为userdata,后面可以使用user_data_set()来更新这个参数
# protocol=MQTTv311,
# client使用的mqtt版本
# transport="tcp",
# 设置通信机制,websocket或者tcp、一个是websocket传输,一个tcp传输
# reconnect_on_failure=True
# 连接失败是否重新连接
 
# 客户端绑定回调方法,其实这里定义的很多回调函数
client.on_connect = on_connect
client.on_message = on_message
# client.on_disconnect
#
# client.on_publish
 
 
 
 
# 客户端连接mqtt broker服务器
client.connect(bind_address=broker, bind_port=port, keepalive=60)
# client.connect_async()
 
# 客户端和mqtt broker服务器断开连接
 
client.disconnect()
# 永久执行,保持和mqtt broker服务端的长期通信
client.loop_forever()

  

我们当然也可以用命令行的方式启动订阅者,可以通过help来查询使用方法

 

mosquitto_sub.exe –help

 

2、发布者代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import paho.mqtt.client as mqtt
import time
 
broker = '127.0.0.1'
port = 8899
topic = "AIOT"
 
def on_connect(client, userdata, flags, rc):
    print(f"Connected with result code {rc}")
 
client = mqtt.Client()
client.on_connect = on_connect
client.connect(broker, port, 60)
for i in range(60):
    client.publish(topic, payload=i, qos=0, retain=False)
    print(f"send {i} to a/b{topic}")
    time.sleep(1)
 
client.loop_forever()

  

当然我们可以使用命令行的方式启用生产者,可以通过help来查询使用方法

 

mosquitto_pub.exe –help

 

3、通过证书连接mqtt broker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import paho
import ssl
 
mqttc = paho.mqtt.client.Client('my_client')
...
# 构建一个SSL上下文
SSL_CTX = {
    'ssl_port': 8884,
    'ca': "/ ca.crt",
    'client_cert': '/client/client.crt',
     'client_key':" /client/client.key",
     'cert_reqs': None,
    'tls_version': None,
    'ciphers': None,
    'insecure': False  # 关闭insecure选项
}
# 设置TLS参数
mqttc.tls_set(SSL_CTX['ca'],
              certfile=SSL_CTX['client_cert'],
              keyfile=SSL_CTX['client_key'],
              cert_reqs=SSL_CTX['cert_reqs'],
              tls_version=SSL_CTX['tls_version'],
              ciphers=SSL_CTX['ciphers'])
# ca_certs=None, certfile=None, keyfile=None, cert_reqs=None, tls_version=None, ciphers=None, keyfile_password=Non
# 要求验证服务端证书中域名与mqtt连接创建时输入的broker域名一致
mqttc.tls_insecure_set(SSL_CTX['insecure'])

 

https://www.cnblogs.com/bainianminguo/p/17787925.html

========================

 

 

 

posted @ 2024-09-20 08:11  emanlee  阅读(279)  评论(0编辑  收藏  举报