mqtt基于paho的消息订阅接收的JAVA代码

2024-02-12 20:18

本文主要是介绍mqtt基于paho的消息订阅接收的JAVA代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看到网上的部分代码,对于订阅主题后,使用mqttCallBack接口来接收消息,虽然这种方法也可以接收到消息,但是mqtt Paho提供了正规的方法去接收消息,这里分享一下自己的demo。

使用callback接口订阅类:


import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
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;import edu.jia.pub.Publish;public class Subscribe {public static final String HOST = "tcp://116.196.99.111:1883";public static final String TOPIC = "topic";private static final String clientid = "Client Subscribe";private MqttClient client;private MqttConnectOptions options;private String msg = null;// private String userName = "admin";// private String passWord = "password";// private ScheduledExecutorService scheduler;public MqttClient connect() throws MqttException {// host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存this.client = new MqttClient(HOST, clientid, new MemoryPersistence());// MQTT的连接设置options = new MqttConnectOptions();// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接options.setCleanSession(true);// 设置连接的用户名// options.setUserName(userName);// // 设置连接的密码// options.setPassword(passWord.toCharArray());// 设置超时时间 单位为秒options.setConnectionTimeout(10);// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息 判断客户端是否在线,但这个方法并没有重连的机制options.setKeepAliveInterval(20);// 设置回调this.client.setCallback(new MqttCallback() {public void connectionLost(Throwable cause) {// 连接丢失后,一般在这里面进行重连System.out.println("连接断开,可以做重连");}public void deliveryComplete(IMqttDeliveryToken token) {System.out.println("deliveryComplete---------" + token.isComplete());}public void messageArrived(String topic, MqttMessage message) throws Exception {// subscribe后得到的消息会执行到这里面System.out.println("接收消息的主题 : " + topic);System.out.println("接收消息的质量Qos : " + message.getQos());//msg = new String(message.getPayload());System.out.println(">>>>>>>>>>>>>>>>>>>" + msg);}});// MqttTopic topic = client.getTopic(TOPIC);// setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息// options.setWill(topic, "close".getBytes(), 2, true);this.client.connect(options);return this.client;}public IMqttToken subscribe(MqttClient client) throws MqttException {// 订阅消息int Qos = 2;String topic1 = TOPIC;IMqttToken token = client.subscribeWithResponse(topic1, Qos);String str = new String(token.getResponse().getPayload());System.out.println("============================" + str);return token;}public static void main(String[] args) throws Throwable {System.out.println("下发配置");Thread.sleep(3000);System.out.println("配置已经下发");Thread.sleep(3000);System.out.println("监听回传消息");Subscribe sub = new Subscribe();MqttClient client = sub.connect();Thread.sleep(3000);System.out.println("建立连接");IMqttToken token = sub.subscribe(client);if (token.isComplete()) {System.out.println("完成订阅");Publish Publish = new Publish();Publish.setMessage(new MqttMessage());Publish.getMessage().setQos(2);Publish.getMessage().setRetained(true);Publish.getMessage().setPayload("2018/06-------mqtt服务端测试   msg2".getBytes());// 重写publish方法Publish.publish(Publish.getTopic(), Publish.getMessage());Publish.getClient().disconnect();}if (sub.msg == null) {Thread.sleep(3000);if (sub.msg!=null) {System.out.println("====================" + sub.msg);}else {System.out.println("time out ");}}}}

使用subscribe方法接收消息:

package edu.jia.sub;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
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 TestSub {private static int qos = 2;private static String broker = "tcp://116.196.99.111:1883";private static MqttClient connect(String clientId) throws MqttException{MemoryPersistence persistence = new MemoryPersistence();MqttConnectOptions connOpts = new MqttConnectOptions();connOpts.setCleanSession(false);connOpts.setConnectionTimeout(10);connOpts.setKeepAliveInterval(20);MqttClient mqttClient = new MqttClient(broker, clientId, persistence);mqttClient.connect(connOpts);return mqttClient;}public static void sub(MqttClient mqttClient,String topic) throws MqttException{int[] Qos  = {qos};String[] topics = {topic};mqttClient.subscribe(topics, Qos);}private static void runsub(String clientId, String topic) throws MqttException{MqttClient mqttClient = connect(clientId);if(mqttClient != null){sub(mqttClient,topic);}mqttClient.subscribe(topic,2, new IMqttMessageListener() {@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {// TODO Auto-generated method stubSystem.out.println(new String(message.getPayload()));}});}public static void main(String[] args) throws MqttException{runsub("testSub", "test");}
}

测试:在远程主机,开启mqtt服务:mosquitto -c /etc/mosquitto/mosquitto.conf

mostuitto_pub -p 1883 -q 2 -t "test " -m "test ---- ok " 

多说几句:subscribe提供了三个重载方法,大家可以根据自己的需要选择需要的重载函数,如果对于listener要求比较高的话,可以将内部类单独写出来继承接口即可。

这篇关于mqtt基于paho的消息订阅接收的JAVA代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703503

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入