一、MQTT協議介紹
MQTT是一種輕量級的、基於發佈-訂閱的消息傳輸協議,適用於低帶寬、高延遲、不穩定的網絡環境。它主要用於IoT設備之間的通信,可以做到即時傳輸、可靠傳輸、節省帶寬。
MQTT協議的核心是發佈訂閱機制,它由三個主要角色組成:發佈者,訂閱者和代理(broker)。發佈者向代理髮送消息,訂閱者從代理訂閱消息,代理作為中間件接受並路由消息。
與HTTP協議相比,MQTT協議不需要建立長連接,可以做到實時通信;不需要傳輸整個消息頭,不需要解析HTTP報文。因此,MQTT協議的傳輸效率更高。
二、使用Spring Boot實現MQTT應用
Spring Boot是一個非常流行的Java開發框架,可以快速構建應用程序。在Spring Boot中,可以使用mqtt-spring-boot-starter這個依賴包來構建MQTT應用。該依賴包是基於Eclipse Paho實現的,提供了MQTT客戶端和服務端程序。
三、Spring Boot中使用MQTT客戶端
在Spring Boot中使用MQTT客戶端十分簡單。首先,需要在pom.xml文件中添加mqtt-spring-boot-starter的依賴:
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>mqtt-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
接下來,在application.properties文件中配置MQTT客戶端連接信息:
mqtt.clientId=myClientId
mqtt.brokerUrl=tcp://localhost:1883
mqtt.username=myUsername
mqtt.password=myPassword
然後,在java類中使用@MqttListener註解定義一個監聽器,例如:
@MqttListener("/test/topic")
public void handleMessage(String message) {
System.out.println(message);
}
上述代碼中,/test/topic是訂閱的主題,handleMessage方法會在收到消息時被調用。
四、Spring Boot中使用MQTT服務端
使用Spring Boot構建MQTT服務端也十分簡單。首先需要在pom.xml文件中添加mqtt-broker-spring-boot-starter的依賴:
<dependency>
<groupId>com.baeldung</groupId>
<artifactId>mqtt-broker-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
接下來,在application.properties文件中配置MQTT服務端信息:
mqtt.broker.server-port=1883
mqtt.broker.username=myUsername
mqtt.broker.password=myPassword
然後,在java類中使用@MqttController註解定義一個控制器,例如:
@MqttController
public class MyController {
@MqttRequestMapping(topic = "/test/topic", qos = MqttQoS.EXACTLY_ONCE)
public void handleMessage(String message) {
System.out.println(message);
}
}
上述代碼中,/test/topic是處理的主題,handleMessage方法會在收到消息時被調用。
五、使用Spring Boot管理MQTT連接池
在MQTT應用中,管理連接池是很重要的一環。Spring Boot提供了一個名為HikariCP的連接池管理框架。可以使用其它連接池管理框架,但HikariCP是性能最好的連接池之一。
在使用HikariCP之前,需要在pom.xml文件中添加如下依賴:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.0</version>
</dependency>
接下來,在application.properties文件中配置連接池信息:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=myUsername
spring.datasource.password=myPassword
最後,在java類中使用@MQTTConnectionPool註解定義連接池:
@MQTTConnectionPool
public class MyConnectionPool {
@Bean
public HikariDataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb?useSSL=false");
config.setUsername("myUsername");
config.setPassword("myPassword");
return new HikariDataSource(config);
}
}
六、代碼示例
下面是一個完整的使用Spring Boot實現高效的MQTT應用的代碼示例:
// 配置文件application.properties
mqtt.clientId=myClientId
mqtt.brokerUrl=tcp://localhost:1883
mqtt.username=myUsername
mqtt.password=myPassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=myUsername
spring.datasource.password=myPassword
// 使用MQTT客戶端
@MqttListener("/test/topic")
public void handleMessage(String message) {
System.out.println(message);
}
// 使用MQTT服務端
@MqttController
public class MyController {
@MqttRequestMapping(topic = "/test/topic", qos = MqttQoS.EXACTLY_ONCE)
public void handleMessage(String message) {
System.out.println(message);
}
}
// 使用連接池
@MQTTConnectionPool
public class MyConnectionPool {
@Bean
public HikariDataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb?useSSL=false");
config.setUsername("myUsername");
config.setPassword("myPassword");
return new HikariDataSource(config);
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/303243.html