MQTT介绍与使用

article/2025/9/11 23:43:29

目录

一、MQTT简介
二、特性
三、实现方式  
四、MQTT的搭建(ubuntu)
五、MQTT权限配置
六、MQTT实现(Java语言)

正文

物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段。其英文名称是:“Internet of things(IoT)”。顾名思义,物联网就是物物相连的互联网。这有两层意思:其一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;其二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信,也就是物物相息。物联网通过智能感知、识别技术与普适计算等通信感知技术,广泛应用于网络的融合中,也因此被称为继计算机、互联网之后世界信息产业发展的第三次浪潮。

而在物联网的应用上,对于信息传输,MQTT是一种再合适不过的协议工具了。

回到顶部
一、MQTT简介
  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级协议,该协议构建于TCP/IP协议之上,MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

回到顶部

二、特性

MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

(1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

(2)对负载内容屏蔽的消息传输。

(3)使用TCP/IP提供网络连接。

主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。

(4)有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。

“至少一次”,确保消息到达,但消息重复可能会发生。

“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

(5)小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。

这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。

回到顶部
三、实现方式  
  实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
  
四、MQTT的搭建(ubuntu)
1、安装必备软件

yum install gcc-c++ cmake openssl-devel -y

2、下载mosquitto
我下载的是1.6.8,因为我尝试了最新版1.6.9,它的包里丢了一个头文件,莫名其妙,然后降了一版 官方地址:https://mosquitto.org/,下载地址:https://mosquitto.org/files/source/ 我们使用wget命令下载新包,或者直接下载然后传入服务器。我是直接装在/root下面的,如有需求自行修改路径。

wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz

3、解压 编译 安装

echo "解压"
tar -zxvf mosquitto-1.6.8.tar.gz
echo "进入mosquitto-1.6.8"
cd mosquitto-1.6.8
echo "编译"
make
echo "安装"
sudo make install

之后会碰到找不到libmosquitto.so.1这个问题,修改链接路径,重新加载动态链接库

sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ldconfig

4、创建配置文件
原始example去掉,此配置文件内容很多,比如端口默认 1883,密码文件位置,监听端口数,绑定网卡,日志记录等等,内容众多需要自行研究。

mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf

5、创建用户组和用户

sudo groupadd mosquitto
sudo useradd -g mosquitto mosquitto -s /sbin/nologin

不创建执行程序没反应,猜测因为配置文件中默认使用user mosquitto。 如果不想创建此用户,可以修改配置文件/etc/mosquitto/mosquitto.conf

# When run as root, drop privileges to this user and its primary
# group.
# Set to root to stay as root, but this is not recommended.
# If run as a non-root user, this setting has no effect.
# Note that on Windows this has no effect and so mosquitto should
# be started by the user you wish it to run as.
#user mosquitto
user root

在这里插入图片描述
6、启动、查看、关闭程序
默认是后台运行,可以ps看下进程,kill关闭

echo "运行程序"
mosquitto -c /etc/mosquitto/mosquitto.conf -d
echo "ps查看"
ps -aux | grep mosquitto
echo "关闭程序"
kill -9 $(pidof mosquitto)

在这里插入图片描述
7、本地简单测试

mosquitto_pub 命令参数说明
-d 打印debug信息
-f 将指定文件的内容作为发送消息的内容
-h 指定要连接的域名 默认为localhost
-i 指定要给哪个clientId的用户发送消息
-I 指定给哪个clientId前缀的用户发送消息
-m 消息内容
-n 发送一个空(null)消息
-p 连接端口号
-q 指定QoS的值(0,1,2)
-t 指定topic
-u 指定broker访问用户
-P 指定broker访问密码
-V 指定MQTT协议版本
--will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
--will-qos Will的QoS值。该参数需要与--will-topic一起使用
--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
--will-topic 用户发送Will消息的topicmosquitto_sub 命令参数说明
-c 设定‘clean session’为无效状态,这样一直保持订阅状态,即便是已经失去连接,如果再次连接仍旧能够接收的断开期间发送的消息。
-d 打印debug信息
-h 指定要连接的域名 默认为localhost
-i 指定clientId
-I 指定clientId前缀
-k keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒。
-q 指定希望接收到QoS为什么的消息 默认QoS为0
-R 不显示陈旧的消息
-t 订阅topic
-v 打印消息
--will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
--will-qos Will的QoS值。该参数需要与--will-topic一起使用
--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使用
--will-topic 用户发送Will消息的topic

打开一个订阅者

mosquitto_sub -t topic

打开一个发布者

mosquitto_pub -t topic -m "发布内容"

在这里插入图片描述
相同topic的双方,发布者pub发送 “发布内容”给订阅者sub

8、修改默认配置
1.关闭匿名用户登录
打开mosquitto.conf文件( /etc/mosquitto/mosquitto.conf ),找到allow_anonymous节点,这个节点作用是,是否开启匿名用户登录。去掉前面的#,改为false。在651行左右
在这里插入图片描述
2.设置用户密码文件路径
找到password_file节点,这个节点是告诉服务器你要配置的用户将存放在哪里。打开此配置并指定pwfile.example文件路径(注意是绝对路径),在669行左右。 password_file /etc/mosquitto/pwfile.example
在这里插入图片描述
3.创建自定义用户
终端输入,最后面的是用户名

mosquitto_passwd -c /etc/mosquitto/pwfile.example username

之后自动弹出密码和确认密码,输入即可。(注意第二次创建用户时不用加 -c 如果加 -c 会把第一次创建的用户覆盖。)
在这里插入图片描述

用户信息存储于 /etc/mosquitto/pwfile.example,对密码进行了加密

在这里插入图片描述
4、重启mosquitto生效

echo "关闭程序"
kill -9 $(pidof mosquitto)
echo "运行程序"
mosquitto -c /etc/mosquitto/mosquitto.conf -d

http://chatgpt.dhexx.cn/article/ZVo8kmkw.shtml

相关文章

什么是MQTT

1、MQTT来龙去脉 1.1 什么是MQTT MQTT(英文全称Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(PUBLISH/SUBSCRIBE)模式的轻量级的物联网通信协议。从这个定义中我们可以总结出四个关键词:消息队…

设备分配与spooling技术详解

5.4 设备分配(重点!!!) 一、设备分配中的数据结构二、设备分配时应考虑的因素三、设备独立性四、设备独占的分配程序五、Spooling技术 一、设备分配中的数据结构 在进行设备分配时,通常都要借助一些表格…

SPOOLing和虚拟化

什么是虚拟化 虚拟化就是无中生有,就是暗度陈仓(狗头保命)。仔细观察整个计算机系统的设计,到处都体现着虚拟化的技术。当然虚拟化就是操作系统设计的要求之一。我们很好理解 CPU 的虚拟化技术,也就是通过进程调度实现…

操作系统 假脱机(Spooling)系统

介绍 通过多道程序技术可将一台物理CPU虚拟为多台逻辑CPU,从而允许多个用户共享一台主机。那么,假脱机技术,则可将一台物理I/O设备虚拟为多台逻辑I/O设备,这样也就允许多个用户共享一台物理I/O设备。 1. 假脱机技术 早期&#…

题目SPOOLing系统的设计与实现

最近刚刚做的一个课程设计,关于SPOOLing的。 一、算法或原理的实现思想 技术原理 SPOOLing技术可将一台物理I/O设备虚拟为多台逻辑I/O设备,同样允许多个用户共享一台物理I/O设备。SPOOLing技术把所有用户进程的输出都送入输出井,然后再由输出…

精确度,准确度,精密度关系

1.精确度,准确度,精密度的关系 三者得关系大体可以理解为,准确度精密度 精确度,准确度反应距离真值得偏差,精密度反应测量得稳定性,精确度反应二者之综合。 三者得主次关系:精密度>准确度 …

Mysql的浮点精确度

1.mysql的用于记录小数的类型有三个float ,decimal 和double他们之间的关系 先创建一个表test都用了float ,decimal 和double 插入一条数据查看发现没有发现精度丢失问题 再插入一条数据,发现精度损失: 查看三个类型的范围: 插入小数的位数多…

验证集精确度和损失同时上升

目录 1. 实验结果2. 分析 1. 实验结果 下图中val_acc,val_loss分别表示验证集精确度和损失;train_acc,train_loss分别表示训练集精确度和损失。验证集精确度一直上升,但是损失在第六个epoch后也开始上升,如何解释&…

JavaScript超大或超小数值精确度丢失解决方案

情景一 接口字段,Number类型数据失真,解决方法可直接让服务端把字段类型改成String类型即可。 情景二 某些特殊场景,需要保留小数点后9位(及其以上),直接调用Number对象自带的toFixed()函数,会出现小数点后数据失真…

关于JavaScript精确度问题

一、js精确度的安全范围是 -2^53 至 2^53 一旦超过这个范围则无法精确表示 1.解决方法 使用第三方包 JSON-Bigint JSONbig.parse() //转换出来的是一个BigNubmer对象 若要使用则用toString()方法 JSONbig.stringify() 2.当axios获取响应数据时自动会将数据JSON.parse()解析为…

【机器学习】准确率、精确度、召回率和 F1 定义

一、说明 数据科学家选择目标变量后 - 例如他们希望预测电子表格中的“列”,并完成了转换数据和构建模型的先决条件,最后步骤之一是评估模型的性能。 二、混淆矩阵的模型 2.1 混淆矩阵 选择性能指标通常取决于要解决的业务问题。假设您的数据集中有 10…

Python计算分类问题的评价指标(准确率、精确度、召回率和F1值,Kappa指标)

机器学习的分类问题常用评论指标有:准确率、精确度、召回率和F1值,还有kappa指标 。 每次调包去找他们的计算代码很麻烦,所以这里一次性定义一个函数,直接计算所有的评价指标。 每次输入预测值和真实值就可以得到上面的指标值&a…

batch_size对精确度和损失的影响

1 问题 在深度学习的学习过程中,模型性能对batchsize虽然没有学习率那么敏感,但是在进一步提升模型性能时,batch_size就会成为一个非常关键的参数。 batch_size对精度和损失的影响研究。 batch_size [,32,64,128,256] 不同batch_…

准度、精度傻傻分不清?

[导读] 做电子产品,常常遇到测量。此时就难免会关注到精度、准度等概念,遇到不少朋友对这两个概念不清楚,今天就来分享一下这两个概念。最近很忙,更的不及时,实在抱歉。也感谢大家不离不弃!对于更文分享这件…

机器学习笔记--classification_report精确度/召回率/F1值

classification_report简介 sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。 主要参数: y_true:1维数组,或标签指示器数组/稀疏矩阵&#xf…

YOLOv5~目标检测模型精确度

还是yolo5的基础啊~~ 一些关于目标检测模型的评估指标:IOU、TP&FP&FN&TN、mAP等,并列举了目标检测中的mAP计算。 指标评估(重要的一些定义) IOU 也称重叠度表示计算预测回归框和真实回归框的交并比,计算公式如下: TP&FP&FN&…

睿智的目标检测20——利用mAP计算目标检测精确度

睿智的目标检测20——利用mAP计算目标检测精确度 学习前言GITHUB代码下载知识储备1、IOU的概念2、TP TN FP FN的概念3、precision(精确度)和recall(召回率)4、概念举例5、单个指标的局限性 什么是AP绘制mAP 学习前言 好多人都想算…

误差与精度

机械专业用于教授学生误差与精度概念的课程叫做《公差与测量》或者叫做《机械精度设计》,而公差或者精度的本质含义就是误差的大小,公差越小,误差越小,精度越高。所以机械专业这门课其本质教授的还是误差理论。 在学校并没有好好学…

层次分析法 AHP

层次分析法(Analytic Hierarchy Process,简称 AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。它是美国运筹学家 T. L. Saaty 教授于上世纪 70 年代初期提出的一种简便、灵活而…

权重计算方法一:层次分析法(AHP)

目录 1.层次分析法原理介绍 2.层次分析法建模步骤 3.案例分析 3.1 题目简述 3.2 确定评价指标,建立层次关系 3.3 构造判断矩阵 3.3.1 标度定义 3.3.2 构造判断矩阵 3.4 一致性检验 3.5 层次总排序 4.代码实现 1.层次分析法原理介绍 关于层次分析法的具体原…