一、controller
@RequestMapping(value = "/updateNetWork",method = RequestMethod.POST)
@ResponseBody
public Object updateNetWork(String device,String ssid,String password,
String host,String port,String mqttUser,String mqttPassword) throws MqttException, InterruptedException {
Map<String,Object> map = new HashMap<>();
JSONObject jsonObject = new JSONObject();
StringBuffer spg = new StringBuffer();
spg.append(topic).append("/").append(device);
jsonObject.put("device",Integer.parseInt(device));
jsonObject.put("funcType","network_config");
jsonObject.put("wifi_ssid",ssid);
jsonObject.put("wifi_password",password);
jsonObject.put("server_host",host);
jsonObject.put("server_port",Integer.parseInt(port));
jsonObject.put("mqtt_user",mqttUser);
jsonObject.put("mqtt_password",mqttPassword);
MqttConnectionUtils.publish(spg.toString(), JSONArray.toJSONString(jsonObject));
PushCallback.pushCallback.listens(new Listen() {
@Override
public void netSuccess(String success) {
if(success != null){
UploadQuestionController.success = success;
}
}
});
int i = 3;
while (i>0){
i--;
Thread.sleep(1000);
if(!success .equals("")){
break;
}
}
map.put("success",success);
return map;
}
public interface Listen{
void netSuccess(String success);
}
二、發送類
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zskx.deanswerquipment.controller.UploadQuestionController;
import com.zskx.deanswerquipment.dao.ApplicationRedis;
import com.zskx.deanswerquipment.dao.CommitUserInfo;
import com.zskx.deanswerquipment.dao.UserInfoDao;
import com.zskx.deanswerquipment.pojo.Equipmentinfo;
import com.zskx.deanswerquipment.service.JudgeEquipmentService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class PushCallback implements MqttCallback{
private static final Logger LOG = LogManager.getLogger(PushCallback.class);
public static PushCallback pushCallback;
@Autowired
private UserInfoDao userInfoDao; // 數據庫CRUD接口
@Autowired
private CommitUserInfo commitUserInfol;
private UploadQuestionController.Listen listen;
public PushCallback(UserInfoDao userInfoDao,ApplicationRedis applicationRedis,
JudgeEquipmentService judgeEquipmentService, CommitUserInfo commitUserInfol){
this.userInfoDao = userInfoDao;
this.applicationRedis = applicationRedis;
this.judgeEquipmentService = judgeEquipmentService;
this.commitUserInfol = commitUserInfol;
pushCallback=this;
}
@Override
public void connectionLost(Throwable throwable) {
// 連接丟失後,一般在這裏面進行重連
System.out.println("WIFI版======連接斷開,可以做重連");
MqttConnectionUtils.reConnect();
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// subscribe後得到的消息會執行到這裏面
String messages = new String(message.getPayload());
if(!messages.equals("close")){
System.out.println("接收消息主題 : " + topic);
System.out.println("接收消息Qos : " + message.getQos());
System.out.println("接收消息內容 : " + new String(message.getPayload()));
try {
JSONObject json = JsonUtil.StringtoJson(new String(message.getPayload()));
if(json.get("funcType") != null){
}
}catch (Exception e){
}
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println("deliveryComplete---------" + iMqttDeliveryToken.isComplete());
}
public void listens(UploadQuestionController.Listen listens){
this.listen=listens;
}
}
採用的是java觀察者模式 用於監聽一個變量發生變化後立即返回狀態給前端。我這裏做了三秒的延遲!!用於等待響應