MQTT与EMQ

news2024/11/17 20:48:53

文章目录

  • 1 MQTT协议与EMQ中间件
    • 1.1 物联网消息协议MQTT
      • 1.1.1 什么是MQTT
      • 1.1.2 MQTT相关概念
      • 1.1.3 消息服务质量QoS——信息的可靠投递
        • 1.1.3.1 QoS0——消息服务质量为0,消息发送至多一次
        • 1.1.3.2 QoS1——消息发送至少一次
        • 1.1.3.3 QoS2——消息发送仅一次
        • 1.1.3.4 不同情况下客户端收到的消息QoS
      • 1.1.4 topic通配符匹配规则
        • 1.1.4.1 层级分隔符:/
        • 1.1.4.2 多层通配符:#
        • 1.1.4.3 单层通配符:+
      • 1.1.5 MQTT优点
    • 1.2 物联网消息中间件EMQX
      • 1.2.1 什么是EMQX
      • 1.2.2 EMQ环境安装——基于Docker
      • 1.2.3 EMQ客户端
        • 1.2.3.1 EMQDashboard
        • 1.2.3.2 EMQTTX
      • 1.2.4 延迟消息
      • 1.2.5 共享订阅
        • 1.2.5.1 不带群组的共享订阅
        • 1.2.5.2 带群组的共享订阅
    • 1.3 Eclipse Paho
      • 1.3.1 Eclipse Paho是什么
      • 1.3.2 Eclipse Paho快速入门
        • 1.3.2.1 集成Eclipse paho
        • 1.3.2.2 发布消息到EMQ
        • 1.3.2.3订阅消息

1 MQTT协议与EMQ中间件

1.1 物联网消息协议MQTT

1.1.1 什么是MQTT

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议):其时基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议。
在这里插入图片描述

客户端服务端(消息代理Broker)
发布其他客户端可能会订阅的消息接收来自客户端的网络连接
订阅其他客户端发布的消息接收客户点发布的应用消息
退订或删除应用程序的消息处理来自客户端的订阅和退订请求
断开与服务器的连接向订阅的客户转发应用和程序消息

1.1.2 MQTT相关概念

MQTT常用方法解释
CONNECT客户端连接到服务器
CONNACK连接确认
PUBLISH发布消息
PUBACK发布确认
PUBREC发布的消息已接收
PUBREL发布的消息已释放
PUBCOMP发布完成
SUBSCRIBE订阅请求
SUBACK订阅确认
UNSUBSCRIBE取消订阅
UNSUBACK取消订阅确认
PINGREQ客户端发送心跳
PINGRESP服务端心跳响应
DISCONNECT断开连接
AUTH认证

1.1.3 消息服务质量QoS——信息的可靠投递

MQTT协议中规定了消息服务质量(QoS),其保证了在不同网络环境下信息传递的可靠性。MQTT设计了QoS0、QoS1、QoS2三个QoS等级。

QoS等级说明注意
QoS0消息最多传递一次消息发布完全依赖底层TCP/IP网络,会发生消息丢失,消息不会被接收端应答,也不会被发送者存储再发送,称之为“即发即弃
QoS1消息至少传递一次
QoS2消息传递一次

1.1.3.1 QoS0——消息服务质量为0,消息发送至多一次

消息服务质量为0(QoS0)消息发送至多一次,消息发布完全依赖底层TCP/IP网络,会发生消息丢失,消息不会被接收端应答,也不会被发送者存储再发送,称之为“即发即弃

在这里插入图片描述

1.1.3.2 QoS1——消息发送至少一次

消息服务质量为1(QoS1)消息发送至少一次确保消息送达,但可能发生消息重复投递,发送者会存储消息直到接收者反馈回Puback(发布确认)格式的应答确认

在这里插入图片描述

1.1.3.3 QoS2——消息发送仅一次

消息服务质量为2(QoS2)消息发送仅一次确保消息到达一次,他将相应的处理Publish(发布)消息,并通过Pubrec(发布收到)向发送方确认。

在这里插入图片描述

1.1.3.4 不同情况下客户端收到的消息QoS

发布消息的QoS主题订阅的QoS接收消息的QoS
000
010
020
121
211
222

总结由上表得出:若,发布的消息QoS为m,主题订阅的消息QoS为m,接收消息的QoS为h时:

  • ① 若m=0或n=0,则h=0;
  • ② 若0<m< n ,则h=n;
  • ③ 若0<n<m,则h=n。

1.1.4 topic通配符匹配规则

1.1.4.1 层级分隔符:/

层级分隔符 / :用来分割主题树的每一层,为主题(Topic)空间提供分等级结构,适用于:当两个通配符在一个主题中出现的时候。
例如:love/you/with/all/my

1.1.4.2 多层通配符:#

多层通配符 # :多层通配符表示≥0的层次。因此,love/#也可以匹配到单独的love,此时#代表love后边没有的0层。
注意:多层通配符必须是主题树最后一个字符,例如:love/#可以匹配到love,但是love/#/with是无效的

1.1.4.3 单层通配符:+

单层通配符 + :只匹配一层,例如:love/you/#匹配love/you/with,但是不能匹配love/you/with/all,他只额能通配一个字符。

1.1.5 MQTT优点

① 精简,不添加冗余功能;② 发布/订阅模式,方便消息在传感器间传递,客户端与服务端完成解耦;③ 动态创建主题(不需要预先创建主题),零运维成本。④支持连续的会话保持和控制(心跳检测);⑤ 提供服务质量(quality of service level:QoS)管理;⑥ 不强求传输数据格式与类型。

1.2 物联网消息中间件EMQX

1.2.1 什么是EMQX

EMQ X Broker 是基于高并发的Erlang/OTP语言平台开发,支持百万级连接与分布式集群架构,基于MQTT协议的消息服务器。
参考EMQX官网
在这里插入图片描述

EMQX特点:

  • ① 基于MQTT协议实现得开源消息中间件,②支持桥接和共享订阅,③中国本地技术支持服务。

1.2.2 EMQ环境安装——基于Docker

 docker pull emqx/emqx:v4.1.0
 docker run -tid --name emqx -p 1883:1883 -p 8083:8083 -p 8081:8081 -p 8883:8883 -p 8084:8084 -p 18083:18083  emqx/emqx:v4.1.0

1.2.3 EMQ客户端

1.2.3.1 EMQDashboard

MQTT X 是 EMQ 开源的一款优雅的跨平台 MQTT 5.0 桌面客户端

1.2.3.2 EMQTTX

EMQ X 提供 Dashboard客户端方便用户管理设备与监控相关指标。
默认用户名是 admin,密码是 public

1.2.4 延迟消息

步骤:

  • ①用户需开启模块的emqx_mod_delayed
    在这里插入图片描述
  • ②主题格式:$delayed/{DelayInterval}/{TopicName}

注意
① 使用 $delayed 作为主题前缀的消息都将被视为需要延迟发布的消息。
② {DelayInterval}: 指定该 MQTT 消息延迟发布的时间间隔,单位是秒,允许的最大间隔是 4294967 秒。
③ {TopicName}: MQTT 消息的主题名称。

1.2.5 共享订阅

注意:分组发送是每一个组里选一个,因此十分适合微服务集群。

1.2.5.1 不带群组的共享订阅

格式:$queue/{TopicName}
在这里插入图片描述

EMQ X的共享订阅支持均衡策略配置(默认Random): etc/emqx.con在这里插入图片描述

1.2.5.2 带群组的共享订阅

$share/<group-name>/{TopicName}

在这里插入图片描述

1.3 Eclipse Paho

1.3.1 Eclipse Paho是什么

Eclipse paho 实现mqtt协议java客户端。类似于Mysql于JDBC。

1.3.2 Eclipse Paho快速入门

1.3.2.1 集成Eclipse paho

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.5</version>
</dependency>

1.3.2.2 发布消息到EMQ

@GetMapping("/publish")
public void publish() throws MqttException {

    MqttClientPersistence persistence = new MemoryPersistence();;//内存持久化
    MqttClient client = new MqttClient("tcp://192.168.200.128:1883", "abc", persistence);

    //连接选项中定义用户名密码和其它配置
    MqttConnectOptions options = new MqttConnectOptions();
    options.setCleanSession(true);//参数为true表示清除缓存,也就是非持久化订阅者,这个时候只要参数设为true,一定是非持久化订阅者。而参数设为false时,表示服务器保留客户端的连接记录
    options.setAutomaticReconnect(true);//是否自动重连
    options.setConnectionTimeout(30);//连接超时时间  秒
    options.setKeepAliveInterval(10);//连接保持检查周期  秒
    options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); //版本
    
    client.connect(options);//连接
    client.publish("topic", "发送内容".getBytes(), 2, false);

}

1.3.2.3订阅消息

@GetMapping("/subscribe")
public void subscribe() throws MqttException {

    MqttClientPersistence persistence = new MemoryPersistence();;//内存持久化
    MqttClient client = new MqttClient("tcp://192.168.200.128:1883", "abc", persistence);

    //连接选项中定义用户名密码和其它配置
    MqttConnectOptions options = new MqttConnectOptions();
    options.setCleanSession(true);//参数为true表示清除缓存,也就是非持久化订阅者,这个时候只要参数设为true,一定是非持久化订阅者。而参数设为false时,表示服务器保留客户端的连接记录
    options.setAutomaticReconnect(true);//是否自动重连
    options.setConnectionTimeout(30);//连接超时时间  秒
    options.setKeepAliveInterval(10);//连接保持检查周期  秒
    options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1); //版本

    client.setCallback(new MqttCallbackExtended() {
        @Override
        public void connectionLost(Throwable throwable) {
            System.out.println("连接丢失!");
        }

        @Override
        public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            System.out.println( "接收到消息  topic:" +s+"  id:"+mqttMessage.getId() +" message:"+ mqttMessage.toString());
        }

        @Override
        public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

        }

        @Override
        public void connectComplete(boolean b, String s) {
            System.out.println("连接成功!");
        }
    });
    client.connect(options);//连接
    client.subscribe("test");  //订阅主题

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/611670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

app渗透-常见问题及绕过

app渗透-常见问题及绕过 6.app常见问题和绕过前言6.1反代理操作前言6.1.1判断6.1.2实例演示-探探6.1.3绕过1-r0capture6.1.4绕过2-proxifier6.1.5绕过3-小黄鸟 6.2证书校验前言6.2.1判断6.2.2浏览器校验和解决6.2.3桡过证书单项校验-xp框架6.2.3绕过证书双向校验 6.app常见问题…

TongWeb8适配JakartaEE应用

历史&#xff1a; 2017年 Oracle将Java EE&#xff08;Java SE还自己保留&#xff09;交给开源组织&#xff0c;Eclipse基金会接手。但Oracle不允许开源组织使用Java名号&#xff0c;所以Jakarta EE名称于2018.02.26应运而生。 版本 发布日期 焦点说明 Java EE 8 2017.08 …

30天网络安全从入门到精通?

前言 毫无疑问&#xff0c;网络安全是当下最具潜力的编程方向之一。对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握网络安全看似是一件十分困难的事。至于一个月能不能学会网络安全&#xff0c;这个要看个人&#xff0c;对于时间管理不是很高的&#xf…

花3个月面过阿里测开岗,拿个25K不过分吧?

计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在一家初创…

南山村又一个旧改项目即将开工建设,桂庙新村城市更新单元。

5月22日&#xff0c;深圳市南山区城市更新和土地整备局发布关于粤海街道桂庙新村城市更新单元项目实施主体确认的公示。 根据公告&#xff0c;该项目实施方式为与权利主体签订搬迁补偿协议&#xff0c;补偿方式为产权置换和货币补偿相结合&#xff0c;已完成100%签约&#xff0…

【Linux】Nginx编译安装及系统服务添加

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 一、关于 NginxNginx和Apache的差异Apache的优势Nginx的优势 二. 编译安装Nginx服务1.关闭防火墙2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.检查、启动、重启、…

mac电脑git clone项目时报错证书过期和权限被拒绝

mac电脑使用git clone命令克隆项目时&#xff0c;一开始一直提示证书过期 SSL certificate problem: certificate has expired 执行以下代码关掉验证后&#xff0c;解决了这个问题 找到git目录 Git\git-cmd输入命令跳转到bin目录&#xff0c;cd bin输入命令运行git.exe执行关…

2023网安164道面试题(附答案)

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享两份网络安全工…

回归模型评价指标R2_score

搞清楚R2_score计算之前&#xff0c;我们还需要了解几个统计学概念。 若用 y i y_i yi​表示真实的观测值&#xff0c;用 y ˉ \bar{y} yˉ​表示真实观测值的平均值&#xff0c;用 y i ^ \hat{y_i} yi​^​表示预测值,则&#xff1a; 回归平方和&#xff1a;SSR 即估计值与…

chatgpt赋能python:Python后退对SEO的影响

Python后退对SEO的影响 Python作为一种流行的编程语言&#xff0c;在各种应用场景中都有着广泛的应用。但是&#xff0c;对于一些需要考虑SEO优化的网站来说&#xff0c;Python后退往往被认为是一个不利因素。那么&#xff0c;Python后退对SEO究竟有什么影响&#xff0c;我们来…

GS2972(3G-SDI)视频输出驱动调试

GS2972视频输出调试 GS2972的硬件初始化GS2972的驱动时序GS2972的驱动RTL代码GS2972输出彩条GS2972驱动易出bug GS2972的硬件初始化 GS2972是HD-SDI/3G-SDI视频、音频串化器。其使用非常简单&#xff0c;但是要想把该芯片驱动起来&#xff0c;真心不容易。需要了解相关视频标准…

如何打造微信私域?

现如今&#xff0c;微信已经从社交通讯软件&#xff0c;慢慢被默认为常规办公软件&#xff0c;工作沟通、业务洽谈、网络会议等都在微信上进行&#xff0c;完全变成职场首选的社交工具。 然而&#xff0c;由于微信平台的限制&#xff0c;很多企业在微信私域营销方面遇到了很多…

2023年最佳AI文案神器Top 8

无论你是否准备好&#xff0c;它们都已经来了。如果你知道如何使用它们&#xff0c;AI文案工具可以成为你的新朋友。 现在AI文案工具无处不在&#xff0c;眼花缭乱&#xff0c;从内容生成器到电子商务聊天机器人。原因很简单&#xff1a;AI可以节省大量时间和金钱。这是我们都喜…

2018 年一月联考逻辑真题

2018 年一月联考逻辑真题 三、逻辑推理&#xff1a;第 26-55 小题&#xff0c;每小题 2 分&#xff0c;共 60 分。下列每題给出的A.、 B.、C.、D.五个选项中&#xff0c;只有一项是符合试题要求的。请在答题卡上将所选项的字母涂黑。 真题&#xff08;2018-26&#xff09;-翻译…

5年软件测试工程师工作感悟,谁还能“点点点”一辈子呢?

经常都有人问我软件测试前景怎么样&#xff0c;每年也都帮助很多朋友做职业分析和学习规划&#xff0c;也很欣慰能够通过自己的努力帮到一些人进入到大厂。 2023年软件测试行业的发展现状以及未来的前景趋势 最近很多测试人在找工作的时候&#xff0c;明显的会发现功能测试很…

JAVA开发(神乎其神的区块链技术之数据上链)

这是我第二遍写关于区块链的博文&#xff0c;前一篇文章《神乎其神的区块链概念和技术》主要介绍区块链的由来和基本概念。因为博主最近在做一个区块链项目&#xff0c;所以有时候也遇到一些概念性的知识需要去理解&#xff0c;比如数据的上链。谈到数据上链&#xff0c;我们先…

【Linux】Nginx 优化与防盗链

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 优化与防盗链 一、隐藏版本号方法一&#xff1a;修改配置文件方式方法二&#xff1a;修改源码文件&#xff0c;重新编译安装 二、修改用户与组三、缓存时间四、日志切割…

前端自动化测试基础概念与方案

测试的类型 常见的测试类型主要有以下几种&#xff1a; 单元测试&#xff1a;验证独立单元是否能正常工作集成测试&#xff1a;验证多个单元协同工作端到端测试&#xff1a;从用户角度以机器的方式在真实浏览器环境验证应用交互快照测试&#xff1a;验证程序的UI变化 单元测…

Bert+FGSM中文文本分类

我上一篇博客已经分别用BertFGSM和BertPGD实现了中文文本分类&#xff0c;这篇文章与我上一篇文章BertFGSM/PGD实现中文文本分类&#xff08;Loss0.5L10.5L2)_Dr.sky_的博客-CSDN博客的不同之处在于主要在对抗训练函数和embedding添加扰动部分、模型定义部分、Loss函数传到部分…

消费全返系统开发模式,是一种怎样的营销工具?

消费返利其实就是通过将消费者的部分或全部消费金额折返的方式&#xff0c;来刺激消费者二次乃至多次购买&#xff0c;返利形式则多种多样&#xff0c;包括现金、礼品卡和奖励积分等。这种模式已经在市场上广泛应用&#xff0c;几乎所有行业包括零售、旅游和餐饮等都在用这种模…