Eclipse Paho MQTT客户端

Eclipse Paho MQTT客户端

在Eclipse Paho MQTT客户端库中,如果你设置了MqttConnectOptionssetAutomaticReconnecttrue,那么在连接丢失时,客户端会自动尝试重新连接。你不需要在connectionLost回调中手动实现重连。

但是,如果你想在连接丢失后立即向"topicA"发送消息,你可以在connectionLost回调中添加发送消息的代码。但是请注意,你需要等待连接重新建立后才能发送消息。以下是一个示例:

import org.eclipse.paho.client.mqttv3._

val brokerUrl = "tcp://localhost:1883"
val clientId = MqttClient.generateClientId()
val client = new MqttClient(brokerUrl, clientId)

val options = new MqttConnectOptions()
options.setAutomaticReconnect(true) // Enable automatic reconnect

client.setCallback(new MqttCallback() {
  override def connectionLost(cause: Throwable): Unit = {
    println("Connection lost, trying to reconnect...")
    while(!client.isConnected) {
      Thread.sleep(1000)
    }
    println("Reconnected, sending message...")
    val topic = "topicA"
    val message = "Hello, MQTT!"
    client.publish(topic, new MqttMessage(message.getBytes))
  }

  override def messageArrived(topic: String, message: MqttMessage): Unit = {
    // Handle incoming messages if needed
  }

  override def deliveryComplete(token: IMqttDeliveryToken): Unit = {
    // Handle delivery confirmation if needed
  }
})

client.connect(options)

在这个示例中,我们在connectionLost回调中添加了一个循环,等待连接重新建立。当连接重新建立后,我们向"topicA"主题发送了一个消息。

请注意,这个示例中的循环可能会阻塞你的程序,你可能需要在实际的应用中使用更复杂的逻辑来处理这种情况。

案例1

package com.hs.fast.test

/**
 * @Title:
 * @BelongProjecet hs_flink_elephant 
 * @BelongPackage com.hs.fast.test
 * @Description:
 * @Copyright time company - Powered By 研发一部
 * @Author: cw
 * @Date: 2023-11-2 10:01
 * @Version V1.0
 *          ssl 认证
 */

import java.util.Properties

import com.hs.fast.bean.MqttConfig
import com.hs.fast.utils.PropertiesLoad2.getAllconf
import com.hs.fast.utils.mqtt.MySslUtil
import javax.net.ssl._
import org.eclipse.paho.client.mqttv3._
import play.api.libs.json.Json

import scala.util.control.Breaks.{break, breakable}

object MqttClientExample4 extends App {
  val clientId = "mqtt-client-1"
  val topic = "topicwg3"
  val ssl_url="ssl://192.168.33.22:8883"

  val getAllconfResult: (String, Properties) = getAllconf
  val props2: Properties = getAllconfResult._2
  lazy val mqttConfig = MqttConfig(
//    props2.getProperty("m2.mqtt.url-ssl"),
    ssl_url,
    props2.getProperty("m2.mqtt.username"),
    props2.getProperty("m2.mqtt.password"),
    props2.getProperty("m2.mqtt.topic1")
  )

//  val r1 = props2.getProperty("m2.mqtt.ca")
//  val r2 = props2.getProperty("m2.mqtt.client")
//  val r3 = props2.getProperty("m2.mqtt.clientKey")

  val r1 = "D:\\360Downloads\\ssl_02\\m2\\ca.pem"
  val r2 = "D:\\360Downloads\\ssl_02\\m2\\client-scala.pem"
  val r3 = "D:\\360Downloads\\ssl_02\\m2\\client-scala.key"

//  val sSLSocketFactory: SSLSocketFactory = SslUtil.getSocketFactory(r1, r2, r3)
  val sSLSocketFactory: SSLSocketFactory = MySslUtil.getSocketFactory(r1, r2, r3)

  val options = new MqttConnectOptions()
  options.setCleanSession(true)
  options.setUserName("admin")
  options.setPassword("admin".toCharArray)
//  设置SSL 认证
  options.setSocketFactory(sSLSocketFactory)
  // 设置超时时间
  options.setConnectionTimeout(30)
  // 设置会话心跳时间
  options.setKeepAliveInterval(20)

  val client = new MqttClient(mqttConfig.url, clientId)
  client.setCallback(new MqttCallback {
    override def connectionLost(cause: Throwable): Unit = {
      println("Connection lost: " + cause.getMessage)
      reconnect()
    }

    override def messageArrived(topic: String, message: MqttMessage): Unit = {
      println("Message received: " + new String(message.getPayload))
    }

    override def deliveryComplete(token: IMqttDeliveryToken): Unit = {
      println("Delivery complete")
    }
  })

  //    重连并重新订阅方法
  def reconnect(): Unit = {
    val maxReconnectAttempts = 3
    val reconnectInterval = 5000 // milliseconds
    var attempt = 1
    while ( {
      attempt <= maxReconnectAttempts
    }) {

      try {
        breakable {
          client.connect(options)
          println("Connection lost, trying to reconnect...")
          while(!client.isConnected) {
//            Thread.sleep(1000)
            Thread.sleep(reconnectInterval)
          }
          println("Reconnected, sending message...")
          val topic = "topicA"
          val message = "Hello, MQTT!"
          client.publish(topic, new MqttMessage(message.getBytes))
//          client.subscribe(topic, 1)
          println("Reconnected to MQTT broker.")
          break
        }
      }
      catch {
        case e =>
          println("Failed to reconnect to MQTT broker: " + e.getMessage)
          e.printStackTrace()
      }
      attempt += 1
    }
  }

  client.connect(options)
  // 循环发送JSON数据
  var counter = 0
  while (true) {
    val json = Json.obj(
      "counter" -> counter,
      "message" -> "Hello MQTT"
    )
    val payload = json.toString().getBytes("UTF-8")
    val message = new MqttMessage(payload)
    client.publish(topic, message)
    println(s"Published message: $json")

    counter += 1
    Thread.sleep(1000) // 每隔1秒发送一次
  }

//  client.subscribe(topic, 1)

  // Wait for messages
  //  Thread.sleep(5000)
  //  client.disconnect()
}

案例2-pub

package com.hs.fast.test

/**
 * @Title:
 * @BelongProjecet hs_flink_elephant 
 * @BelongPackage com.hs.fast.test
 * @Description:
 * @Copyright time company - Powered By 研发一部
 * @Author: cw
 * @Date: 2023-11-2 10:01
 * @Version V1.0
 *          ssl 认证
 */

import java.util.Properties

import com.hs.fast.bean.MqttConfig
import com.hs.fast.utils.PropertiesLoad2.getAllconf
import com.hs.fast.utils.mqtt.MySslUtil
import javax.net.ssl._
import org.eclipse.paho.client.mqttv3._
import play.api.libs.json.Json

import scala.util.control.Breaks.{break, breakable}

object MqttClientPub1 extends App {
  val clientId = "mqtt-client-1"
  val topic = "topicwg3"
  val ssl_url="ssl://192.168.33.22:8883"

  val getAllconfResult: (String, Properties) = getAllconf
  val props2: Properties = getAllconfResult._2
  lazy val mqttConfig = MqttConfig(
//    props2.getProperty("m2.mqtt.url-ssl"),
    ssl_url,
    props2.getProperty("m2.mqtt.username"),
    props2.getProperty("m2.mqtt.password"),
    props2.getProperty("m2.mqtt.topic1")
  )

//  val r1 = props2.getProperty("m2.mqtt.ca")
//  val r2 = props2.getProperty("m2.mqtt.client")
//  val r3 = props2.getProperty("m2.mqtt.clientKey")

  val r1 = "D:\\360Downloads\\ssl_02\\m2\\ca.pem"
  val r2 = "D:\\360Downloads\\ssl_02\\m2\\client-scala.pem"
  val r3 = "D:\\360Downloads\\ssl_02\\m2\\client-scala.key"

//  val sSLSocketFactory: SSLSocketFactory = SslUtil.getSocketFactory(r1, r2, r3)
  val sSLSocketFactory: SSLSocketFactory = MySslUtil.getSocketFactory(r1, r2, r3)

  val options = new MqttConnectOptions()
  options.setCleanSession(true)
  options.setUserName("admin")
  options.setPassword("admin".toCharArray)
//  设置SSL 认证
  options.setSocketFactory(sSLSocketFactory)
  // 设置超时时间
  options.setConnectionTimeout(30)
  // 设置会话心跳时间
  options.setKeepAliveInterval(20)

  val client = new MqttClient(mqttConfig.url, clientId)
  client.setCallback(new MqttCallback {
    override def connectionLost(cause: Throwable): Unit = {
      println("Connection lost: " + cause.getMessage)
      reconnect()
    }

    override def messageArrived(topic: String, message: MqttMessage): Unit = {
      println("Message received: " + new String(message.getPayload))
    }

    override def deliveryComplete(token: IMqttDeliveryToken): Unit = {
      println("Delivery complete")
    }
  })

  //    重连并重新订阅方法
  def reconnect(): Unit = {
    val maxReconnectAttempts = 3
    val reconnectInterval = 5000 // milliseconds
    var attempt = 1
    while ( {
      attempt <= maxReconnectAttempts
    }) {

      try {
        breakable {
          client.connect(options)
          println("Connection lost, trying to reconnect...")
          while(!client.isConnected) {
//            Thread.sleep(1000)
            Thread.sleep(reconnectInterval)
          }
          println("Reconnected, sending message...")
          val topic = "topicA"
          val message = "Hello, MQTT!"
          client.publish(topic, new MqttMessage(message.getBytes))
//          client.subscribe(topic, 1)
          println("Reconnected to MQTT broker.")
          break
        }
      }
      catch {
        case e =>
          println("Failed to reconnect to MQTT broker: " + e.getMessage)
          e.printStackTrace()
      }
      attempt += 1
    }
  }

  client.connect(options)
  // 循环发送JSON数据
  var counter = 0
  while (true) {
    val json = Json.obj(
      "counter" -> counter,
      "message" -> "Hello MQTT"
    )
    val payload = json.toString().getBytes("UTF-8")
    val message = new MqttMessage(payload)
    client.publish(topic, message)
    println(s"Published message: $json")

    counter += 1
    Thread.sleep(1000) // 每隔1秒发送一次
  }

//  client.subscribe(topic, 1)

  // Wait for messages
  //  Thread.sleep(5000)
  //  client.disconnect()
}

案例3-sub

package com.hs.fast.test

/**
 * @Title:
 * @BelongProjecet hs_flink_elephant 
 * @BelongPackage com.hs.fast.test
 * @Description:
 * @Copyright time company - Powered By 研发一部
 * @Author: cw
 * @Date: 2023-11-2 10:01
 * @Version V1.0 MqttClientSub1.scala
 *          ssl 认证
 */

import java.util.Properties

import com.hs.fast.bean.MqttConfig
import com.hs.fast.utils.PropertiesLoad2.getAllconf
import com.hs.fast.utils.mqtt.MySslUtil
import javax.net.ssl._
import org.eclipse.paho.client.mqttv3._
import play.api.libs.json.Json

import scala.util.control.Breaks.{break, breakable}

object MqttClientSub1 extends App {
  val clientId = "mqtt-client-sub1"
  val topic = "topicwg3"
  val ssl_url="ssl://192.168.33.22:8883"

  val getAllconfResult: (String, Properties) = getAllconf
  val props2: Properties = getAllconfResult._2
  lazy val mqttConfig = MqttConfig(
//    props2.getProperty("m2.mqtt.url-ssl"),
    ssl_url,
    props2.getProperty("m2.mqtt.username"),
    props2.getProperty("m2.mqtt.password"),
    props2.getProperty("m2.mqtt.topic1")
  )

//  val r1 = props2.getProperty("m2.mqtt.ca")
//  val r2 = props2.getProperty("m2.mqtt.client")
//  val r3 = props2.getProperty("m2.mqtt.clientKey")

  val r1 = "D:\\360Downloads\\ssl_02\\m2\\ca.pem"
  val r2 = "D:\\360Downloads\\ssl_02\\m2\\client-scala.pem"
  val r3 = "D:\\360Downloads\\ssl_02\\m2\\client-scala.key"

//  val sSLSocketFactory: SSLSocketFactory = SslUtil.getSocketFactory(r1, r2, r3)
  val sSLSocketFactory: SSLSocketFactory = MySslUtil.getSocketFactory(r1, r2, r3)

  val options = new MqttConnectOptions()
  options.setCleanSession(true)
  options.setUserName("admin")
  options.setPassword("admin".toCharArray)
//  设置SSL 认证
  options.setSocketFactory(sSLSocketFactory)
  // 设置超时时间
  options.setConnectionTimeout(30)
  // 设置会话心跳时间
  options.setKeepAliveInterval(20)

  val client = new MqttClient(mqttConfig.url, clientId)
  client.setCallback(new MqttCallback {
    override def connectionLost(cause: Throwable): Unit = {
      println("Connection lost: " + cause.getMessage)
      reconnect()
    }

    override def messageArrived(topic: String, message: MqttMessage): Unit = {
      println("Message received: " + new String(message.getPayload))
    }

    override def deliveryComplete(token: IMqttDeliveryToken): Unit = {
      println("Delivery complete")
    }
  })

  //    重连并重新订阅方法
  def reconnect(): Unit = {
    val maxReconnectAttempts = 3
    val reconnectInterval = 5000 // milliseconds
    var attempt = 1


    while ( {
      attempt <= maxReconnectAttempts
    }) {
      try {
        breakable {
          println("Connection lost, trying to reconnect...")
          while(!client.isConnected) {
            //            Thread.sleep(1000)
            client.connect(options)
          }
          println("Reconnected, sending message...")
          val topic1 = "topicA"
          val message = "Hello, MQTT!"
          client.publish(topic1, new MqttMessage(message.getBytes))
          client.subscribe(topic, 1)
          println("Reconnected to MQTT broker.")
          break
        }
      }
      catch {
        case e =>
          println("Failed to reconnect to MQTT broker: " + e.getMessage)
          e.printStackTrace()
      }
      attempt += 1
      Thread.sleep(reconnectInterval)
    }
  }

  client.connect(options)
  // 循环发送JSON数据
//  var counter = 0
//  while (true) {
//    val json = Json.obj(
//      "counter" -> counter,
//      "message" -> "Hello MQTT"
//    )
//    val payload = json.toString().getBytes("UTF-8")
//    val message = new MqttMessage(payload)
//    client.publish(topic, message)
//    println(s"Published message: $json")
//
//    counter += 1
//    Thread.sleep(1000) // 每隔1秒发送一次
//  }

  client.subscribe(topic, 1)

  // Wait for messages
  //  Thread.sleep(5000)
  //  client.disconnect()
}
posted @ 2023-11-07 19:59  三里清风18  阅读(785)  评论(0)    收藏  举报