Java:实现MQTT发送消息

本示例为Paho Java客户端,主体实现行情数据推送
Paho Java客户端提供了两个API:MqttAsyncClient提供了一个完全异步的API,通过已注册的回调通知完成活动。 MqttClient是MqttAsyncClient的一个同步包装,其中函数与应用程序同步。

发送消息

import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

@Slf4j
public class MqttClient {

	public static org.eclipse.paho.client.mqttv3.MqttClient mqttClient = null;
	private static MemoryPersistence memoryPersistence = null;
	private static MqttConnectOptions mqttConnectOptions = null;

	private static MqttClient instance = null;

	public static MqttClient getInstance() throws Exception {
		if (instance == null) {
			synchronized (MqttClient.class) {
				if (instance == null) {
					instance = new MqttClient();
				}
			}
		}
		return instance;
	}

	public MqttClient(){
		init("admin");
	}

	public void init(String clientId) {
		//初始化连接设置对象
		mqttConnectOptions = new MqttConnectOptions();
		//初始化MqttClient
		if(null != mqttConnectOptions) {
//			true可以安全地使用内存持久性作为客户端断开连接时清除的所有状态
			mqttConnectOptions.setCleanSession(true);
//			设置连接超时
			mqttConnectOptions.setConnectionTimeout(30);
//			设置持久化方式
			memoryPersistence = new MemoryPersistence();
			if(null != memoryPersistence && null != clientId) {
				try {
					mqttClient = new org.eclipse.paho.client.mqttv3.MqttClient("tcp://47.111.102.176:1883", clientId,memoryPersistence);
				} catch (MqttException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else {

			}
		}else {
			log.error("mqttConnectOptions对象为空");
		}
		//设置连接和回调
		if(null != mqttClient) {
			if(!mqttClient.isConnected()) {
				try {
					log.info("创建连接:" + mqttClient.isConnected());
					mqttClient.connect(mqttConnectOptions);
				} catch (MqttException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}else {
			log.error("mqttClient为空");
		}
	}

	//	关闭连接
	public void closeConnect() {
		//关闭存储方式
		if(null != memoryPersistence) {
			try {
				memoryPersistence.close();
			} catch (MqttPersistenceException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			log.error("memoryPersistence is null");
		}

//		关闭连接
		if(null != mqttClient) {
			if(mqttClient.isConnected()) {
				try {
					mqttClient.disconnect();
					mqttClient.close();
				} catch (MqttException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else {
				log.error("mqttClient is not connect");
			}
		}else {
			log.error("mqttClient is null");
		}
	}

	//	发布消息
	public void publishMessage(String pubTopic,String message,int qos) {
		if(null != mqttClient&& mqttClient.isConnected()) {
			MqttMessage mqttMessage = new MqttMessage();
			mqttMessage.setQos(qos);
			mqttMessage.setPayload(message.getBytes());
			MqttTopic topic = mqttClient.getTopic(pubTopic);
			if(null != topic) {
				try {
					MqttDeliveryToken publish = topic.publish(mqttMessage);
					if(!publish.isComplete()) {
						//log.info("消息发布成功");
					}
				} catch (MqttException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

		}else {
			reConnect();
		}

	}
	//	重新连接
	public  void reConnect() {
		if(null != mqttClient) {
			if(!mqttClient.isConnected()) {
				if(null != mqttConnectOptions) {
					try {
						mqttClient.connect(mqttConnectOptions);
					} catch (MqttException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}else {
					log.error("mqttConnectOptions is null");
				}
			}else {
				log.error("mqttClient is null or connect");
			}
		}else {
			init("admin");
		}

	}
	//	订阅主题
	public void subTopic(String topic) {
		if(null != mqttClient&& mqttClient.isConnected()) {
			try {
				mqttClient.subscribe(topic, 1);
			} catch (MqttException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			log.error("mqttClient is error");
		}
	}


	//	清空主题
	public void cleanTopic(String topic) {
		if(null != mqttClient&& !mqttClient.isConnected()) {
			try {
				mqttClient.unsubscribe(topic);
			} catch (MqttException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			log.error("mqttClient is error");
		}
	}

	public static  void main(String [] args){
		MqttClient mqttClient = new MqttClient();
		mqttClient.publishMessage("marketAll", "12312312312", 1);
	}
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Eclipse Paho Java 客户端库来实现Java多线程通过MQTT发送消息的功能。以下是一个简单的示例代码: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttThread extends Thread { private String topic; private String content; private MqttClient client; public MqttThread(String topic, String content) { this.topic = topic; this.content = content; } @Override public void run() { String broker = "tcp://localhost:1883"; String clientId = "JavaThreadClient"; MemoryPersistence persistence = new MemoryPersistence(); try { client = new MqttClient(broker, clientId, persistence); client.connect(); MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(2); client.publish(topic, message); client.disconnect(); } catch (MqttException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们创建了一个 `MqttThread` 类,它包含了要发送消息的主题和内容。当我们调用 `start()` 方法时,它会连接到本地 MQTT 代理,并将消息发布到指定的主题。请注意,这个示例中使用了 QoS 为 2 的消息发布。 可以通过以下方式来使用这个示例: ```java MqttThread thread1 = new MqttThread("topic1", "message1"); MqttThread thread2 = new MqttThread("topic2", "message2"); thread1.start(); thread2.start(); ``` 这里我们创建了两个 `MqttThread` 实例,并将它们分别启动,从而实现了多线程发送 MQTT 消息的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值