|
@@ -56,60 +56,67 @@ public class Iec104Session {
|
|
|
return state;
|
|
|
}
|
|
|
|
|
|
- public Iec104Message processMessage(Iec104Message request) {
|
|
|
+ public void processMessage(Iec104Message request) {
|
|
|
if (request == null)
|
|
|
- return null;
|
|
|
+ return;
|
|
|
|
|
|
try {
|
|
|
+ acceptSeq++;
|
|
|
if (request.getTypeIdentifier() == null) {
|
|
|
//U帧或S帧处理
|
|
|
//TODO: 标准化处理,状态校验
|
|
|
+ Iec104Message response = null;
|
|
|
byte fun = request.getControl()[0];
|
|
|
switch (fun) {
|
|
|
case 0x07: //启动命令
|
|
|
- state = SessionState.START104;
|
|
|
- return BasicInstruction104.createSysMessage(UControlEnum.STARTDT_YES);
|
|
|
+ if(state == SessionState.NEW || state == SessionState.INACTIVE)
|
|
|
+ state = SessionState.START104;
|
|
|
+ acceptSeq = 0;
|
|
|
+ sendSeq = 0;
|
|
|
+ response = BasicInstruction104.createSysMessage(UControlEnum.STARTDT_YES);
|
|
|
+ break;
|
|
|
case 0x43: //测试命令
|
|
|
- return BasicInstruction104.createSysMessage(UControlEnum.TESTFR_YES);
|
|
|
+ response = BasicInstruction104.createSysMessage(UControlEnum.TESTFR_YES);
|
|
|
case 0x13: //停止命令
|
|
|
state = SessionState.STOP104;
|
|
|
//todo: 停止数据的发送
|
|
|
this.stop();
|
|
|
- return BasicInstruction104.createSysMessage(UControlEnum.STOPDT_YES);
|
|
|
+ response = BasicInstruction104.createSysMessage(UControlEnum.STOPDT_YES);
|
|
|
+ break;
|
|
|
default:
|
|
|
- return null;
|
|
|
+ break;
|
|
|
}
|
|
|
- } else if (request.getTypeIdentifier() == TypeIdentifierEnum.generalCall) {
|
|
|
- // 总召唤命令
|
|
|
- if (TransferReason.ACTIVATE == TransferReason.valueOf(request.getTransferReason())) {
|
|
|
- state = SessionState.CALL_ALL;
|
|
|
+ if (response != null)
|
|
|
+ sendMessage(response);
|
|
|
+ //channelHandlerContext.writeAndFlush(response);
|
|
|
+ } else {
|
|
|
+ //acceptSeq = (short)(request.getSendSeq() + 1);
|
|
|
+ if (request.getTypeIdentifier() == TypeIdentifierEnum.generalCall) {
|
|
|
+ // 总召唤命令
|
|
|
publicAddress = request.getTerminalAddress();
|
|
|
aiList = pointService.getAiList().get((int)publicAddress);
|
|
|
diList = pointService.getDiList().get((int)publicAddress);
|
|
|
- //todo: 启动全量传输
|
|
|
- this.start();
|
|
|
- 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;
|
|
|
- }
|
|
|
+ if (TransferReason.ACTIVATE == TransferReason.valueOf(request.getTransferReason())) {
|
|
|
+ state = SessionState.CALL_ALL;
|
|
|
+ sendMessage(BasicInstruction104.getYesGeneralCallRuleDetail104(acceptSeq, sendSeq));
|
|
|
+ //todo: 启动全量传输
|
|
|
+ this.start();
|
|
|
|
|
|
- } else {
|
|
|
- //todo: 其它命令处理
|
|
|
+ } else if (TransferReason.STOP_ACTIVATION == TransferReason.valueOf(request.getTransferReason())) {
|
|
|
+ state = SessionState.CALL_ALL_END;
|
|
|
+ //todo: 启动变化传输
|
|
|
+ this.start();
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ //todo: 其它命令处理
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}catch (Exception ex) {
|
|
|
log.error(ex.getMessage());
|
|
|
ex.printStackTrace();
|
|
|
- return null;
|
|
|
}
|
|
|
-
|
|
|
- return null;
|
|
|
}
|
|
|
|
|
|
public void start() {
|
|
@@ -158,7 +165,10 @@ public class Iec104Session {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Thread.sleep(iec104Config.getPollingInterval());
|
|
|
+ if (state == SessionState.CALL_ALL_END)
|
|
|
+ Thread.sleep(iec104Config.getChangedPushInterval());
|
|
|
+ else
|
|
|
+ Thread.sleep(iec104Config.getFullPushInterval());
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
//todo: 异常处理
|
|
@@ -182,37 +192,55 @@ public class Iec104Session {
|
|
|
}
|
|
|
|
|
|
Iec104Message msg104 = createNewMessage(isContinous, pointType);
|
|
|
- //消息地址为信息体中第一个元素的地址
|
|
|
- int firstMsgAddr = allPoints.get(0).getPointAddr();
|
|
|
- msg104.setMessageAddress(firstMsgAddr);
|
|
|
+
|
|
|
+ if (isContinous) {
|
|
|
+ //消息地址为信息体中第一个元素的地址
|
|
|
+ int firstMsgAddr = allPoints.get(0).getPointAddr();
|
|
|
+ msg104.setMessageAddress(firstMsgAddr);
|
|
|
+ }
|
|
|
|
|
|
for(int i=0;i<allPoints.size();i++) {
|
|
|
Point point = allPoints.get(i);
|
|
|
+ if (!isContinous && point.isConsumed())
|
|
|
+ continue;
|
|
|
+
|
|
|
if (pointList.size() >= maxPointsPerMessage) {
|
|
|
- msg104.setAiPointList(pointList);
|
|
|
- msg104.setSendSeq(sendSeq++);
|
|
|
+ if ("AI".equals(pointType.toUpperCase())) {
|
|
|
+ msg104.setAiPointList(pointList);
|
|
|
+ } else {
|
|
|
+ msg104.setDiPointList(pointList);
|
|
|
+ }
|
|
|
+
|
|
|
msg104.setInfosize(pointList.size());
|
|
|
- channelHandlerContext.writeAndFlush(msg104);
|
|
|
+ sendMessage(msg104);
|
|
|
+
|
|
|
+
|
|
|
//todo:考虑实现确认S帧
|
|
|
|
|
|
//重置point列表缓存,消息地址,其它内容不变
|
|
|
- if (i < aiList.size()-1) {
|
|
|
+ if (i < allPoints.size()-1) {
|
|
|
pointList = new ArrayList<>();
|
|
|
msg104 = createNewMessage(isContinous,pointType);
|
|
|
- firstMsgAddr = allPoints.get(i+1).getPointAddr();
|
|
|
-
|
|
|
- msg104.setMessageAddress(firstMsgAddr);
|
|
|
+ if (isContinous)
|
|
|
+ msg104.setMessageAddress(allPoints.get(i).getPointAddr());
|
|
|
}
|
|
|
+
|
|
|
+ ///////////////////todo :debug
|
|
|
+ //return true;
|
|
|
+ //////////////////
|
|
|
}
|
|
|
- pointList.add(aiList.get(i));
|
|
|
+ pointList.add(point);
|
|
|
point.setConsumed(true);
|
|
|
}
|
|
|
|
|
|
if (pointList.size() > 0) {
|
|
|
- msg104.setAiPointList(pointList);
|
|
|
- msg104.setSendSeq(sendSeq++);
|
|
|
+ if ("AI".equals(pointType.toUpperCase())) {
|
|
|
+ msg104.setAiPointList(pointList);
|
|
|
+ } else {
|
|
|
+ msg104.setDiPointList(pointList);
|
|
|
+ }
|
|
|
msg104.setInfosize(pointList.size());
|
|
|
- channelHandlerContext.writeAndFlush(msg104);
|
|
|
+ sendMessage(msg104);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
@@ -223,9 +251,9 @@ public class Iec104Session {
|
|
|
msg104.setAcceptSeq(acceptSeq);
|
|
|
msg104.setTransferReason((short)20);
|
|
|
if ("AI".equals(pointType.toUpperCase())) {
|
|
|
- msg104.setTypeIdentifier(TypeIdentifierEnum.shortFloatingPointTelemetry); //M_ME_TF_1
|
|
|
+ msg104.setTypeIdentifier(TypeIdentifierEnum.M_ME_TF_1); //M_ME_TF_1
|
|
|
} else {
|
|
|
- msg104.setTypeIdentifier(TypeIdentifierEnum.onePointTimeTeleindication); //M_SP_TB_1
|
|
|
+ msg104.setTypeIdentifier(TypeIdentifierEnum.M_SP_TB_1); //M_SP_TB_1
|
|
|
}
|
|
|
//todo: 设置VSQ,可变结构描述限定词
|
|
|
msg104.setContinuous(isContinous);
|
|
@@ -233,4 +261,12 @@ public class Iec104Session {
|
|
|
return msg104;
|
|
|
}
|
|
|
|
|
|
+ private synchronized void sendMessage(Iec104Message msg) {
|
|
|
+
|
|
|
+ msg.setSendSeq(sendSeq++);
|
|
|
+ log.info("send message:" + msg.getSendSeq() + ", address = " + msg.getMessageAddress()
|
|
|
+ + ",type= " + msg.getTypeIdentifier()) ;
|
|
|
+ channelHandlerContext.writeAndFlush(msg);
|
|
|
+ }
|
|
|
+
|
|
|
}
|