订阅者接收发布者发来的json数据,并转换为对象,方便日后写入数据库
转换的关键在于PushCallback类的messageArrived方法,使用Gson
pom
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hzx</groupId>
<artifactId>testmqttserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<!-- http://maven.apache.org/plugins/maven-ear-plugin/ -->
<version>8</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
实体类
/**
* 接收设备的数据实体类
*
*/
import java.util.Date;
public class Device {
private String measurementId; // 无意义内部guid
private Date dateTime; // 采集装置时间戳,这个用上位系统本地代替
private Double value; // 浮点数据
private int status; // 状态1 正常 2 注意 3警告 0未知
private String description; // 订阅的Topic名称
private String unit; // 单位
private String id; // 无意义内部id
public Device() {
super();
}
public Device(String measurementId, Date dateTime, Double value, int status, String description, String unit,
String id) {
super();
this.measurementId = measurementId;
this.dateTime = dateTime;
this.value = value;
this.status = status;
this.description = description;
this.unit = unit;
this.id = id;
}
public String getMeasurementId() {
return measurementId;
}
public void setMeasurementId(String measurementId) {
this.measurementId = measurementId;
}
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
public Double getValue() {
return value;
}
public void setValue(Double value) {
this.value = value;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Device [measurementId=" + measurementId + ",\t\n dateTime=" + dateTime + ",\t\n value=" + value + ",\t\n status="
+ status + ",\t\n description=" + description + ",\t\n unit=" + unit + ",\t\n id=" + id + "]";
}
}
配置类
package testmqttserver.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import testmqttserver.client.MqttPushClient;
@Component
@ConfigurationProperties("mqtt")
public class MqttConfig {
@Autowired
private MqttPushClient mqttPushClient;
private String username;
private String password;
private String hostUrl;
private String clientId;
private String defaultTopic;
private int timeout;
private int keepalive;
public MqttConfig() {
super();
}
public MqttConfig(MqttPushClient mqttPushClient, String username, String password, String hostUrl, String clientId,
String defaultTopic, int timeout, int keepalive) {
super();
this.mqttPushClient = mqttPushClient;
this.username = username;
this.password = password;
this.hostUrl = hostUrl;
this.clientId = clientId;
this.defaultTopic = defaultTopic;
this.timeout = timeout;
this.keepalive = keepalive;
}
@Bean
public MqttPushClient getMqttPushClient() {
mqttPushClient.connect(hostUrl, clientId, username, password, timeout, keepalive);
// 订阅主题
mqttPushClient.subscribe("test/#", 0);
return mqttPushClient;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getHostUrl() {
return hostUrl;
}
public void setHostUrl(String hostUrl) {
this.hostUrl = hostUrl;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getDefaultTopic() {
return defaultTopic;
}
public void setDefaultTopic(String defaultTopic) {
this.defaultTopic = defaultTopic;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getKeepalive() {
return keepalive;
}
public void setKeepalive(int keepalive) {
this.keepalive = keepalive;
}
public void setMqttPushClient(MqttPushClient mqttPushClient) {
this.mqttPushClient = mqttPushClient;
}
}
package testmqttserver.client;
import org.eclipse.paho.client.mqttv3.MqttClient;
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.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import testmqttserver.listen.PushCallback;
@Component
public class MqttPushClient {
private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class);
@Autowired
private PushCallback pushCallback;
private static MqttClient mqttClient;
public static MqttClient getMqttClient() {
return mqttClient;
}
public static void setMqttClient(MqttClient mqttClient) {
MqttPushClient.mqttClient = mqttClient;
}
/**
* 客户端连接
*
* @param host
* @param clientId
* @param username
* @param password
* @param timeout
* @param keepalive
*/
public void connect(String host, String clientId, String username, String password, int timeout, int keepalive) {
MqttClient client;
try {
client = new MqttClient(host, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setConnectionTimeout(timeout);
options.setKeepAliveInterval(keepalive);
MqttPushClient.setMqttClient(client);
try {
client.setCallback(pushCallback);
client.connect(options);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发布
*
* @param qos
* @param retained
* @param topic
* @param pushMessage
*/
public void publish(int qos, boolean retained, String topic, String pushMessage) {
MqttMessage message = new MqttMessage();
message.setQos(qos);
message.setRetained(retained);
message.setPayload(pushMessage.getBytes());
MqttTopic mqttTopic = MqttPushClient.getMqttClient().getTopic(topic);
if (mqttTopic == null) {
logger.error("topic not exist");
}
MqttDeliveryToken token;
try {
token = mqttTopic.publish(message);
token.waitForCompletion();
} catch (Exception e) {
e.printStackTrace();
}
}
public void subscribe(String defaultTopic, int qos) {
logger.info("开始订阅主题" + defaultTopic);
try {
MqttPushClient.getMqttClient().subscribe(defaultTopic,qos);
} catch (MqttException e) {
e.printStackTrace();
logger.error(e.getMessage());
}
}
}
package testmqttserver.listen;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;
import testmqttserver.client.MqttPushClient;
import testmqttserver.config.MqttConfig;
import testmqttserver.driver.Device;
@Component
public class PushCallback implements MqttCallback{
private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class);
@Autowired
private MqttConfig mqttConfig;
private static MqttClient client;
@Override
public void connectionLost(Throwable cause) {
logger.info("连接断开,可以重连");
if (client == null || !client.isConnected()) {
mqttConfig.getMqttPushClient();
}
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// 收到消息并设置返回字符串格式
String payload = new String(message.getPayload(),"UTF-8");
// 解析数据,转换为对象格式
Device device = new Gson().fromJson(payload, Device.class);
//Device device = JSON.parseObject(payload,Device.class);
System.out.println("接收消息主题:"+topic);
System.out.println("接收消息QoS:"+message.getQos());
System.out.println("接收消息内容:payload格式\n"+payload);
System.out.println("接收消息内容:Device格式\n"+device.toString());
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
logger.info("deliveryComplete--------------"+token.isComplete());
}
}
测试