帮助大家快速实现mqtt数据连接,配置及业务操作修改一下,剩下的复制大法即可~
mqtt工具类
@Component
public class MQTTConnect {
/**
* 客户端connect连接mqtt服务器
*
* @param username 用户名
* @param password 密码
* @param mqttCallback 回调函数
**/
public MqttClient setMqttClient(String url, String clientid, String username, String password, MqttCallback mqttCallback)
throws MqttException {
MqttClient mqttClient = new MqttClient(url, clientid, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setConnectionTimeout(60);///默认:30
options.setAutomaticReconnect(true);//默认:false
options.setCleanSession(true);//默认:true
options.setKeepAliveInterval(60);//默认:60
mqttClient.setCallback(mqttCallback);
mqttClient.connect(options);
return mqttClient;
}
}
配置类
@Configuration
@ConfigurationProperties(prefix = "rq")
public class RQConfig implements WebMvcConfigurer {
@Value("${rq.url}")
private static String url;
@Value("${rq.name}")
private static String name;
@Value("${rq.password}")
private static String password;
@Value("${rq.topic}")
private static String topic;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
}
回调函数
@Component
public class RanqiCallback implements MqttCallback {
private static final Logger log = LoggerFactory.getLogger(RanqiCallback.class);
private Gson gson = new Gson();
@Autowired
private ILysRanqiDataService service;
public static RanqiCallback RanqiCallback;
@PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
public void init() {
RanqiCallback = this;
//初始化
RanqiCallback.service = this.service;
}
@Override
public void connectionLost(Throwable e) {
log.error(e.getMessage(), e);
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
//业务操作
LysRanqiData ranqiData = gson.fromJson(new String(mqttMessage.getPayload()), LysRanqiData.class);
LysRanqiData ranqiData1 = new LysRanqiData();
ranqiData1.setDevId(ranqiData.getDevId());
ranqiData1.setUpdatetime(ranqiData.getUpdatetime());
//保存到数据库,如果没有初始化或者不这样写会空指针的哈
if (RanqiCallback.service.selectLysRanqiDataList(ranqiData1).isEmpty()) {
RanqiCallback.service.save(ranqiData);
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
}
监听器
@Component
public class MqttListener implements ApplicationListener<ApplicationReadyEvent> {
private static final Logger log = LoggerFactory.getLogger(MqttListener.class);
private RQConfig rqConfig = new RQConfig();
private RLConfig rlConfig = new RLConfig();
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
try {
MQTTConnect service = new MQTTConnect();
String url = rqConfig.getUrl();
String topic = rqConfig.getTopic();
String name = rqConfig.getName();
String password = rqConfig.getPassword();
//clientId建议随机生成,不然之后启动的服务会把之前的顶掉
MqttClient client1 = service.setMqttClient(url, IdUtils.fastUUID(), name, password, new RanqiCallback());
client1.subscribe(topic);
MQTTConnect service2 = new MQTTConnect();
String url2 = rlConfig.getUrl();
String topic2 = rlConfig.getTopic();
String name2 = rlConfig.getName();
String password2 = rlConfig.getPassword();
MqttClient client2 = service2.setMqttClient(url2, IdUtils.fastUUID(), name2, password2, new ReliCallback());
client2.subscribe(topic2);
} catch (MqttException e) {
log.error(e.getMessage(), e);
}
}
}