133 lines
5.3 KiB
Java
133 lines
5.3 KiB
Java
package com.aros.apron.manager;
|
||
|
||
import android.os.Handler;
|
||
import android.os.Looper;
|
||
|
||
import com.aros.apron.base.BaseManager;
|
||
import com.aros.apron.constant.AMSConfig;
|
||
import com.aros.apron.constant.Constant;
|
||
import com.aros.apron.entity.ApronExecutionStatus;
|
||
import com.aros.apron.entity.MessageEvent;
|
||
import com.aros.apron.entity.MessageReply;
|
||
import com.aros.apron.entity.Movement;
|
||
import com.aros.apron.tools.LogUtil;
|
||
import com.aros.apron.tools.MqttManager;
|
||
import com.google.gson.Gson;
|
||
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
|
||
import org.eclipse.paho.client.mqttv3.IMqttToken;
|
||
import org.eclipse.paho.client.mqttv3.MqttMessage;
|
||
|
||
import java.nio.charset.StandardCharsets;
|
||
import java.util.UUID;
|
||
|
||
public class DockOpenManager extends BaseManager {
|
||
|
||
private final int maxRetries = 20;
|
||
private int sendDockOpenSuccessTimes;
|
||
private boolean isSendDockOpenSuccess;
|
||
private DockOpenManager() {
|
||
}
|
||
|
||
private static class DockOpenHolder {
|
||
private static final DockOpenManager INSTANCE = new DockOpenManager();
|
||
}
|
||
|
||
public static DockOpenManager getInstance() {
|
||
return DockOpenHolder.INSTANCE;
|
||
}
|
||
|
||
public void resetState() {
|
||
sendDockOpenSuccessTimes = 0;
|
||
isSendDockOpenSuccess = false;
|
||
LogUtil.log(TAG, "开舱状态已重置");
|
||
}
|
||
|
||
public void sendDockOpenMsg2Server() {
|
||
if (sendDockOpenSuccessTimes >= maxRetries) {
|
||
LogUtil.log(TAG, "达到最大重试次数或已发送开舱"+isSendDockOpenSuccess+sendDockOpenSuccessTimes);
|
||
return;
|
||
}
|
||
try {
|
||
if (MqttManager.getInstance().mqttAndroidClient.isConnected()) {
|
||
sendDockOpenMessage();
|
||
} else {
|
||
handleNotConnected();
|
||
}
|
||
} catch (Exception e) {
|
||
LogUtil.log(TAG, "开舱发送异常:" + e.toString());
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
private void sendDockOpenMessage(){
|
||
try {
|
||
if (MqttManager.getInstance().mqttAndroidClient.isConnected()) {
|
||
MessageEvent messageEvent = new MessageEvent();
|
||
messageEvent.setBid(UUID.randomUUID().toString());
|
||
messageEvent.setTid(UUID.randomUUID().toString());
|
||
messageEvent.setTimestamp(System.currentTimeMillis());
|
||
messageEvent.setMethod(Constant.OPEN_DOOR);
|
||
MessageEvent.Data data=new MessageEvent.Data();
|
||
MqttMessage mqttMessage = new MqttMessage(new Gson().toJson(messageEvent).getBytes(StandardCharsets.UTF_8));
|
||
mqttMessage.setQos(1);
|
||
MqttManager.getInstance().mqttAndroidClient.publish(AMSConfig.UP_UAV_EVENT, mqttMessage, null, new IMqttActionListener() {
|
||
@Override
|
||
public void onSuccess(IMqttToken asyncActionToken) {
|
||
sendEvent2Server("AMS通知机库开舱",1);
|
||
mainHandler.postDelayed(new Runnable() {
|
||
@Override
|
||
public void run() {
|
||
if (ApronExecutionStatus.getInstance().isServerReplyDockOpen()) {
|
||
isSendDockOpenSuccess = true;
|
||
LogUtil.log(TAG, "已经收到服务端响应开门");
|
||
} else {
|
||
if (Movement.getInstance().isPlaneWing()&&Movement.getInstance().getElevation()>40){
|
||
LogUtil.log(TAG, "未收到收到服务端响应开门,重新发送");
|
||
retrySend();
|
||
}else{
|
||
LogUtil.log(TAG,"飞机状态不满足开舱门条件:"+Movement.getInstance().isPlaneWing()+"--"+Movement.getInstance().getElevation());
|
||
}
|
||
}
|
||
}
|
||
}, 2000);
|
||
}
|
||
|
||
@Override
|
||
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
|
||
LogUtil.log(TAG, "开舱发送回调失败:" + exception.toString());
|
||
retrySend();
|
||
}
|
||
});
|
||
} else {
|
||
LogUtil.log(TAG, "开舱发送回调失败:mqtt 未连接");
|
||
}
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
LogUtil.log(TAG, "开舱发送异常:" + e.toString());
|
||
|
||
}
|
||
|
||
|
||
}
|
||
final Handler mainHandler = new Handler(Looper.getMainLooper());
|
||
|
||
private void retrySend() {
|
||
sendDockOpenSuccessTimes++;
|
||
if (sendDockOpenSuccessTimes < maxRetries) {
|
||
mainHandler.postDelayed(() -> sendDockOpenMsg2Server(), 2000);
|
||
} else {
|
||
LogUtil.log(TAG, "达到最大重试次数,开舱发送失败:" + sendDockOpenSuccessTimes);
|
||
}
|
||
}
|
||
|
||
private void handleNotConnected() {
|
||
if (!isSendDockOpenSuccess && sendDockOpenSuccessTimes < maxRetries) {
|
||
sendDockOpenSuccessTimes++;
|
||
mainHandler.postDelayed(() -> sendDockOpenMsg2Server(), 2000);
|
||
LogUtil.log(TAG, "开舱发送失败:mqtt未连接" + sendDockOpenSuccessTimes);
|
||
} else {
|
||
LogUtil.log(TAG, "开舱发送失败:" + sendDockOpenSuccessTimes);
|
||
}
|
||
}
|
||
|
||
} |