java+mqtt 實現異步回調

一、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觀察者模式  用於監聽一個變量發生變化後立即返回狀態給前端。我這裏做了三秒的延遲!!用於等待響應

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章