Eclipse Paho MQTT客户端
Eclipse Paho MQTT客户端
在Eclipse Paho MQTT客户端库中,如果你设置了MqttConnectOptions的setAutomaticReconnect为true,那么在连接丢失时,客户端会自动尝试重新连接。你不需要在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()
}

浙公网安备 33010602011771号