|
@@ -13,10 +13,10 @@ import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* @ClassName: Decoder104
|
|
|
-* @Description: 104 协议转码工具
|
|
|
-* @author YDL
|
|
|
+* @Description: 104 协议转码工具
|
|
|
+* @author YDL
|
|
|
* @date 2020年5月13日
|
|
|
*/
|
|
|
@Slf4j
|
|
@@ -28,6 +28,7 @@ public class Decoder104 {
|
|
|
* @return
|
|
|
*/
|
|
|
public static MessageDetail encoder(byte[] bytes) {
|
|
|
+ log.info("解码器: " + ByteUtil.byteArrayToHexString(bytes));
|
|
|
MessageDetail ruleDetail104 = new MessageDetail();
|
|
|
int index = 0;
|
|
|
ruleDetail104.setStart(bytes[index++]);
|
|
@@ -38,14 +39,14 @@ public class Decoder104 {
|
|
|
ruleDetail104.setMessages(new ArrayList<>());
|
|
|
// 如果只有APCI 就此返回
|
|
|
return ruleDetail104;
|
|
|
- }
|
|
|
+ }
|
|
|
// 下面是返回ASDU的结构
|
|
|
ruleDetail104.setTypeIdentifier(TypeIdentifierEnum.getTypeIdentifierEnum(bytes[index++]));
|
|
|
// 添加可变结构限定词
|
|
|
Iec104Util.setChanged(ruleDetail104, bytes[index++]);
|
|
|
ruleDetail104.setTransferReason(ByteUtil.byteArrayToShort(ByteUtil.getByte(bytes, index, 2)));
|
|
|
index += 2;
|
|
|
- //
|
|
|
+ //
|
|
|
ruleDetail104.setTerminalAddress(Iec104Util.getTerminalAddressShort(ByteUtil.getByte(bytes, index, 2)));
|
|
|
index += 2;
|
|
|
Iec104Util.setMeaageAttribute(ruleDetail104);
|
|
@@ -54,13 +55,13 @@ public class Decoder104 {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
- * @Title: setMessage
|
|
|
- * @Description: 对消息进行编码
|
|
|
+ *
|
|
|
+ * @Title: setMessage
|
|
|
+ * @Description: 对消息进行编码
|
|
|
* @param @param ruleDetail104
|
|
|
* @param @param bytes
|
|
|
- * @param @param index
|
|
|
- * @return void
|
|
|
+ * @param @param index
|
|
|
+ * @return void
|
|
|
* @throws
|
|
|
*/
|
|
|
public static void setMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
|
|
@@ -70,23 +71,23 @@ public class Decoder104 {
|
|
|
} else {
|
|
|
setNoContinuoustMessage(ruleDetail104, bytes, mesageIndex);
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
- *
|
|
|
- * @Title: setContinuoustMessage
|
|
|
- * @Description: 设置连续地址的消息
|
|
|
+ *
|
|
|
+ * @Title: setContinuoustMessage
|
|
|
+ * @Description: 设置连续地址的消息
|
|
|
* @param ruleDetail104
|
|
|
* @param bytes
|
|
|
- * @param index
|
|
|
- * @return void
|
|
|
+ * @param index
|
|
|
+ * @return void
|
|
|
* @throws
|
|
|
*/
|
|
|
public static void setContinuoustMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
|
|
|
List<MessageInfo> messages = new ArrayList<>();
|
|
|
int mesageIndex = index;
|
|
|
- // 连续的 前三个字节是地址
|
|
|
+ // 连续的 前三个字节是地址
|
|
|
// 如果是地址联系的只需要设置一个初始地址就可以了
|
|
|
// TODO 此处不处理地址
|
|
|
int messageAddress = Iec104Util.messageAddressToInt(ByteUtil.getByte(bytes, mesageIndex, 3));
|
|
@@ -128,17 +129,17 @@ public class Decoder104 {
|
|
|
ruleDetail104.setTimeScale(ByteUtil.byte2Hdate(ByteUtil.getByte(bytes, mesageIndex, 7)));
|
|
|
}
|
|
|
ruleDetail104.setMessages(messages);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
- *
|
|
|
- * @Title: setNoContinuoustMessage
|
|
|
- * @Description: 设置不连续地址的消息
|
|
|
+ *
|
|
|
+ * @Title: setNoContinuoustMessage
|
|
|
+ * @Description: 设置不连续地址的消息
|
|
|
* @param ruleDetail104
|
|
|
* @param bytes
|
|
|
- * @param index
|
|
|
- * @return void
|
|
|
+ * @param index
|
|
|
+ * @return void
|
|
|
* @throws
|
|
|
*/
|
|
|
public static void setNoContinuoustMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
|
|
@@ -152,7 +153,7 @@ public class Decoder104 {
|
|
|
// 消息地址
|
|
|
messageObj.setMessageAddress(Iec104Util.messageAddressToInt(ByteUtil.getByte(bytes, mesageIndex, 3)));
|
|
|
mesageIndex += 3;
|
|
|
-
|
|
|
+
|
|
|
if (ruleDetail104.isMessage()) {
|
|
|
// 消息集合
|
|
|
byte[] messageInfos = ByteUtil.getByte(bytes, mesageIndex, messageLength);
|
|
@@ -220,7 +221,8 @@ public class Decoder104 {
|
|
|
* 根据类型标识返回消息长度
|
|
|
*/
|
|
|
private static int getMessageLength(MessageDetail ruleDetail104) {
|
|
|
- log.info(JSON.toJSONString(ruleDetail104));
|
|
|
+ //log.info("根据类型标识返回消息长度: " + JSON.toJSONString(ruleDetail104));
|
|
|
+ log.info("返回消息长度: " + ruleDetail104.getTypeIdentifier().getMessageLength());
|
|
|
return ruleDetail104.getTypeIdentifier().getMessageLength();
|
|
|
// int messageLength = 0;
|
|
|
// switch (ruleDetail104.getTypeIdentifier().getValue()) {
|