MQTT-java使用说明

article/2025/9/11 22:38:07

MQTT-java使用说明

本文的资料下载:
链接:https://pan.baidu.com/s/1OCfsQ_NqcehKy86kYkA-wg?pwd=1234
提取码:1234

MQTT基本介绍

MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。

特点

  1. 易于实现
  2. 数据传输的服务质量可控
  3. 占用带宽小
  4. 传输数据不可预知
  5. 设备连接状态可知

主要版本

  • MQTT3.1.1(较为通用)
  • MQTT5

发布/订阅特性

  1. 相互独立,不需要知道有几个设备订阅了这个主题。
  2. 空间可分离,只要有互联网或者局域网就可以。
  3. 时间可异步

连接MQTT服务端

客户端发送CONNECT(报文)做请求连接

服务端回复CONNACK确认连接

CONNECT(报文)

名称内容
clientId(distinct)“client-1”
cleanSession(判定是不是一个重要客户端)true
username(可选)“hans”
password(可选)“letmein”
lastWillTopic(可选)“/hans/will”
lastWillQos(可选)2
lastMessage(可选)“unexpected exit”
lastWillRetain(可选)false
keepAlive60

clientId

客户端ID,每个客户端的ID是唯一的(distinct)。

cleanSession

用来标志是不是一个重要的客户端,如果是的话,标志为false。

clean清除,Session回话,就是不保存会话,设置为false,就是保存会话,如果客户端没有确认收到信息,那么就用保存的会话信息继续发送,直到接收成功。

设置为false 的时候,要把Qos>0。

keepAlive

心跳机制

要求客户端定时发送信息给服务端,告诉服务端客户端活着。

单位s,指定时多长时间发送一次“活着的”信息给服务端。

Qos

Qos含义
0At most once,发送一次消息后,就不再关心它有没有发送到对方,也不设置任何重发机制
1At least once,包含了简单的重发机制,Sender发送信息之后等待接收者的ACK,如果没收到ACK则重新发送信息。这种模式能保证信息至少能到达一次,但无法保证消息重复。
2Exactly once,设计了略为复杂的重发和重复消息发现机制,保证消息到达对方并且严格只到达一次。

与计算机网络中的可靠传输和不可靠传输相似。

CONNACK

名称内容
sessionPersent(当前会话)true
returnCode(连接返回码)0

returnCode连接返回码返回值含义

返回码返回码描述
0成功连接
1连接被服务端拒绝,原因是不支持客户端的MQTT协议版本
2连接被服务端拒绝,原因是不支持客户端标识符的编码。 可能造成此原因的是客户端标识符编码是UTF-8,但是服务端不允许使用此编码。
3连接被服务端拒绝,原因是服务端不可用。 即,网络连接已经建立,但MQTT服务不可用。
4连接被服务端拒绝,原因是用户名或密码无效。
5连接被服务端拒绝,原因是客户端未被授权连接到此服务端。

sessionPersent(当前会话)

上次服务器想发给客户端的信息,如果发送给客户端,客户端没有确认或者客户端没有收到,那么这个标志为true。

申请MQTT服务器-EMQX

EMQX免费申请MQTT服务器网址:

https://www.emqx.com/zh/cloud

点免费试用

image-20220327193811163

注册一下

image-20220327193952487

选择基础版,高级版的用数据集成里面的东西需要做VPC链接,比较麻烦。

image-20220327194341947

这些默认就行,自己想换个就换个选项,然后下一步

image-20220327194544942

立即部署

image-20220327194646350

第一次创建的时候,只有左边红框里面的东西,显示正在创建实例,这个过程比较费劲

image-20220327194818620

这个时候可以先来安装一下MQTTX这个软件,这个软件是由EMQX公司开发的

image-20220327195211621

安装的时候,就一直下一步就行,可能会出现电脑警告认为这个是有病毒的软件,忽略就行,没毒。

同时我们还需要安装一下mosquitto。

image-20220327214547548

打开以后是这样的:

image-20220327201322988

创建实例结束后就是这样:

image-20220327195953670

点击它

image-20220327200036205

这里呢,我们看一下这几个的含义

连接地址:这个就是服务器的地址

连接端口:11066(mqtt), 12095(mqtts), 13788(ws), 14120(wss)

mqtt协议,用这个11066(mqtt)

mqtt+TLS,用这个12095(mqtts)

网页端的不加密传输,用这个13788(ws)

网页端的加密传输,用这个14120(wss)

类似于http和https。这几个端口不一定,每个账号自己创建完后的端口号可能不一样,要看自己创建完的是多少。

连接测试MQTT服务器

首先要添加一个认证,就是创建一个用户和密码。这个虽然在协议里面不是必须的,但是在这个服务器里面是必须的。

选左边的认证,然后输入用户名和密码,这里为了测试方便,我设置的用户名是test,密码是123456,然后点添加。

image-20220327201747841

添加完以后:

image-20220327201908502

然后可以做在线调试,选左边的在线调试就可以

image-20220327202120757

连接地址就是创建的服务器地址,不需要手动输入,端口也是选好的mqtt的那个。

然后输入用户名,密码和连接名称,连接名称随便起一个就行,点连接。

image-20220327202407061

这里显示的还有客户端ID,这个需要唯一标识,之前CONNECT(报文)那里提到过。Keepalive是心跳机制里面的每个多少秒发送一次信号,确认客户端还在连接着。

连接后显示如下:

image-20220327212039822

我们将主题设为testtopic/1,Qos为0然后订阅。

image-20220327212212765

下面发布的主题也设为testtopic/1,Qos为0,然后点发布。

image-20220327212302430

右边的是我们发送的,左边的是收到的消息。

这样就测试成功了。

这一段也可以跟着这个官方的B站视频来做,视频链接:

https://www.bilibili.com/video/BV1hi4y1Z7Lr?spm_id_from=333.999.0.0

MQQTX的使用也差不多,输入服务器地址和端口号,用户和密码就能使用。

使用 Java SDK 连接到部署

下载java连接示例代码

文件里面也是有的,在这个压缩包里面,解压以后有个mqtt-client-Java的文件夹,这个就是我们要用的代码。

image-20220327214821622

或者可以从网站上下载https://github.com/emqx/MQTT-Client-Examples

image-20220327214958545

部署的教程,EMQX也提供了一个文档说明,网址如下:

https://docs.emqx.com/zh/cloud/latest/connect_to_deployments/java_sdk.html#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6

image-20220327215203004

我们就直接在intellij IDEA中打开这个项目文件,然后进行配置修改就好。他是用Maven来做的配置,从头开始建,没有Maven的知识,不太容易。

改错

下面这一部分,是根据这个博客

https://blog.csdn.net/u014677702/article/details/86013565

打开以后,会发现有很多的红色报错,点击右上角的项目结构

image-20220327215926064

把java11换成java1.8,然后确定就好了。

image-20220327220106346

然后在SampleCallback这个里面

image-20220327220234531

这里根据提示,改一下就行。

image-20220327220335778

然后,安装一下Maven,下面这些按照这个博客安装的

https://blog.csdn.net/weixin_42893085/article/details/105539472

下载安装maven:

http://maven.apache.org/download.cgi

image-20220327222112240

下载这个,或者我在文件夹里面也放了这个包

image-20220327222202732

把它解压到C盘、D盘等盘里面就行。

这里我就放到了D盘

然后配置环境变量,右击此电脑,点属性

image-20220327222337214

然后划到底,打开高级系统设置

image-20220327222513167

打开环境变量

image-20220327222540470

在这里新建一个

image-20220327222655107

变量名为

MAVEN_HOME

变量值为

自己解压的文件夹目录(我的是D:\apache-maven-3.8.5)

目录下面需要有bin文件夹

image-20220327222824827

输入完成,确认。

image-20220327222926992

然后在Path这个里面选择编辑

image-20220327223152686

新加入一条记录

%MAVEN_HOME%\bin

image-20220327223305794

全部确定退出环境变量设置后,进行测试,WIN+R,输入cmd,打开终端。

echo %JAVA_HOME%
mvn -version

image-20220327223555035

这样Maven已经在计算机上安装好了

希望更改Maven在本地存放依赖地址的,看下面这个视频更改,不改的话,默认存放在C盘,不怎么使用的话,放C盘也行。

https://www.bilibili.com/video/BV1Fz4y167p5?p=5

然后配置intellij,让intellij知道Maven这个东西。下面操作是根据这个博客来的:

https://blog.csdn.net/lyg9966/article/details/105904175

在解压后的文件里面,打开conf,里面有个settings.xml,打开这个文件。

image-20220327224318520

在里面,加入下面这些

 <!-- 更换阿里镜像,加快依赖下载 --><mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>central</name><url>https://maven.aliyun.com/repository/central</url></mirror>

image-20220327224452050

然后在Intellij IDEA设置

image-20220327224659416

在这个地方填入

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true

image-20220327224811303

这个博客里面还说要删除plugin,我这里没有报这个错误,有需要的看原博客。

构建,然后运行就可以。当然要是想要mqtt通信的效果,还需要在代码里面将之前的服务器信息进行配置。

java代码配置mqtt服务

image-20220327225453889

需要配置这几个地方

		String topic = "testtopic/1";//这个是刚才发布的那个话题名String content = "Hello World";//这个是要发送的信息int qos = 2;String broker = "tcp://de1f21c0.cn-shenzhen.emqx.cloud:11066";//服务器地址+端口号String clientId = MqttClient.generateClientId();MemoryPersistence persistence = new MemoryPersistence();MqttConnectOptions connOpts = new MqttConnectOptions();connOpts.setUserName("test");//用户名connOpts.setPassword("123456".toCharArray());//密码

运行以后

image-20220327225720773

在网站里面查看或者在MQTTX中订阅了这个话题的话,就能看到

image-20220327225814260

image-20220327230016156

MQTT-java模拟单车扫码开锁

在文件夹里面有源代码mqtt-java-bic-phone

image-20220327233047407

直接用Intellij打开就行。这是代码结构:

image-20220327230354006

这里面实现了模拟手机和单车两个终端,手机发送SendJson的请求,然后服务器使用EMQX里面数据集成里面消息重新发布功能,

image-20220327230507670

在这里面设置规则

SELECTpayload.bicid as bicid,    payload.bicstate as bicstate,    payload.lockstate as lockstate,    payload.request as request,    payload.userid as userid
FROM"testtopic/3"
WHEREbicstate = trueand lockstate = falseand request = 1

当bicstate的状态为true(车是好的),lockstate为false(车锁关着),request为1(请求开锁)的时候,就对testtopic/4发送RecJson格式的信息。

image-20220327231410745

发送车子ID,用户ID和开锁请求lock为true,来请求车子开锁。

{"bicid":"${bicid}","userid":"${userid}","lock":"true"}

image-20220327231434010

这些怎么配置,详情见帮助里面的数据集成里面的规则管理

https://docs.emqx.com/zh/cloud/latest/rule_engine/rules.html#%E5%88%9B%E5%BB%BA%E8%A7%84%E5%88%99

image-20220327231558976

注意:我们这里用的不是专业版,而是基础版,所以不需要进行VPC设置。

通过规则设置,简单的实现了服务器处理数据,并根据数据处理结果进行数据转发,发送不同数据的操作。

当车子收到开锁请求,并且开锁以后,对testtopic/3发送”锁已打开“,这时手机就会收到这条信息,知道锁已打开。

image-20220327232102304

先运行MqttRec(模拟单车)再运行MqttSample(模拟手机),就会看到下面的结果。

image-20220327232338443

image-20220327232454862

有时候运行的时候,会显示上次已经发送接收到了的信息,这个可能是因为qos的设置问题,具体原因不清楚。

所有代码都有注释,具体代码实现请看文件夹里面的代码。


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

相关文章

MQTT服务器的搭建与MQTT客户端的使用

目录 一、MQTT服务器&#xff08;emqx&#xff09;搭建1、下载 MQTT Broker2、下载完成后&#xff0c;解压的目录内容如下&#xff1a;3、进入 bin目录下4、直接在当前目录下输入cmd5、启动 emqx6、重置Dashboard 密码7、输入账号密码进入MQTT服务器控制台8、正常登录的界面如下…

Android+MQTT(Android APP 连接至MQTT服务器)

这段时间因为毕设的需求&#xff0c;接触学习了一下用Android app连接MQTT服务器&#xff0c;然后对下位机&#xff08;STM32/ESP8266&#xff09;进行数据通讯的一个小设计&#xff0c;本篇文章介绍appMQTT服务器这一段。 实现原理&#xff1a; 这里设计的是一个监测控制智能…

MQTT:windows最简单搭建mqtt服务端及本地客户端测试

一、mqtt服务端搭建 推荐使用emq的开源服务端emqx&#xff0c;目前是使用最广泛的mqtt服务端。 github上下载地址为https://github.com/emqx/emqx/releases&#xff0c;当前最新windows版本是 emqx-windows-4.3.6.zip。 1.运行服务端 下载完解压缩出来&#xff0c;在bin目…

springboot 整合 mqtt

springboot 整合 mqtt 最近由于iot越来越火, 物联网的需求越来越多, 那么理所当然的使用mqtt的场景也就越来越多, 接下来是我使用springboot整合mqtt的过程, 以及踩过的一些坑. mqtt服务器使用的是 EMQX, 官网 : 这里 搭建的时候如果你使用的是集群 记得开放以下端口: 好了, …

Springboot实现MQTT通信

目录 一、MQTT简介1、MQTT协议2、MQTT协议特点 二、MQTT服务器搭建三、使用Springboot整合MQTT协议1、在父工程下创建一个Springboot项目作为消息的提供者1.1 导入依赖包1.2 修改配置文件1.3 消息发布者客户端配置1.4 消息发布客户端回调1.5 创建控制器测试发布信息 2、在父工程…

一步一步来:MQTT服务器搭建、MQTT客户端使用

物联网应用如火如荼&#xff0c;本文就物联网应用中最受青睐的协议 MQTT相关测试工具的使用进行简单说明。 希望此文能给需要用到的朋友一些微薄的帮助…… 一、MQTT服务器&#xff08; emqx &#xff09;搭建 1. 下载服务器MQTT Broker 从 https://www.emqx.io/cn/mqtt/public…

【MQTT基础篇(三)】连接MQTT服务端

文章目录 连接MQTT服务端1 CONNECT – 连接服务端1.1 clientId – 客户端ID1.2 cleanSession – 清除会话1.3 keepAlive – 心跳时间间隔 2 CONNACK – 确认连接请求2.1 returnCode – 连接返回码2.2 sessionPresent – 当前会话 连接MQTT服务端 MQTT客户端之间要想实现通讯&am…

MQTT介绍与使用

目录 一、MQTT简介 二、特性 三、实现方式   四、MQTT的搭建&#xff08;ubuntu&#xff09; 五、MQTT权限配置 六、MQTT实现&#xff08;Java语言&#xff09; 正文 物联网是新一代信息技术的重要组成部分&#xff0c;也是“信息化”时代的重要发展阶段。其英文名称是&am…

什么是MQTT

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

设备分配与spooling技术详解

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

SPOOLing和虚拟化

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

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

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

题目SPOOLing系统的设计与实现

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

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

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

Mysql的浮点精确度

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

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

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

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

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

关于JavaScript精确度问题

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

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

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

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

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