Sfoglia il codice sorgente

变量推送的COT修改为03

songwenbin 2 anni fa
parent
commit
e10e9684a5

+ 7 - 1
gdnxfgs/src/main/java/com/gyee/edge/gddlly/iec104/Iec104Message.java

@@ -14,7 +14,13 @@ import java.util.List;
  */
 @Data
 public class Iec104Message {
-	
+
+
+	/**
+	 * U帧直接拼
+	 */
+	private byte[] udata;
+
 	/**
 	 * 启动字符 固定 一个字节
 	 */

+ 17 - 5
gdnxfgs/src/main/java/com/gyee/edge/gddlly/iec104/Iec104Session.java

@@ -62,7 +62,7 @@ public class Iec104Session {
             return;
 
         try {
-            acceptSeq++;
+
             if (request.getTypeIdentifier() == null) {
                 //U帧或S帧处理
                 //TODO: 标准化处理,状态校验
@@ -78,6 +78,7 @@ public class Iec104Session {
                         break;
                     case 0x43: //测试命令
                         response = BasicInstruction104.createSysMessage(UControlEnum.TESTFR_YES);
+                        break;
                     case 0x13: //停止命令
                         state = SessionState.STOP104;
                         //todo: 停止数据的发送
@@ -88,12 +89,13 @@ public class Iec104Session {
                         break;
                 }
                 if (response != null)
-                    sendMessage(response);
+                    sendMessage2(response);
 
                 if (state == SessionState.START104)
                     this.start();
                     //channelHandlerContext.writeAndFlush(response);
             } else {
+                acceptSeq++;
                 //acceptSeq = (short)(request.getSendSeq() + 1);
                 if (request.getTypeIdentifier() == TypeIdentifierEnum.generalCall) {
                     // 总召唤命令
@@ -278,7 +280,10 @@ public class Iec104Session {
     private Iec104Message createNewMessage(boolean isContinous, String pointType) {
         Iec104Message msg104 = new Iec104Message();
         msg104.setAcceptSeq(acceptSeq);
-        msg104.setTransferReason((short)20);
+        if (isContinous)
+            msg104.setTransferReason((short)20);
+        else
+            msg104.setTransferReason((short)3);
         if ("AI".equals(pointType.toUpperCase())) {
             msg104.setTypeIdentifier(TypeIdentifierEnum.M_ME_TF_1); //M_ME_TF_1
         } else {
@@ -297,6 +302,13 @@ public class Iec104Session {
         channelHandlerContext.writeAndFlush(msg);
     }
 
+    private synchronized void sendMessage2(Iec104Message msg) {
+//        msg.setSendSeq(sendSeq++);
+//        log.info("send message:" + msg.getSendSeq() + ", address = " + msg.getMessageAddress()
+//                + ",type= " + msg.getTypeIdentifier()) ;
+        channelHandlerContext.writeAndFlush(msg);
+    }
+
 
     private Thread getTest104Thread() {
         return new Thread(new Runnable() {
@@ -307,8 +319,8 @@ public class Iec104Session {
                     while(isStarted) {
                         try {
                             //间隔发送104测试帧
-                            Iec104Message testMessage = BasicInstruction104.createSysMessage(UControlEnum.TESTFR_YES);
-                            sendMessage(testMessage);
+                            Iec104Message testMessage = BasicInstruction104.createSysMessage(UControlEnum.TESTFR);
+                            sendMessage2(testMessage);
                             Thread.sleep(iec104Config.getSendSysFrameInterval());
                         } catch (Exception e) {
                             log.error(e.getMessage());

+ 8 - 0
gdnxfgs/src/main/java/com/gyee/edge/gddlly/iec104/builder/Encoder104.java

@@ -5,6 +5,7 @@ import com.gyee.edge.gddlly.config.Point;
 import com.gyee.edge.gddlly.iec104.Iec104Util;
 import com.gyee.edge.gddlly.iec104.Iec104Message;
 import com.gyee.edge.gddlly.iec104.MessageInfo;
+import com.gyee.edge.gddlly.iec104.protocol.TypeIdentifierEnum;
 import com.gyee.edge.gddlly.utils.ByteUtil;
 import lombok.extern.slf4j.Slf4j;
 
@@ -20,10 +21,17 @@ public class Encoder104 {
 		bytes.write(msg104.getStart());
 		byte[]  apduBytes = getApduBytes(msg104);
 		int messageLen =  apduBytes.length;
+		if (msg104.getTypeIdentifier() == TypeIdentifierEnum.generalCall && apduBytes.length == 10) {
+			messageLen = 14;
+		}
 		msg104.setApduLength(messageLen);
 		bytes.write((byte) messageLen);
 		bytes.write(apduBytes);
 
+		if (msg104.getTypeIdentifier() == TypeIdentifierEnum.generalCall && apduBytes.length == 10) {
+			bytes.write(new byte[] {0x00, 0x00,0x00, 0x14});
+		}
+
 		return bytes.toByteArray();
 	}
 	

+ 7 - 2
gdnxfgs/src/main/java/com/gyee/edge/gddlly/iec104/handler/Iec104Encoder.java

@@ -23,8 +23,13 @@ public class Iec104Encoder extends MessageToByteEncoder<Iec104Message> {
 	@Override
 	protected void encode(ChannelHandlerContext ctx, Iec104Message msg, ByteBuf out) throws Exception {
 		try {
-			byte[] bytes = Encoder104.encoder(msg);
-			out.writeBytes(bytes);
+			if (msg.getUdata() != null) {
+				out.writeBytes(msg.getUdata());
+			} else {
+				byte[] bytes = Encoder104.encoder(msg);
+				out.writeBytes(bytes);
+			}
+
 		} catch (Exception e) {
 //			log.error(e.getMessage());
 //			e.printStackTrace();

+ 16 - 2
gdnxfgs/src/main/java/com/gyee/edge/gddlly/iec104/protocol/BasicInstruction104.java

@@ -173,8 +173,22 @@ public class BasicInstruction104 {
 
 	//U帧消息创建
 	public static Iec104Message createSysMessage(UControlEnum cmd) {
-		byte[] control = ByteUtil.intToByteArray(cmd.getValue());
-		return new Iec104Message(control);
+		Iec104Message msg = new Iec104Message();
+
+		if (cmd == UControlEnum.STARTDT_YES)
+			msg.setUdata(BasicInstruction104.STARTDT_YES);
+		else if (cmd == UControlEnum.STARTDT)
+			msg.setUdata(BasicInstruction104.STARTDT);
+		else if (cmd == UControlEnum.STOPDT_YES)
+			msg.setUdata(BasicInstruction104.STOPDT_YES);
+		else if (cmd == UControlEnum.TESTFR)
+			msg.setUdata(BasicInstruction104.TESTFR);
+		else
+			msg.setUdata(BasicInstruction104.TESTFR_YES);
+
+		return msg;
+
+
 	}
 
 }