MQTT通讯协议接入

news2024/12/23 17:54:46

1.MQTT协议概述

        MQTT是一种基于发布/订阅模式的轻量级消息传输协议,常用于低带宽、不可靠网络环境下传输消息,适用于物联网设备之间的通信。

1.1 MQTT协议的组件

  • 客户端(Client):连接到MQTT代理服务器的设备(发布者、订阅者)
  • 代理服务器(Broker):负责接收来自客户端的消息并将其转发给订阅该主题的客户端
  • 主题(Topic):消息的分类标识,客户端通过订阅或发布到特定主题来接受或发送消息
  • 消息(Message):客户端通过主题传输的数据负载

        客户端通过TCP/IP连接到代理,通过身份验证保持长连接 

2.MQTT服务器搭建

        用EMQX来搭建服务器

快速开始 | EMQX 4.3 文档icon-default.png?t=N7T8https://docs.emqx.com/zh/emqx/v4.3/getting-started/getting-started.html        下载EMQX

https://www.emqx.com/zh/try?product=brokericon-default.png?t=N7T8https://www.emqx.com/zh/try?product=broker        安装虚拟机(环境:centOS7)

        配置 EMQX Yum 源

curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash

        安装依赖

yum install epel-release -y

yum install -y openssl11 openssl11-devel

        安装 EMQX

sudo yum install emqx -y

        启动 EMQX

sudo systemctl start emqx

        访问管理后台:http://localhost:18083/#/login?to=/dashboard/overview

        (默认用户名:admin 密码:public)

        访问接口文档: http://localhost:18083/api-docs/index.html#

2.1 创建主题

3.使用EMQX服务器

如何在 Java 中使用 MQTT | EMQ本文主要介绍如何在 Java 项目中使用 MQTT,实现 MQTT 客户端与服务器的连接、订阅和收发消息等功能。icon-default.png?t=N7T8https://www.emqx.com/zh/blog/how-to-use-mqtt-in-java

3.1 导入依赖

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

 3.2 创建MQTT连接

        String broker = "tcp://localhost:1883";
        // TLS/SSL
        // String broker = "ssl://broker.emqx.io:8883";
        String username = "emqx";
        String password = "public";
        String clientid = "publish_client";

        MqttClient client = new MqttClient(broker, clientid, new MemoryPersistence());
        MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName(username);
        options.setPassword(password.toCharArray());
        client.connect(options);
  • MqttClient: 同步调用客户端,使用阻塞方法通信。
  • MqttClientPersistence: 代表一个持久的数据存储,用于在传输过程中存储出站和入站的信息,使其能够传递到指定的 QoS。
  • MqttConnectOptions: 连接选项,用于指定连接的参数,下面列举一些常见的方法。
    • setUserName: 设置用户名
    • setPassword: 设置密码
    • setCleanSession: 设置是否清除会话
    • setKeepAliveInterval: 设置心跳间隔
    • setConnectionTimeout: 设置连接超时时间
    • setAutomaticReconnect: 设置是否自动重连

3.3 发布MQTT消息

package io.emqx.mqtt;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class PublishSample {

   public static void main(String[] args) {

       String broker = "tcp://broker.emqx.io:1883";
       String topic = "mqtt/test";
       String username = "emqx";
       String password = "public";
       String clientid = "publish_client";
       String content = "Hello MQTT";
       int qos = 0;

       try {
           MqttClient client = new MqttClient(broker, clientid, new MemoryPersistence());
           // 连接参数
           MqttConnectOptions options = new MqttConnectOptions();
           // 设置用户名和密码
           options.setUserName(username);
           options.setPassword(password.toCharArray());
           options.setConnectionTimeout(60);
      options.setKeepAliveInterval(60);
           // 连接
           client.connect(options);
           // 创建消息并设置 QoS
           MqttMessage message = new MqttMessage(content.getBytes());
           message.setQos(qos);
           // 发布消息
           client.publish(topic, message);
           System.out.println("Message published");
           System.out.println("topic: " + topic);
           System.out.println("message content: " + content);
           // 关闭连接
           client.disconnect();
           // 关闭客户端
           client.close();
      } catch (MqttException e) {
           throw new RuntimeException(e);
      }
  }
}

3.4 订阅MQTT主题

package io.emqx.mqtt;

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class SubscribeSample {
   public static void main(String[] args) {
       String broker = "tcp://broker.emqx.io:1883";
       String topic = "mqtt/test";
       String username = "emqx";
       String password = "public";
       String clientid = "subscribe_client";
       int qos = 0;

       try {
           MqttClient client = new MqttClient(broker, clientid, new MemoryPersistence());
           // 连接参数
           MqttConnectOptions options = new MqttConnectOptions();
           options.setUserName(username);
           options.setPassword(password.toCharArray());
           options.setConnectionTimeout(60);
      options.setKeepAliveInterval(60);
           // 设置回调
           client.setCallback(new MqttCallback() {

               public void connectionLost(Throwable cause) {
                   System.out.println("connectionLost: " + cause.getMessage());
              }

               public void messageArrived(String topic, MqttMessage message) {
                   System.out.println("topic: " + topic);
                   System.out.println("Qos: " + message.getQos());
                   System.out.println("message content: " + new String(message.getPayload()));

              }

               public void deliveryComplete(IMqttDeliveryToken token) {
                   System.out.println("deliveryComplete---------" + token.isComplete());
              }

          });
           client.connect(options);
           client.subscribe(topic, qos);
      } catch (Exception e) {
           e.printStackTrace();
      }
  }
}
  • connectionLost(Throwable cause): 连接丢失时被调用
  • messageArrived(String topic, MqttMessage message): 接收到消息时被调用
  • deliveryComplete(IMqttDeliveryToken token): 消息发送完成时被调用

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

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

相关文章

怎么把flv格式转成mp4?教你四种简单好用的转换方法!

怎么把flv格式转成mp4&#xff1f;FLV文件格式&#xff0c;曾经以其独特的方式在视频传输领域崭露头角&#xff0c;如今却似乎被时代的洪流逐渐淹没。其新颖之处虽然为视频传输界带来了一抹亮色&#xff0c;但随之而来的挑战也不容忽视&#xff0c;首当其冲的便是兼容性问题。由…

HLS入门---流水灯闪烁

文章目录 1.HLS简介2.led闪烁实验2.1 函数撰写 1.HLS简介 HLS&#xff08;High-Level Synthesis&#xff0c;高级综合&#xff09;是一种将高级硬件描述语言&#xff08;如C/C&#xff09;转换为硬件描述语言&#xff08;如Verilog或VHDL&#xff09;的过程。这种技术允许设计…

推荐一款WPF绘图插件OxyPlot

开始 使用 NuGet 包管理器添加对 OxyPlot 的引用&#xff08;如果要使用预发布包&#xff0c;请参阅下面的详细信息&#xff09;向用户界面添加PlotView在代码中创建一个PlotModel绑定到你的属性PlotModelModelPlotView 例子 您可以在代码存储库的文件夹中找到示例。/Source/Ex…

录取查询小程序怎么制作?

招生老师往往需要花费大量的时间和精力去手动整理学生的录取信息&#xff0c;并一一通知学生。那时的录取查询系统&#xff0c;复杂而繁琐&#xff0c;要处理大量的数据&#xff0c;还要确保信息的准确无误和安全。经常为了发布录取结果&#xff0c;不得不加班到深夜&#xff0…

盲盒小程序 跨平台兼容性测试策略:打造无缝体验

在盲盒小程序的开发过程中&#xff0c;跨平台兼容性测试是确保应用在不同设备和操作系统上都能提供无缝体验的重要步骤。本文将探讨一些关键的跨平台兼容性测试策略&#xff0c;以助力开发者打造稳定、流畅的小程序。 一、明确测试目标 在进行跨平台兼容性测试之前&#xff0…

【数据结构 |集合框架、泛型】初始集合框架、时间(空间)复杂度、简单认识泛型

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…

DDei在线设计器-属性编辑器

DDei-Core-属性编辑器 DDei-Core-属性编辑器插件包含了文本、大文本、数值、下拉、单选、勾选以及颜色等属性编辑。 图形和属性共同构成一个完整的定义&#xff0c;属性编辑器就是编辑属性值的控件。当选中图形实例时&#xff0c;属性面板就会展现当前实例的所有属性以及属性编…

JavaScript的面向对象思想及实现

文章目录 深入面向对象编程思想面向过程编程面向对象编程 构造函数原型数组扩展案例 constructor属性使用场景对象原型原型继承原型链 面向对象思想代码实现——模态框封装 深入面向对象 编程思想 面向过程编程 面向过程编程&#xff1a;面向过程就是分析出解决问题所需要的…

2024中国网络安全产品用户调查报告(发布版)

自2020年始&#xff0c;人类进入了21世纪的第二个十年&#xff0c;全球进入了百年未有之大变局&#xff0c;新十年的开始即被新冠疫情逆转了全球化发展的历程&#xff0c;而至2022年3月俄乌战争又突然爆发&#xff0c;紧接着2023年7月“巴以冲突"皱起&#xff0c;世界快速…

Jetson Linux 上安装ZMQ

1. 安装ZMQ 框架 apt-get install libzmq3-dev 2. 或者自己build ZMQ https://github.com/zeromq/libzmq.git 参考官网教程 3. 安装CPPZMQ CPPZMQ 是ZMQ 的友好的C封装&#xff0c;只需要一个zmq.hpp 头文件即可 git clone https://github.com/zeromq/cppzmq.git cd cppz…

LabVIEW进行负载测试

本文介绍了如何使用LabVIEW进行负载测试&#xff0c;通过一个具体案例详细讲解了测试系统的组成、工作原理和实现方法。系统采用先进的硬件和软件架构&#xff0c;结合LabVIEW的强大功能&#xff0c;成功实现了对设备的高效负载测试&#xff0c;确保了系统的可靠性和性能。 项…

【SpringCloud学习笔记】RabbitMQ(上)

1. RabbitMQ简介 官网地址&#xff1a;https://www.rabbitmq.com/ 2. 安装方式 安装前置准备&#xff1a; 此处基于Linux平台 Docker进行安装&#xff0c;前置准备如下&#xff1a; Linux云服务器 / 虚拟机Docker环境 安装命令&#xff1a; docker run \-e RABBITMQ_DEFAU…

养猫发现猫毛过敏?宠物空气净化器真的能拯救猫毛过敏吗?

广东省 猫咪是许多人梦寐以求的伴侣&#xff0c;但对于轻度猫毛过敏和鼻炎患者来说&#xff0c;养猫似乎是个遥不可及的梦想。我常在社交媒体上羡慕地观看朋友们的吸猫日常&#xff0c;却因过敏无法亲自养猫。这种遗憾驱使我寻找解决方案&#xff0c;从研究低过敏猫种到尝试空气…

使用Git进行代码版本管理

目录 1. 简介 2. 管理流程 2.1. 建立清晰的分支策略 2.2. 定期提交与合并 2.3. 使用标签来管理发布版本 2.4. 保持代码库的整洁 2.5. 利用Git钩子和CI/CD集成 3. 实现步骤 3.1. 建立仓库 3.2. 分支管理 3.3. 推送代码 ①首先切换到要 code 的分支&#xff0c;比如 d…

AM273X毫米波演示

介绍 毫米波演示展示了 AM273X SOC 使用毫米波 SDK&#xff08;软件开发工具包&#xff09;中的驱动程序的一些功能。它允许用户指定chirp配置文件并实时显示检测到的对象和其他信息。 以下是此演示功能的高级描述&#xff1a; 能够通过 UART 端口上的命令行界面 &#xff08;…

leetcode刷题-二叉树03

代码随想录二叉树part03|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 代码随想录文档讲解 LeetCode 斜体样式 本题在前一章节层序遍历时已完成。&#xff…

短视频矩阵筷子科技、抖去推、超级编导有那几家源头开发是自己底层框架做的-----

目前这几家都是自己技术团队搭建开发的&#xff0c;每家都有优势劣势产品上基本都已经成熟趋向于优化技术阶段。 云罗---抖去推&#xff1a;*** 将在CAP原则基础上使用分布式架构,对此网站的整体架构采用了基于B/S三层架构模式,将数据层、业务应用层、表现层分开。BS架构B/S&a…

第二届黄河流域团队赛个人wp

个人wp web 两个题都几乎是网上的原题&#xff0c;不想多说了&#xff0c;放个链接&#xff0c;重点记录一下自己第一次遇到的misc 冰蝎流量分析 web1 https://blog.csdn.net/qq_51768842/article/details/125153850 web2 https://blog.csdn.net/m0_73512445/article/detai…

北京医院共享轮椅小程序开发更贴心,更便捷

在大数据不断发展的今天&#xff0c;资源共享已随处可见&#xff0c;小到共享充电宝&#xff0c;共享雨伞&#xff0c;大到共享单车&#xff0c;汽车。这些常用资源的共享&#xff0c;充分实现了有限资源的最大化利用。 如今&#xff0c;众多北京医院&#xff0c;也结合自身实…

TQZC706开发板教程:10G光口arp测试

网盘分享&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1H-_hn1eAi-Byzn-4tcSFKA 提取码&#xff1a;q524 使用前需要设置时钟&#xff0c;调整右下角的拨码开关为↑↓↓↑↑ 从原理图中可以看出设置为156.25MHz&#xff0c;10Gige模式 启动模式设置为JTAG模式&#…