|
@@ -19,19 +19,20 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
|
import java.net.InetSocketAddress;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.Map;
|
|
|
|
|
|
@Slf4j
|
|
|
-public class Iec104Session implements Runnable {
|
|
|
+public class Iec104Session {
|
|
|
private String clientIp;
|
|
|
private int clientPort;
|
|
|
private short asduAddress;
|
|
|
private Date connectTime;
|
|
|
private SessionState state;
|
|
|
private Date lastSessionTime;
|
|
|
- private short acceptSeq; //接收序列号
|
|
|
- private short sendSeq; //发送序列号
|
|
|
+ private short acceptSeq = 0; //接收序列号
|
|
|
+ private short sendSeq = 0; //发送序列号
|
|
|
private boolean isRunning = false;
|
|
|
|
|
|
private ChannelHandlerContext channelHandlerContext;
|
|
@@ -39,8 +40,8 @@ public class Iec104Session implements Runnable {
|
|
|
private PointService pointService = SpringContextUtil.getBean(PointService.class);
|
|
|
private RedisDataService redisService = SpringContextUtil.getBean(RedisDataService.class);
|
|
|
|
|
|
- Map<String, Point> aiMap;
|
|
|
- Map<String, Point> diMap;
|
|
|
+ private Map<String, Point> aiMap;
|
|
|
+ private Map<String, Point> diMap;
|
|
|
|
|
|
public Iec104Session(ChannelHandlerContext ctx) {
|
|
|
channelHandlerContext = ctx;
|
|
@@ -85,7 +86,6 @@ public class Iec104Session implements Runnable {
|
|
|
}
|
|
|
} else if (request.getTypeIdentifier() == TypeIdentifierEnum.generalCall) {
|
|
|
// 总召唤命令
|
|
|
- //todo: 总召唤命令处理,全量传输
|
|
|
if (TransferReason.ACTIVATE == TransferReason.valueOf(request.getTransferReason())) {
|
|
|
state = SessionState.CALL_ALL;
|
|
|
asduAddress = request.getTerminalAddress();
|
|
@@ -93,19 +93,17 @@ public class Iec104Session implements Runnable {
|
|
|
diMap = pointService.getDiMap().get((int)asduAddress);
|
|
|
//todo: 启动全量传输
|
|
|
this.start();
|
|
|
-
|
|
|
- return BasicInstruction104.getYesGeneralCallRuleDetail104();
|
|
|
+ acceptSeq = request.getAcceptSeq();
|
|
|
+ sendSeq += 1;
|
|
|
+ return BasicInstruction104.getYesGeneralCallRuleDetail104(acceptSeq, sendSeq);
|
|
|
|
|
|
} else if (TransferReason.STOP_ACTIVATION == TransferReason.valueOf(request.getTransferReason())) {
|
|
|
state = SessionState.CALL_ALL_END;
|
|
|
//todo: 启动变化传输
|
|
|
this.start();
|
|
|
-
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- //todo: 总召唤命令结束,变化传输
|
|
|
-
|
|
|
} else {
|
|
|
//todo: 其它命令处理
|
|
|
}
|
|
@@ -125,33 +123,44 @@ public class Iec104Session implements Runnable {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- this.run();
|
|
|
+ getPushThread().start();
|
|
|
}
|
|
|
|
|
|
public void stop() {
|
|
|
isRunning = false;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- try {
|
|
|
- isRunning = true;
|
|
|
- while(isRunning) {
|
|
|
- //todo: 从redis读取数据,发送到客户端
|
|
|
- //1、从redis读取数据,填充aiMap、diMap中,point的value,consumed,lastUpdateTime;
|
|
|
- aiMap = redisService.getData(aiMap);
|
|
|
- diMap = redisService.getData(diMap);
|
|
|
- //2、如果SessionState.CALL_ALL, 全量传输
|
|
|
-
|
|
|
- //3、如果SessionState.CALL_ALL_END,变化传输
|
|
|
-
|
|
|
- Thread.sleep(100);
|
|
|
+ private Thread getPushThread() {
|
|
|
+ return new Thread(new Runnable() {
|
|
|
+ public void run() {
|
|
|
+ log.info("开始启动数据轮询和转发线程...");
|
|
|
+ try {
|
|
|
+ isRunning = true;
|
|
|
+ while(isRunning) {
|
|
|
+ //todo: 从redis读取数据,发送到客户端
|
|
|
+ //1、从redis读取数据,填充aiMap、diMap中,point的value,consumed,lastUpdateTime;
|
|
|
+ aiMap = redisService.getData(aiMap);
|
|
|
+ diMap = redisService.getData(diMap);
|
|
|
+
|
|
|
+ if (state == SessionState.CALL_ALL) {
|
|
|
+ //2、如果SessionState.CALL_ALL, 全量传输
|
|
|
+
|
|
|
+ } else if (state == SessionState.CALL_ALL_END) {
|
|
|
+ //3、如果SessionState.CALL_ALL_END,变化传输
|
|
|
+
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ Thread.sleep(3000);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+
|
|
|
+ } finally {
|
|
|
+ isRunning = false;
|
|
|
+ }
|
|
|
}
|
|
|
- } catch (Exception e) {
|
|
|
-
|
|
|
- } finally {
|
|
|
- isRunning = false;
|
|
|
- }
|
|
|
+ });
|
|
|
}
|
|
|
+
|
|
|
}
|