package com.captainwashcar.business.service.impl;
import com.alibaba.fastjson2.JSON;
import com.captainwashcar.business.domain.LedDevice;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.stereotype.Service;
/**
* @author wjn
* 2023/7/19
*/
@Service
public class MQTTConnectService {
private String HOST = "tcp://127.0.0.1:1883"; //mqtt服务器的地址和端口号
private final String clientId = "DC" + (int) (Math.random() * 100000000);
private MqttClient mqttClient;
/**
* 客户端connect连接mqtt服务器
*
* @param userName 用户名
* @param passWord 密码
* @param mqttCallback 回调函数
**/
public void setMqttClient(String userName, String passWord, MqttCallback mqttCallback) throws MqttException {
MqttConnectOptions options = mqttConnectOptions(userName, passWord);
if (mqttCallback == null) {
mqttClient.setCallback(new CallbackServiceImpl());
} else {
mqttClient.setCallback(mqttCallback);
}
mqttClient.connect(options);
}
/**
* MQTT连接参数设置
*/
private MqttConnectOptions mqttConnectOptions(String userName, String passWord) throws MqttException {
mqttClient = new MqttClient(HOST, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(userName);
options.setPassword(passWord.toCharArray());
options.setConnectionTimeout(10);///默认:30
options.setAutomaticReconnect(true);//默认:false
options.setCleanSession(false);//默认:true
//options.setKeepAliveInterval(20);//默认:60
return options;
}
/**
* 关闭MQTT连接
*/
public void close() throws MqttException {
mqttClient.close();
mqttClient.disconnect();
}
/**
* 向某个主题发布消息 默认qos:1
*
* @param topic:发布的主题
* @param msg:发布的消息
*/
public void pub(String topic, String msg) throws MqttException {
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setQos(1);
mqttMessage.setPayload(msg.getBytes());
MqttTopic mqttTopic = mqttClient.getTopic(topic);
MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
token.waitForCompletion();
}
/**
* 向某个主题发布消息
*
* @param topic: 发布的主题
* @param msg: 发布的消息
* @param qos: 消息质量 Qos:0、1、2
*/
public void pub(String topic, String msg, int qos) throws MqttException {
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setQos(qos);
mqttMessage.setPayload(msg.getBytes());
MqttTopic mqttTopic = mqttClient.getTopic(topic);
MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
token.waitForCompletion();
}
/**
* 订阅某一个主题 ,此方法默认的的Qos等级为:1
*
* @param topic 主题
*/
public void sub(String topic) throws MqttException {
mqttClient.subscribe(topic);
}
/**
* 订阅某一个主题,可携带Qos
*
* @param topic 所要订阅的主题
* @param qos 消息质量:0、1、2
*/
public void sub(String topic, int qos) throws MqttException {
mqttClient.subscribe(topic, qos);
}
/**
* main函数自己测试用
*/
public static void main(String[] args) throws MqttException {
MQTTConnectService mqttConnect = new MQTTConnectService();
String devicekey="/ZsBhCfj/IyRjycpbJsiw/Idfav45/";
// String devicemac=camera.getDevicemac();
String topic=devicekey+"publish";
try {
mqttConnect.setMqttClient("rDtfuMybFTmS", "UYoTyIDrsgwcDkNviV", new CallbackServiceImpl());
LedDevice ledDevice=new LedDevice();
ledDevice.setKey(1);
ledDevice.setType("event");
String data= JSON.toJSONString(ledDevice);
mqttConnect.pub(topic,data);
mqttConnect.sub("/ZsBhCfj/IyRfflpbJsLw/4cebff0bfdb3/sub");
} catch (MqttException e) {
e.printStackTrace();
}
}
}
package com.captainwashcar.business.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.captainwashcar.business.domain.Camera;
import com.captainwashcar.business.mapper.CameraMapper;
import com.captainwashcar.business.service.ICameraService;
import com.captainwashcar.business.service.impl.CameraServiceImpl;
import org.apache.avro.data.Json;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
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 org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* @author wjn
* 2023/7/19
* mqtt回调方法
*/
@Component
public class CallbackServiceImpl implements MqttCallback {
private static final Logger log = LoggerFactory.getLogger(CallbackServiceImpl.class);
@Autowired
private CameraMapper cameraMapper;
public static CallbackServiceImpl callbackServiceImpl ;
@PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
public void init() {
System.out.println("初始化");
callbackServiceImpl = this;
callbackServiceImpl.cameraMapper = this.cameraMapper;
}
/**
* MQTT 断开连接会执行此方法
*/
@Override
public void connectionLost(Throwable throwable) {
// log.info("断开了MQTT连接 :{}", throwable.getMessage());
// log.error(throwable.getMessage(), throwable);
}
/**
* publish发布成功后会执行到这里
*/
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info("发布消息成功");
}
/**
* subscribe订阅后得到的消息会执行到这里
*/
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// TODO 此处可以将订阅得到的消息进行业务处理、数据存储
log.info("收到来自 " + topic + " 的消息:{}", new String(message.getPayload()));
String data=new String(message.getPayload());
JSONObject jsonObject=JSONObject.parseObject(data);
int key=jsonObject.getIntValue("key");
String mac=jsonObject.getString("mac");
Camera camera=new Camera();
camera.setDevicemac(mac.toLowerCase());
camera.setLed_status(key);
callbackServiceImpl.cameraMapper.updateCameraByMac(camera);
}
}