惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
Webroot Blog
Webroot Blog
S
Security Affairs
H
Hacker News: Front Page
TaoSecurity Blog
TaoSecurity Blog
W
WeLiveSecurity
G
GRAHAM CLULEY
T
Tenable Blog
Schneier on Security
Schneier on Security
S
Securelist
Cyberwarzone
Cyberwarzone
P
Privacy International News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Schneier on Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
O
OpenAI News
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
C
Cisco Blogs
T
Threat Research - Cisco Blogs
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
D
DataBreaches.Net
博客园_首页
MyScale Blog
MyScale Blog
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
P
Proofpoint News Feed
J
Java Code Geeks
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈 TypeScript事件派发管理器 - OXOXTECH 牛牛技术客栈 MQTT保留消息的使用方法 - OXOXTECH 牛牛技术客栈 世界工程-港珠澳大桥游 - OXOXTECH 牛牛技术客栈 Golang逃逸分析 - OXOXTECH 牛牛技术客栈 设计模式-享元模式 - OXOXTECH 牛牛技术客栈 牛牛成长记录 - OXOXTECH 牛牛技术客栈 ffmpeg常用命令 - OXOXTECH 牛牛技术客栈 设计模式-外观模式 - OXOXTECH 牛牛技术客栈 设计模式-装饰器模式 - OXOXTECH 牛牛技术客栈 设计模式-桥接模式 - OXOXTECH 牛牛技术客栈 5周年恋爱纪念日 - OXOXTECH 牛牛技术客栈 2024新年快乐,龙腾四海 - OXOXTECH 牛牛技术客栈 迎接新年:除夕的美好时刻 - OXOXTECH 牛牛技术客栈 设计模式-适配器模式 - OXOXTECH 牛牛技术客栈 设计模式-原型模式 - OXOXTECH 牛牛技术客栈 设计模式-建造者模式 - OXOXTECH 牛牛技术客栈 设计模式-工厂模式 - OXOXTECH 牛牛技术客栈 设计模式-单例模式 - OXOXTECH 牛牛技术客栈 SpringBoot在Linux环境下发送163邮件失败(No appropriate protocol (protocol is disabled or cipher suites are inappropriate)) 海与日落 - OXOXTECH 牛牛技术客栈 Swagger比较常用的注解 - OXOXTECH 牛牛技术客栈 猫🐱牛 - OXOXTECH 牛牛技术客栈 2023年最后一个晚霞 - OXOXTECH 牛牛技术客栈 Linux(Centos)部署Nginx教程 - OXOXTECH 牛牛技术客栈 Linux MySQL下载安装详细教程(CentOS版) - OXOXTECH 牛牛技术客栈 JavaFx打包成exe - OXOXTECH 牛牛技术客栈 Flux脚本语言入门教程 - OXOXTECH 牛牛技术客栈 演唱会出图 - OXOXTECH 牛牛技术客栈 Netty TCP解决粘包拆包 - OXOXTECH 牛牛技术客栈 SpringBoot实现订单超时取消的几种方案 - OXOXTECH 牛牛技术客栈 详解Java并发中的各种锁 - OXOXTECH 牛牛技术客栈 SpringBoot集成支付宝支付 - OXOXTECH 牛牛技术客栈 雪花算法:分布式系统唯一ID生成算法 - OXOXTECH 牛牛技术客栈 Java解决空指针的神器Optional - OXOXTECH 牛牛技术客栈 与兴一起 - OXOXTECH 牛牛技术客栈 Java17新特性详解与安装 - OXOXTECH 牛牛技术客栈 Jdk17安装+环境配置详细教程 - OXOXTECH 牛牛技术客栈 孤注一掷 - OXOXTECH 牛牛技术客栈 解决WinSCP经常断线重连 - OXOXTECH 牛牛技术客栈 内存不足导致Tomcat崩溃问题排查与解决办法 - OXOXTECH 牛牛技术客栈 influxDB初识,一个高效的时序数据库 - OXOXTECH 牛牛技术客栈 SpringBoot 服务接口限流方案 - OXOXTECH 牛牛技术客栈 Docker 安装 Portainer - OXOXTECH 牛牛技术客栈 Linux 安装Docker - OXOXTECH 牛牛技术客栈 物料宣传 - OXOXTECH 牛牛技术客栈 Java实现常见的排序算法 - OXOXTECH 牛牛技术客栈 FreeSwitch Windows安装教程 - OXOXTECH 牛牛技术客栈 MQTT单向SSL数据加密 - OXOXTECH 牛牛技术客栈 随性 - OXOXTECH 牛牛技术客栈 mysql报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的解决方案 Git Push项目报 push to origin/master was rejected 错误解决方案 游行记——珠海金沙滩与金湖公园之行 - OXOXTECH 牛牛技术客栈 Tomcat:解决Tomcat启动警告:"无法将资源添加到Web应用程序缓存中....请考虑增加缓存空间" 的问题 - OXOXTECH 牛牛技术客栈 励骏庞都广场,迷一般的皇宫 - OXOXTECH 牛牛技术客栈 Docker 常用命令集合 - OXOXTECH 牛牛技术客栈 ElasticSearch Windows版-安装教程 - OXOXTECH 牛牛技术客栈 Java去除对象中为null的字段 - OXOXTECH 牛牛技术客栈 我和我的青春 - OXOXTECH 牛牛技术客栈 Java实现螺旋矩阵算法: - OXOXTECH 牛牛技术客栈 Java直接内存分配和释放的理解 - OXOXTECH 牛牛技术客栈 FreeSwitch将默认数据库迁移至MySQL - OXOXTECH 牛牛技术客栈 别错过路上的风景,别错过刹那间的深情! - OXOXTECH 牛牛技术客栈 Viewer.js:一款强大的图片预览组件 - OXOXTECH 牛牛技术客栈 Java JDK Proxy和CGLib动态代理示例 - OXOXTECH 牛牛技术客栈 redis常用命令 - OXOXTECH 牛牛技术客栈 SpringBoot查询IP归属地 - OXOXTECH 牛牛技术客栈 Spring 事务失效的六种情况 - OXOXTECH 牛牛技术客栈 #张艺兴每时每刻# - OXOXTECH 牛牛技术客栈 Nginx常用命令及具体应用 - OXOXTECH 牛牛技术客栈
Java使用EMQX实现MQTT通信 - OXOXTECH 牛牛技术客栈
Mr.Potato · 2023-07-07 · via 牛牛技术客栈

Mr.Potato 后端 MQTT, Iot

前言

在上一篇文章 《Java使用modbus4j实现ModbusTCP通信》 中我们介绍了Java与Modbus协议的TCP通信,本文讲解一下如何用Java实现对当下最流行的物联网协议之一的MQTT协议进行通信。

MQTT

MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(loT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

特点:

  • 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
  • 对负载内容屏蔽的消息传输;
  • 使用 TCP/IP 提供网络连接;
  • 有三种消息发布服务质量:
  • 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
  • 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

EMQX

EMQX 是一个「无限连接,任意集成,随处运行」大规模分布式物联网接入平台。

EMQX 企业版提供一体化的分布式 MQTT 消息服务和强大的 IoT 规则引擎,为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业快速构建关键业务的 IoT 平台与应用。附下载地址: https://www.emqx.com/zh/try?product=enterprise  可以自行下载对应版本运行

优势:

  • 海量连接:单节点支持 500 万 MQTT 设备连接,集群可水平扩展至支持 1 亿并发的 MQTT 连接。
  • 高可靠:弹性伸缩,无单点故障。内置 RocksDB 可靠地持久化 MQTT 消息,确保无数据损失。
  • 数据安全:端到端数据加密(支持国密),细粒度访问控制,保障数据安全,满足企业合规需求。
  • 多协议:支持 MQTT、HTTP、QUIC、WebSocket、LwM2M/CoAP 或专有协议连接任何设备。
  • 高性能:单节点支持每秒实时接收、处理与分发数百万条的 MQTT 消息。毫秒级消息交付时延。
  • 易运维:图形化配置、操作与管理,实时监测运行状态。支持 MQTT 跟踪进行端到端问题分析。

Mria 集群架构

支持全新的 Mria 集群架构,在此架构下 EMQX 水平扩展性得到指数级提升,单个集群可以轻松支持 1 亿 MQTT 连接,这使得 EMQX 5.0 成为目前全球最具扩展性的 MQTT Broker

202307071038455881.webp

在构建满足用户业务需求的更大规模集群的同时,Mria 架构还能够降低大规模部署下的脑裂风险以及脑裂后的影响,以提供更加稳定可靠的物联网数据接入服务。

具体可以查看官方文档: https://docs.emqx.com/zh/enterprise/v5.1/deploy/cluster/create-cluster.html

MQTTX

MQTTX 是由 EMQ 开发的一款开源跨平台 MQTT 5.0 桌面客户端,它兼容 macOS,Linux 以及 Windows 系统。MQTTX 的用户界面 UI 采用聊天式设计,使得操作逻辑更加简明直观。它支持用户快速创建和保存多个 MQTT 连接,便于测试 MQTT/MQTTS 连接,以及 MQTT 消息的订阅和发布。

mqttx-gif

主要功能

  • 采用聊天界面设计,使得操作更加简单明了
  • 跨平台兼容,支持在 Windows,macOS,Linux 系统上运行
  • 100% 兼容 MQTT v5.0,v3.1.1 和 v3.1 协议
  • 订阅的 MQTT 主题支持自定义颜色标签
  • 支持单向和双向 SSL 认证,同时支持 CA 和自签名证书
  • 支持通过 WebSocket 连接 MQTT 服务器
  • 支持 Hex, Base64, JSON, Plaintext 等 Payload 格式转换
  • 自定义脚本支持模拟 MQTT 发布/订阅测试
  • 提供完整的日志记录功能
  • 多语言支持:简体中文、英语、日语、土耳其语及匈牙利语 🇨🇳 🇯🇵 🇺🇸 🇹🇷 🇭🇺
  • 自由切换 Light、Dark、Night 三种主题模式

代码实现

以下代码将使用springboot集成

引入maven

 <!-- mqtt -->
 <dependency>
    <groupId>org.fusesource.mqtt-client</groupId>
    <artifactId>mqtt-client</artifactId>
    <version>1.16</version>
 </dependency>
 <dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.2</version>
 </dependency>

config配置文件

新建 config.properties 文件,把连接EMQX的信息写在配置文件里,以便获取。也可以写在项目的yml配置文件里

#用户名
mqtt.username=admin

#连接emqx密码
mqtt.password=xxxxxx
#是否清除会话
mqtt.cleanSession=true
#服务地址
mqtt.serverURI=tcp://192.168.1.22
#端口
mqtt.port = 1883
#客户端id
mqtt.clientId=xxxx
#mqtt.clientId=123456
#订阅topic
mqtt.service.subscribe.topic = xxx/xxx/+,$SYS/brokers/+/clients/+/disconnected,$SYS/brokers/+/clients/+/connected
#发送topic
mqtt.facility.subscribe.topic = xxx/xxx

Service类

新建service核心类,主要用于连接EMQX并注册、订阅。

@Configuration
@EnableScheduling
public class MqttService {
    @Autowired
    @Qualifier("FacilityDataProcess")
    private FacilityDataProcess facilityDataProcess;

    public static final String HOST = ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.serverURI") ;
    public static final String PORT = ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.port") ;
    public static final String TOPIC = ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.service.subscribe.topic")  ;
    private static final String CLIENT_ID = ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.clientId")  ;
    private static final String USER_NAME = ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.username")  ;
    private static final String PASSWORD = ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.password")  ;
    private static final Boolean CLEAN_SESSION = "true".equalsIgnoreCase(ResourceBundleUtil.MQTT_LAMBDA.apply("mqtt.cleanSession"));

    private static MqttClient client;
    private static final Logger log = LoggerFactory.getLogger(MqttService.class);

    /**
     * 构造函数
     * @throws MqttException 异常信息
     */
    public MqttService() throws MqttException {
        // MemoryPersistence设置
        client = new MqttClient(HOST+":"+PORT, CLIENT_ID, new MemoryPersistence());
    }

    @PostConstruct
    public void init(){
    	connect();
    }

    /**
     *  连接EMQ X服务器
     */
    private void connect() {
        log.info("HOST:                           "+HOST);
        log.info("PORT:                           "+PORT);
        log.info("TOPIC:                           "+TOPIC);
        log.info("CLIENT_ID:                           "+CLIENT_ID);
        log.info("USER_NAME:                           "+USER_NAME);

        MqttConnectOptions options = new MqttConnectOptions();
        options.setCleanSession(false);
        options.setUserName(USER_NAME);
        options.setPassword(PASSWORD.toCharArray());
        // 设置超时时间
        options.setConnectionTimeout(20);
        // 设置会话心跳时间
        options.setKeepAliveInterval(30);
        // 重连
        options.setAutomaticReconnect(true);
        // 设置是否清除会话
        options.setCleanSession(CLEAN_SESSION);
        try {
            client.setCallback(new MessageCallback(facilityDataProcess));
            client.connect(options);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void subscribe(){
    	try{
	    	 // 订阅消息
    		String[] topic1 = TOPIC.split(",")  ;
    		int[] qos = new int[topic1.length];
            // 循环将所有主题的Qos设置为1
            Arrays.fill(qos, 1);
	        client.subscribe(topic1, qos);
    	}catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 消息发送
     * @param message byte
     * @param topic 主题
     * @param qos  qos
     */
    public static void sendMessage(byte[] message,String topic,Integer qos){
    	MqttMessage mess = new MqttMessage();
    	mess.setQos(qos);
    	mess.setRetained(false);
    	mess.setPayload(message);
    	try {
			client.publish(topic, mess);
		} catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 消息发送
     * @param message 消息体
     * @param topic 主题
     * @param qos  qos
     */
    public static void sendMessage(String message,String topic,Integer qos){
    	MqttMessage mess = new MqttMessage();
    	mess.setQos(qos);
    	mess.setRetained(false);
    	mess.setPayload(message.getBytes());
    	try {
			client.publish(topic, mess);
		} catch (Exception e) {
            e.printStackTrace();
        }
    }
}



回调消息处理类

新建callback类,这是一个回调类,用于监听异步发生的事件回调,接收消息并处理。

public class MessageCallback implements MqttCallbackExtended {

	private final FacilityDataProcess facilityDataProcess ;

	public MessageCallback(FacilityDataProcess facilityDataProcess) {
		super();
		this.facilityDataProcess = facilityDataProcess ;
	}

	@Override
	/**
	 * 与服务器的连接丢失时,将调用此方法。
	 * @param arg0 :失去连接的原因
	 */
	public void connectionLost(Throwable arg0) {
		System.err.println("断开连接的原因是:"+arg0);
	}

	@SneakyThrows
	@Override
	/**
	 * 在完成消息传递并收到所有确认后调用
	 * @param token :与消息关联的传递令牌
	*/
	public void deliveryComplete(IMqttDeliveryToken token) {
		//   delivery 传送OK
		System.out.print("delivery 传送OK:");
		System.out.println(token.getResponse());
	}

	@Override
	/**
	 * 从服务器收到消息时,将调用此方法
	 */
	public void messageArrived(String topic, MqttMessage message) {
		try{
			//在这里处理设备发过来的消息
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public void connectComplete(boolean arg0, String arg1) {
		// 连接成功后,重新订阅自己的主题
		MqttService.subscribe();
	}
}

最后

一个简易的Java MQTT服务端就搭好了,此时可以启动EMQXMQTTX客户端进行测试。

202307071107059313.webp

说点什么吧...

共 0 条评论