MQTT订阅消息整合Java

订阅者接收发布者发来的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());
	}

}

测试

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41841482/article/details/114483028