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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2