|
@@ -42,9 +42,16 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
private static ExecutorService executorService = Executors.newSingleThreadExecutor();
|
|
|
|
|
|
private static final Long INTERVAL_TIME = 300000L; // 开关时间
|
|
|
-
|
|
|
+ private static final Long URGENT_OUT_TIME = 5000L; // 超时时间
|
|
|
+ /**
|
|
|
+ * 省电模式开关
|
|
|
+ */
|
|
|
private static Map<String, SwitchWorkModel> switchMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
+ /**
|
|
|
+ * 设置模式
|
|
|
+ */
|
|
|
+ private static Map<String, WorkModel> modelMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
@Override
|
|
|
protected void handle(ByteBuf in, Channel channel) throws Exception {
|
|
@@ -57,10 +64,19 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
if (deviceId != null) {
|
|
|
MDC.put(MDC_DEVICEID, deviceId);
|
|
|
}
|
|
|
+ logger.info("传入数据为:" + msg);
|
|
|
try {
|
|
|
- logger.info("传入数据为:" + msg);
|
|
|
String factory = msg.substring(0, 2);// 工厂
|
|
|
String type = msg.substring(2, 6);// 标记
|
|
|
+
|
|
|
+ WorkModel workModel = modelMap.get(deviceId);//已登录
|
|
|
+ Long time = System.currentTimeMillis();
|
|
|
+ if (workModel != null && (time - workModel.getUrgentTime() > URGENT_OUT_TIME)) {
|
|
|
+ workModel.setUrgentTime(time);
|
|
|
+ workModel.setUrgentCount(0);
|
|
|
+ modelMap.put(deviceId, workModel);
|
|
|
+ normalReplyModel(factory, deviceId, channel, 3);
|
|
|
+ }
|
|
|
switch (type) {
|
|
|
case "AP00": // 初始化登录
|
|
|
resolveLoginMSG(msg, channel);
|
|
@@ -75,6 +91,18 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
sendMsg2Kafka((msg + deviceId).getBytes(), deviceId, channel);
|
|
|
normalReply(factory, channel, "BP01");
|
|
|
break;
|
|
|
+ case "AP33": // 设置模式回复
|
|
|
+ if (workModel != null && workModel.getUrgentCount() < 2) {
|
|
|
+ // 只设置一次 在设置一次
|
|
|
+ if (time - workModel.getUrgentTime() < URGENT_OUT_TIME) {
|
|
|
+ normalReplyModel(factory, deviceId, channel, 3);
|
|
|
+ workModel.setUrgentCount(workModel.getUrgentCount() + 1);
|
|
|
+ modelMap.put(deviceId, workModel);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ logger.warn("已设置紧急模式两次成功");
|
|
|
+ }
|
|
|
+ break;
|
|
|
default: // 其他
|
|
|
logger.info("client send data without handle type ...");
|
|
|
break;
|
|
@@ -86,7 +114,8 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 模式设置
|
|
|
+ * 模式设置
|
|
|
+ *
|
|
|
* @param factory
|
|
|
* @param deviceId
|
|
|
* @param channel
|
|
@@ -101,8 +130,8 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
if (nowTime - swm.getActiveTime() > INTERVAL_TIME
|
|
|
&& nowTime - swm.getSwitchTime() > INTERVAL_TIME) {
|
|
|
Integer workType = (3 == swm.getWorkType()) ? 2 : 3;
|
|
|
- if(nowTime - swm.getGpsUpTime() > INTERVAL_TIME){
|
|
|
- workType =3; // APO1上传间隔大于5分种再次设置为紧急模式
|
|
|
+ if (nowTime - swm.getGpsUpTime() > INTERVAL_TIME) {
|
|
|
+ workType = 3; // APO1上传间隔大于5分种再次设置为紧急模式
|
|
|
}
|
|
|
// 如果当前状态为A 紧急模式
|
|
|
swm.setSwitchTime(nowTime);
|
|
@@ -110,6 +139,12 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
switchMap.put(deviceId, swm);
|
|
|
logger.warn("心跳检测是下发模式:工作状态" + JSON.toJSONString(swm));
|
|
|
normalReplyModel(factory, deviceId, channel, workType);
|
|
|
+ if (workType == 3) {// 设置紧急模式 则更新
|
|
|
+ WorkModel wm = new WorkModel();
|
|
|
+ wm.setUrgentCount(0);// 设置紧急模式次数
|
|
|
+ wm.setUrgentTime(nowTime);// 设置紧急模式时间
|
|
|
+ modelMap.put(deviceId, wm);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -191,6 +226,10 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
TimeUnit.SECONDS.sleep(5 - secondsSinceLogin);
|
|
|
}
|
|
|
normalReplyModel(factory, deviceId, channel, 3);
|
|
|
+ WorkModel wm = new WorkModel();
|
|
|
+ wm.setUrgentCount(0);// 设置紧急模式次数
|
|
|
+ wm.setUrgentTime(currentTime.getTime());// 设置紧急模式时间
|
|
|
+ modelMap.put(deviceId, wm);
|
|
|
} catch (InterruptedException e) {
|
|
|
logger.error(e.getMessage());
|
|
|
}
|
|
@@ -280,12 +319,39 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
String deviceId = channelDeviceMap.get(channel);
|
|
|
if (deviceId != null) {
|
|
|
switchMap.remove(deviceId);
|
|
|
+ modelMap.remove(deviceId);
|
|
|
}
|
|
|
}
|
|
|
super.channelInactive(ctx);
|
|
|
|
|
|
}
|
|
|
|
|
|
+ class WorkModel {
|
|
|
+ /**
|
|
|
+ * 设置紧急模式时间
|
|
|
+ */
|
|
|
+ private Long urgentTime;
|
|
|
+ /**
|
|
|
+ * 设置紧急模式测试
|
|
|
+ */
|
|
|
+ private Integer urgentCount;
|
|
|
+
|
|
|
+ public Long getUrgentTime() {
|
|
|
+ return urgentTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setUrgentTime(Long urgentTime) {
|
|
|
+ this.urgentTime = urgentTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Integer getUrgentCount() {
|
|
|
+ return urgentCount;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setUrgentCount(Integer urgentCount) {
|
|
|
+ this.urgentCount = urgentCount;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 开关工作模式
|
|
@@ -307,7 +373,7 @@ public class WatchJWServerHandler extends HexBinaryAcceptanceHandlerAdapter {
|
|
|
private Long switchTime;
|
|
|
|
|
|
/**
|
|
|
- * GPS APO1 上傳时间
|
|
|
+ * GPS APO1 上傳时间
|
|
|
*/
|
|
|
private Long gpsUpTime;
|
|
|
|