引入MQTT环境
<!--mqtt-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
Service层
先定义一个基本方法接口
public interface MQService {
/**
* 初始化客户端
* @param host ip地址
* @param port ip端口
* @param client_id 客户端id
* @param username 账户
* @param password 密码
* @return boolean
*/
boolean initMQTTClient(String host, String port, String client_id, String username, String password);
/**
* 订阅主题
* @param topic 主题
*/
void subTopic(String topic);
/**
* 发送消息
* @param topic 主题
* @param msg 消息
* @return boolean
*/
boolean pubMessage(String topic, byte[] msg);
/**
* 关闭客户端
* @return boolean
*/
boolean close();
/**
* 回调数据处理
* @param topic 主题
* @param mqttMessage 消息
*/
void messageHandle(String topic, MqttMessage mqttMessage);
}
实现接口
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class MQServiceImpl implements MQService {
private MQClient mqClient;
private static final Logger logger = LoggerFactory.getLogger(MQServiceImpl.class);
@Override
public boolean initMQTTClient(String host, String port, String client_id, String username, String password) {
try {
mqClient = MQClient.getClient(this, host, port, client_id, username, password);
}catch (MqttException e){
return false;
}
return true;
}
@Override
public void subTopic(String topic) {
mqClient.subscribe(topic, 0);
}
@Override
public boolean pubMessage(String topic, byte[] msg) {
return mqClient.publish(topic, msg, 0, false);
}
@Override
public boolean close() {
try {
mqClient.close("下线");
return true;
}catch (Exception e){
return false;
}
}
@Override
public void messageHandle(String topic, MqttMessage mqttMessage) {
}
}
MQTT客户端
创建基本的客户端,作为一个组件
@Component
public class MQClient {
private MQServiceImpl mqService;
private MqttClient client;
private MqttConnectOptions options;
private static final Loggerlogger= LoggerFactory.getLogger(MQClient.class);
public static MQClient getClient(MQServiceImpl mqService, String host, String port, String client_id, String username, String password) throws MqttException {
return new MQClient(mqService, host, port, client_id, username, password);
}
private MQClient(MQServiceImpl mqService, String host, String port, String client_id, String username, String password) throws MqttException {
this.mqService = mqService;
connect(host, port, client_id, username, password);
}
private MQClient(){}
private void connect(String host, String port, String client_id, String username, String password) throws MqttException {
try {
host = "tcp://" + host + ":" + port;
client = new MqttClient(host, client_id, new MemoryPersistence());
options = new MqttConnectOptions();
options.setCleanSession(false);
options.setConnectionTimeout(60);
options.setKeepAliveInterval(30);
options.setAutomaticReconnect(true);
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setWill("iot/will-topic", "off".getBytes(), 2, true);
client.setCallback(new MQCallback(mqService));
client.connect(options);
logger.info("{}客户端连接成功", client_id);
}catch (MqttException e){
logger.error(e.toString());
client.close();
}
}
public boolean publish(String topic, byte[] data, Integer qos, Boolean retained){
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(data);
mqttMessage.setQos(qos);
mqttMessage.setRetained(retained);
MqttTopic mqttTopic = client.getTopic(topic);
try {
MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
logger.info("{} publish topic {}", token.getMessage(), token);
return true;
}catch (Exception e){
logger.error("发送异常:{}", e.toString());
return false;
}
}
public void subscribe(String topic, int qos){
try {
client.subscribe(topic, qos);
logger.info("订阅了{}", topic);
}catch (MqttException e){
logger.error(e.toString());
}
}
public void reconnect(){
try {
client.connect(options);
logger.info("主动连接");
}catch (MqttException e){
logger.error("主题连接异常");
}
}
public boolean close(String msg){
try {
Thread.sleep(1000);
client.close();
logger.info("主动释放资源:{}", msg);
}catch (MqttException | InterruptedException e){
logger.error("{}", e.toString());
try {
client.disconnect();
client.close();
}catch (MqttException e1){
logger.error(e1.toString());
return false;
}
}
return true;
}
}
消息回调
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MQCallback implements MqttCallbackExtended {
private MQServiceImpl mqService;
private static final Logger logger = LoggerFactory.getLogger(MQCallback.class);
public MQCallback(MQServiceImpl mqService){
this.mqService = mqService;
}
@Override
public void connectComplete(boolean b, String s) {
logger.info("mqtt连接成功!!!");
try {
Thread.sleep(1000);
String[] topics = {"11"};
for (String t : topics){
mqService.subTopic(t);
}
}catch (Exception e){
logger.error(e.toString());
}
}
@Override
public void connectionLost(Throwable throwable) {
logger.warn("重新连接!!!");
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
mqService.messageHandle(s, mqttMessage);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
logger.info("发送成功");
}
}
开启配置
@Configuration
public class MQConfig {
@Value("${mqtt.host}")
private String host;
@Value("${mqtt.port}")
private String port;
@Value("${mqtt.username}")
private String username;
@Value("${mqtt.password}")
private String password;
@Autowired
private MQService mqService;
@Bean
public boolean startMq(){
System.out.println(host);
return mqService.initMQTTClient(host, port, host+port, username, password);
}
}
application
server:
port: 8081
mqtt:
host: 192.168.1.14
port: 1883
username: root
password: root
引用service
@Autowired
private MQService mqService;