|
@@ -0,0 +1,125 @@
|
|
|
|
+package com.huaxia.imes.mqtt;
|
|
|
|
+
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.eclipse.paho.client.mqttv3.*;
|
|
|
|
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @author zx
|
|
|
|
+ * @since 2024年11月11日
|
|
|
|
+ * MQTT 消息生产者
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+public class MqttProducer {
|
|
|
|
+
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+ String borketUrl = "tcp://117.72.113.54:1883";
|
|
|
|
+ String clientId = "demo_client"+System.currentTimeMillis();
|
|
|
|
+ String subTopic = "TestTopic";
|
|
|
|
+ int Qos = 1;
|
|
|
|
+ String userName = "admin";
|
|
|
|
+ String password = "public";
|
|
|
|
+ // MQTT 连接选项设置连接参数
|
|
|
|
+ MqttConnectOptions options = buildMqttConnectOptions(userName, password);
|
|
|
|
+ // 内存存储
|
|
|
|
+ MemoryPersistence persistence = new MemoryPersistence();
|
|
|
|
+ try {
|
|
|
|
+ // 创建客户端
|
|
|
|
+ MqttClient client = new MqttClient(borketUrl, clientId, persistence);
|
|
|
|
+ // 设置超时时间
|
|
|
|
+ client.setTimeToWait(5000);
|
|
|
|
+ // 设置回调
|
|
|
|
+ client.setCallback(new MqttCallbackExtended() {
|
|
|
|
+ // 连接断开
|
|
|
|
+ @Override
|
|
|
|
+ public void connectionLost(Throwable throwable) {
|
|
|
|
+ log.error("连接断开");
|
|
|
|
+ try {
|
|
|
|
+ log.info("连接断开,正在重连>>>>>>");
|
|
|
|
+ Thread.sleep(5000);
|
|
|
|
+ client.connect(options);
|
|
|
|
+ log.info("重连成功");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("连接断开异常{}", e.getMessage());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 消息到达
|
|
|
|
+ @Override
|
|
|
|
+ public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
|
|
|
|
+ log.info("发送消息内容:" + new String(mqttMessage.getPayload()));
|
|
|
|
+ log.info("消息主题:" + s);
|
|
|
|
+ log.info("消息质量:" + mqttMessage.getQos());
|
|
|
|
+ log.info("消息是否重复:" + mqttMessage.isDuplicate());
|
|
|
|
+ log.info("消息是否已发布:" + mqttMessage.isRetained());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 发布完成
|
|
|
|
+ @Override
|
|
|
|
+ public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
|
|
|
|
+ log.info("发布完成客户端信息:{}",iMqttDeliveryToken.getClient().getClientId());
|
|
|
|
+ }
|
|
|
|
+ // 连接完成
|
|
|
|
+ @Override
|
|
|
|
+ public void connectComplete(boolean b, String s) {
|
|
|
|
+ log.info("连接完成{}",s);
|
|
|
|
+ log.info("b{}",b);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ // 连接
|
|
|
|
+ client.connect(options);
|
|
|
|
+ // 订阅主题
|
|
|
|
+ client.subscribe(subTopic);
|
|
|
|
+ //循环发送消息
|
|
|
|
+ boolean keepSending = true;
|
|
|
|
+ int i = 0;
|
|
|
|
+ while (keepSending) {
|
|
|
|
+ // 控制发送次数
|
|
|
|
+ i++;
|
|
|
|
+ // 发布消息
|
|
|
|
+ MqttMessage message = new MqttMessage(("第" + i + "只杨羊").getBytes());
|
|
|
|
+ // 设置消息质量
|
|
|
|
+ message.setQos(Qos);
|
|
|
|
+ // 发布消息
|
|
|
|
+ client.publish(subTopic, message);
|
|
|
|
+ // 控制发送频率
|
|
|
|
+ Thread.sleep(1000); // 每秒发送一次
|
|
|
|
+ if (i >= 1000) { // 发送 10 次后停止
|
|
|
|
+ keepSending = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // 断开连接
|
|
|
|
+ client.disconnect();
|
|
|
|
+ // 关闭客户端
|
|
|
|
+ client.close();
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("连接异常{}", e.getMessage());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构建连接参数
|
|
|
|
+ *
|
|
|
|
+ * @param userName
|
|
|
|
+ * @param password
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static MqttConnectOptions buildMqttConnectOptions(String userName, String password) {
|
|
|
|
+ MqttConnectOptions connOpts = new MqttConnectOptions();
|
|
|
|
+ // 连接 MQTT Broker 的用户名密码
|
|
|
|
+ connOpts.setUserName(userName);
|
|
|
|
+ connOpts.setPassword(password.toCharArray());
|
|
|
|
+ // 设置是否清除会话
|
|
|
|
+ connOpts.setCleanSession(true);
|
|
|
|
+ //心跳间隔
|
|
|
|
+ connOpts.setKeepAliveInterval(60);
|
|
|
|
+ // 连接超时时间,单位为秒
|
|
|
|
+ connOpts.setConnectionTimeout(30);
|
|
|
|
+ // 是否自动重连
|
|
|
|
+ connOpts.setAutomaticReconnect(true);
|
|
|
|
+ return connOpts;
|
|
|
|
+ }
|
|
|
|
+}
|