Commit 4de510b1 authored by 高东东's avatar 高东东

104bug修改

parent 7250c178
...@@ -87,7 +87,10 @@ public class ClientHandler extends SimpleChannelInboundHandler<Apdu>{ ...@@ -87,7 +87,10 @@ public class ClientHandler extends SimpleChannelInboundHandler<Apdu>{
connetOk = false; connetOk = false;
} else if (apdu.getApciType() == Apdu.ApciType.TESTFR_ACT) { } else if (apdu.getApciType() == Apdu.ApciType.TESTFR_ACT) {
ctx.channel().writeAndFlush("680483000000", promise); ctx.channel().writeAndFlush("680483000000", promise);
if (startZZ) {
startZZ = false;
sendZzCommand();
}
Logger.getLogger(this.getClass()).debug("确认测试消息,U类型"); Logger.getLogger(this.getClass()).debug("确认测试消息,U类型");
} else if (apdu.getApciType() == Apdu.ApciType.STARTDT_CON) { } else if (apdu.getApciType() == Apdu.ApciType.STARTDT_CON) {
Logger.getLogger(this.getClass()).debug("启动确认帧回复,U类型"); Logger.getLogger(this.getClass()).debug("启动确认帧回复,U类型");
......
...@@ -70,7 +70,11 @@ public class IEC104NewHandler extends SimpleChannelInboundHandler<Apdu>{ ...@@ -70,7 +70,11 @@ public class IEC104NewHandler extends SimpleChannelInboundHandler<Apdu>{
close(); close();
} else if (apdu.getApciType() == Apdu.ApciType.TESTFR_ACT) { } else if (apdu.getApciType() == Apdu.ApciType.TESTFR_ACT) {
handleBlockingSendQueue.add("680483000000"); handleBlockingSendQueue.add("680483000000");
Logger.getLogger(this.getClass()).debug("确认测试消息,U类型"); if (eecruiting_Communication == null) {
eecruiting_Communication = Executors.newSingleThreadScheduledExecutor();
eecruiting_Communication.scheduleAtFixedRate(Recruiting_runnable, Constant.Z_Z_INITIALDELAY, Constant.Z_Z_PREIOD, TimeUnit.SECONDS);
}
Logger.getLogger(this.getClass()).debug("确认测试消息,U类型");
} else if (apdu.getApciType() == Apdu.ApciType.STARTDT_CON) { } else if (apdu.getApciType() == Apdu.ApciType.STARTDT_CON) {
Logger.getLogger(this.getClass()).debug("启动确认帧回复,U类型"); Logger.getLogger(this.getClass()).debug("启动确认帧回复,U类型");
if (startService != null) { if (startService != null) {
......
...@@ -6,226 +6,246 @@ import java.util.concurrent.Executors; ...@@ -6,226 +6,246 @@ import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import com.yeejoin.amos.iec104.tcp.entity.*;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import com.yeejoin.amos.iec104.business.entity.mybatis.RecData; import com.yeejoin.amos.iec104.business.entity.mybatis.RecData;
import com.yeejoin.amos.iec104.tcp.entity.Apdu;
import com.yeejoin.amos.iec104.tcp.entity.Asdu;
import com.yeejoin.amos.iec104.tcp.entity.IeCP56Time2a;
import com.yeejoin.amos.iec104.tcp.entity.IeQuality;
import com.yeejoin.amos.iec104.tcp.entity.IeShortFloat;
import com.yeejoin.amos.iec104.tcp.entity.IeSinglePointWithQuality;
import com.yeejoin.amos.iec104.tcp.entity.InformationElement;
import com.yeejoin.amos.iec104.tcp.entity.InformationObject;
import com.yeejoin.amos.iec104.tcp.entity.ServerData;
public class ApduQueue { public class ApduQueue {
private static final BlockingQueue<ServerData> blockingQueue = new LinkedBlockingQueue<ServerData>(); private static final BlockingQueue<ServerData> blockingQueue = new LinkedBlockingQueue<ServerData>();
ScheduledExecutorService service_apdu = null; ScheduledExecutorService service_apdu = null;
private volatile static ApduQueue instance = null; private volatile static ApduQueue instance = null;
private ApduQueue() {} private ApduQueue() {
}
public static ApduQueue getInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块 public static ApduQueue getInstance() {
if(instance == null){ //先检查实例是否存在,如果不存在才进入下面的同步块
//同步块,线程安全的创建实例 if (instance == null) {
synchronized(ApduQueue.class){ //同步块,线程安全的创建实例
//再次检查实例是否存在,如果不存在才真的创建实例 synchronized (ApduQueue.class) {
if(instance == null){ //再次检查实例是否存在,如果不存在才真的创建实例
instance = new ApduQueue(); if (instance == null) {
} instance = new ApduQueue();
} }
} }
return instance; }
return instance;
} }
/** /**
* 启动apdu数据消费任务 * 启动apdu数据消费任务
*/ */
public void start() { public void start() {
service_apdu = Executors.newSingleThreadScheduledExecutor(); service_apdu = Executors.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间 // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
service_apdu.execute(task_runnable); service_apdu.execute(task_runnable);
}
public void add(ServerData apdu) {
blockingQueue.add(apdu);
} }
public void add(ServerData apdu) { Runnable task_runnable = new Runnable() {
blockingQueue.add(apdu);
}
Runnable task_runnable = new Runnable() {
public void run() { public void run() {
while(true) { while (true) {
try { try {
ServerData serverData = blockingQueue.take(); ServerData serverData = blockingQueue.take();
String serverId = serverData.getServerId(); String serverId = serverData.getServerId();
Apdu apdu = serverData.getApdu(); Apdu apdu = serverData.getApdu();
if (apdu.getApciType() == Apdu.ApciType.I_FORMAT) { if (apdu.getApciType() == Apdu.ApciType.I_FORMAT) {
Asdu asdu = apdu.getAsdu(); Asdu asdu = apdu.getAsdu();
int numberOfSequenceElements = 0; int numberOfSequenceElements = 0;
switch (asdu.getTypeId()) { switch (asdu.getTypeId()) {
// 1 单点遥信 // 1 单点遥信
case 1: case 1:
InformationObject[] informationObjects = asdu.getInformationObjects(); InformationObject[] informationObjects = asdu.getInformationObjects();
for (InformationObject obj : informationObjects) { for (InformationObject obj : informationObjects) {
InformationElement[][] informationElement = obj.getInformationElements(); InformationElement[][] informationElement = obj.getInformationElements();
int informationObjectAddress = obj.getInformationObjectAddress(); int informationObjectAddress = obj.getInformationObjectAddress();
numberOfSequenceElements = asdu.getSequenceLength(); numberOfSequenceElements = asdu.getSequenceLength();
asdu.isSequenceOfElements(); asdu.isSequenceOfElements();
for (int i = 0; i < numberOfSequenceElements; i++) { for (int i = 0; i < numberOfSequenceElements; i++) {
RecData data = new RecData(serverId); RecData data = new RecData(serverId);
data.setCommonAddress(asdu.getCommonAddress()); data.setCommonAddress(asdu.getCommonAddress());
data.setCreatedTime(new Date()); data.setCreatedTime(new Date());
data.setDataType(1); data.setDataType(1);
data.setInformationAddress(informationObjectAddress); data.setInformationAddress(informationObjectAddress);
IeSinglePointWithQuality singlePoint = (IeSinglePointWithQuality) informationElement[i][0]; IeSinglePointWithQuality singlePoint = (IeSinglePointWithQuality) informationElement[i][0];
data.setIsBlocked(singlePoint.isBlocked() ? 0 : 1); data.setIsBlocked(singlePoint.isBlocked() ? 0 : 1);
data.setIsSubstituted(singlePoint.isSubstituted() ? 0 : 1); data.setIsSubstituted(singlePoint.isSubstituted() ? 0 : 1);
data.setIsNotTopical(singlePoint.isNotTopical() ? 0 : 1); data.setIsNotTopical(singlePoint.isNotTopical() ? 0 : 1);
data.setIsInvalid(singlePoint.isInvalid() ? 0 : 1); data.setIsInvalid(singlePoint.isInvalid() ? 0 : 1);
data.setValue(singlePoint.isOn() + ""); data.setValue(singlePoint.isOn() + "");
informationObjectAddress++; informationObjectAddress++;
data.setQuality(singlePoint.toJson().toString()); data.setQuality(singlePoint.toJson().toString());
RecDataQueue.getInstance().add(data); RecDataQueue.getInstance().add(data);
} }
} }
break; break;
// 13 浮点型遥测 // 13 浮点型遥测
case 13: case 9:
InformationObject[] floatInformationObjects = asdu.getInformationObjects(); InformationObject[] shortfloatInformationObjects = asdu.getInformationObjects();
numberOfSequenceElements = asdu.getSequenceLength(); numberOfSequenceElements = asdu.getSequenceLength();
for (int i = 0; i < numberOfSequenceElements; i++) { for (int i = 0; i < numberOfSequenceElements; i++) {
InformationObject obj = floatInformationObjects[i]; InformationObject obj = shortfloatInformationObjects[i];
InformationElement[][] informationElement = obj.getInformationElements(); InformationElement[][] informationElement = obj.getInformationElements();
int informationObjectAddress = obj.getInformationObjectAddress(); int informationObjectAddress = obj.getInformationObjectAddress();
RecData data = new RecData(serverId);
data.setCommonAddress(asdu.getCommonAddress());
data.setCreatedTime(new Date());
data.setDataType(2);
data.setInformationAddress(informationObjectAddress);
IeShort shortFloat = (IeShort) informationElement[0][0];
IeQuality ieQuality = (IeQuality) informationElement[0][1];
data.setValue(String.format("%.2f",shortFloat.getValue()));
data.setQuality(ieQuality.toJson().toString());
data.setIsBlocked(ieQuality.isBlocked() ? 0 : 1);
data.setIsSubstituted(ieQuality.isSubstituted() ? 0 : 1);
data.setIsNotTopical(ieQuality.isNotTopical() ? 0 : 1);
data.setIsInvalid(ieQuality.isInvalid() ? 0 : 1);
data.setIsOverflow(ieQuality.isOverflow() ? 0 : 1);
informationObjectAddress++;
RecDataQueue.getInstance().add(data);
// }
}
case 13:
InformationObject[] floatInformationObjects = asdu.getInformationObjects();
numberOfSequenceElements = asdu.getSequenceLength();
for (int i = 0; i < numberOfSequenceElements; i++) {
InformationObject obj = floatInformationObjects[i];
InformationElement[][] informationElement = obj.getInformationElements();
int informationObjectAddress = obj.getInformationObjectAddress();
// for (int i = 0; i < numberOfSequenceElements; i++) { // for (int i = 0; i < numberOfSequenceElements; i++) {
RecData data = new RecData(serverId); RecData data = new RecData(serverId);
data.setCommonAddress(asdu.getCommonAddress()); data.setCommonAddress(asdu.getCommonAddress());
data.setCreatedTime(new Date()); data.setCreatedTime(new Date());
data.setDataType(2); data.setDataType(2);
data.setInformationAddress(informationObjectAddress); data.setInformationAddress(informationObjectAddress);
IeShortFloat shortFloat = (IeShortFloat) informationElement[0][0]; IeShortFloat shortFloat = (IeShortFloat) informationElement[0][0];
IeQuality ieQuality = (IeQuality) informationElement[0][1]; IeQuality ieQuality = (IeQuality) informationElement[0][1];
data.setValue(shortFloat.getValue() + ""); data.setValue(String.format("%.2f",shortFloat.getValue()));
data.setQuality(ieQuality.toJson().toString()); data.setQuality(ieQuality.toJson().toString());
data.setIsBlocked(ieQuality.isBlocked() ? 0 : 1); data.setIsBlocked(ieQuality.isBlocked() ? 0 : 1);
data.setIsSubstituted(ieQuality.isSubstituted() ? 0 : 1); data.setIsSubstituted(ieQuality.isSubstituted() ? 0 : 1);
data.setIsNotTopical(ieQuality.isNotTopical() ? 0 : 1); data.setIsNotTopical(ieQuality.isNotTopical() ? 0 : 1);
data.setIsInvalid(ieQuality.isInvalid() ? 0 : 1); data.setIsInvalid(ieQuality.isInvalid() ? 0 : 1);
data.setIsOverflow(ieQuality.isOverflow() ? 0: 1); data.setIsOverflow(ieQuality.isOverflow() ? 0 : 1);
informationObjectAddress++; informationObjectAddress++;
RecDataQueue.getInstance().add(data); RecDataQueue.getInstance().add(data);
// } // }
} }
break; break;
// 21 浮点型遥测 // 21 浮点型遥测
case 21: case 21:
InformationObject[] normalizedObjects = asdu.getInformationObjects(); InformationObject[] normalizedObjects = asdu.getInformationObjects();
numberOfSequenceElements = asdu.getSequenceLength(); numberOfSequenceElements = asdu.getSequenceLength();
for (int i = 0; i < numberOfSequenceElements; i++) { for (int i = 0; i < numberOfSequenceElements; i++) {
InformationObject obj = normalizedObjects[i]; InformationObject obj = normalizedObjects[i];
InformationElement[][] informationElement = obj.getInformationElements(); InformationElement[][] informationElement = obj.getInformationElements();
int informationObjectAddress = obj.getInformationObjectAddress(); int informationObjectAddress = obj.getInformationObjectAddress();
RecData data = new RecData(serverId); RecData data = new RecData(serverId);
data.setCommonAddress(asdu.getCommonAddress()); data.setCommonAddress(asdu.getCommonAddress());
data.setCreatedTime(new Date()); data.setCreatedTime(new Date());
data.setDataType(2); data.setDataType(2);
data.setInformationAddress(informationObjectAddress); data.setInformationAddress(informationObjectAddress);
IeShortFloat shortFloat = (IeShortFloat) informationElement[0][0]; IeShortFloat shortFloat = (IeShortFloat) informationElement[0][0];
data.setValue(shortFloat.getValue() + ""); data.setValue(String.format("%.2f",shortFloat.getValue()));
informationObjectAddress++; informationObjectAddress++;
RecDataQueue.getInstance().add(data); RecDataQueue.getInstance().add(data);
} }
break; break;
// 30 带 CP56Time2a 时标的单点信息 // 30 带 CP56Time2a 时标的单点信息
case 30: case 30:
InformationObject[] informationCP56Time2aObjects = asdu.getInformationObjects(); InformationObject[] informationCP56Time2aObjects = asdu.getInformationObjects();
// for (InformationObject obj : informationCP56Time2aObjects) { // for (InformationObject obj : informationCP56Time2aObjects) {
numberOfSequenceElements = asdu.getSequenceLength(); numberOfSequenceElements = asdu.getSequenceLength();
for (int i = 0; i < numberOfSequenceElements; i++) { for (int i = 0; i < numberOfSequenceElements; i++) {
InformationObject obj = informationCP56Time2aObjects[i]; InformationObject obj = informationCP56Time2aObjects[i];
InformationElement[][] informationElement = obj.getInformationElements(); InformationElement[][] informationElement = obj.getInformationElements();
int informationObjectAddress = obj.getInformationObjectAddress(); int informationObjectAddress = obj.getInformationObjectAddress();
// asdu.isSequenceOfElements(); // asdu.isSequenceOfElements();
RecData data = new RecData(serverId); RecData data = new RecData(serverId);
data.setCommonAddress(asdu.getCommonAddress()); data.setCommonAddress(asdu.getCommonAddress());
data.setCreatedTime(new Date()); data.setCreatedTime(new Date());
data.setDataType(1); data.setDataType(1);
data.setInformationAddress(informationObjectAddress); data.setInformationAddress(informationObjectAddress);
IeSinglePointWithQuality singlePoint = (IeSinglePointWithQuality) informationElement[0][0]; IeSinglePointWithQuality singlePoint = (IeSinglePointWithQuality) informationElement[0][0];
IeCP56Time2a ieCP56Time2a = (IeCP56Time2a) informationElement[0][1]; IeCP56Time2a ieCP56Time2a = (IeCP56Time2a) informationElement[0][1];
data.setValue(singlePoint.isOn() + ""); data.setValue(singlePoint.isOn() + "");
data.setOccurTime(ieCP56Time2a.getDate()); data.setOccurTime(ieCP56Time2a.getDate());
data.setSoe(1); data.setSoe(1);
data.setQuality(singlePoint.toJson().toString()); data.setQuality(singlePoint.toJson().toString());
data.setIsBlocked(singlePoint.isBlocked() ? 0 : 1); data.setIsBlocked(singlePoint.isBlocked() ? 0 : 1);
data.setIsSubstituted(singlePoint.isSubstituted() ? 0 : 1); data.setIsSubstituted(singlePoint.isSubstituted() ? 0 : 1);
data.setIsNotTopical(singlePoint.isNotTopical() ? 0 : 1); data.setIsNotTopical(singlePoint.isNotTopical() ? 0 : 1);
data.setIsInvalid(singlePoint.isInvalid() ? 0 : 1); data.setIsInvalid(singlePoint.isInvalid() ? 0 : 1);
Logger.getLogger(this.getClass()).debug("31类型 I帧: " +data.toString()); Logger.getLogger(this.getClass()).debug("31类型 I帧: " + data.toString());
RecDataQueue.getInstance().add(data); RecDataQueue.getInstance().add(data);
// } // }
} }
break; break;
// 31 带 CP56Time2a 时标的双点信息 // 31 带 CP56Time2a 时标的双点信息
case 31: case 31:
InformationObject[] twoInformationCP56Time2aObjects = asdu.getInformationObjects(); InformationObject[] twoInformationCP56Time2aObjects = asdu.getInformationObjects();
numberOfSequenceElements = asdu.getSequenceLength(); numberOfSequenceElements = asdu.getSequenceLength();
//for (InformationObject obj : twoInformationCP56Time2aObjects) { //for (InformationObject obj : twoInformationCP56Time2aObjects) {
for (int i = 0; i < numberOfSequenceElements; i++) { for (int i = 0; i < numberOfSequenceElements; i++) {
InformationObject obj = twoInformationCP56Time2aObjects[i]; InformationObject obj = twoInformationCP56Time2aObjects[i];
InformationElement[][] informationElement = obj.getInformationElements(); InformationElement[][] informationElement = obj.getInformationElements();
int informationObjectAddress = obj.getInformationObjectAddress(); int informationObjectAddress = obj.getInformationObjectAddress();
asdu.isSequenceOfElements(); asdu.isSequenceOfElements();
RecData data = new RecData(serverId); RecData data = new RecData(serverId);
data.setCommonAddress(asdu.getCommonAddress()); data.setCommonAddress(asdu.getCommonAddress());
data.setCreatedTime(new Date()); data.setCreatedTime(new Date());
data.setDataType(1); data.setDataType(1);
data.setInformationAddress(informationObjectAddress); data.setInformationAddress(informationObjectAddress);
IeSinglePointWithQuality singlePoint = (IeSinglePointWithQuality) informationElement[0][0]; IeSinglePointWithQuality singlePoint = (IeSinglePointWithQuality) informationElement[0][0];
IeCP56Time2a ieCP56Time2a = (IeCP56Time2a) informationElement[0][2]; IeCP56Time2a ieCP56Time2a = (IeCP56Time2a) informationElement[0][2];
data.setValue(singlePoint.isOn() + ""); data.setValue(singlePoint.isOn() + "");
data.setOccurTime(ieCP56Time2a.getDate()); data.setOccurTime(ieCP56Time2a.getDate());
data.setQuality(singlePoint.toJson().toString()); data.setQuality(singlePoint.toJson().toString());
data.setIsBlocked(singlePoint.isBlocked() ? 0 : 1); data.setIsBlocked(singlePoint.isBlocked() ? 0 : 1);
data.setIsSubstituted(singlePoint.isSubstituted() ? 0 : 1); data.setIsSubstituted(singlePoint.isSubstituted() ? 0 : 1);
data.setIsNotTopical(singlePoint.isNotTopical() ? 0 : 1); data.setIsNotTopical(singlePoint.isNotTopical() ? 0 : 1);
data.setIsInvalid(singlePoint.isInvalid() ? 0 : 1); data.setIsInvalid(singlePoint.isInvalid() ? 0 : 1);
data.setSoe(1); data.setSoe(1);
RecDataQueue.getInstance().add(data); RecDataQueue.getInstance().add(data);
informationObjectAddress++; informationObjectAddress++;
RecData data1 = new RecData(); RecData data1 = new RecData();
BeanUtils.copyProperties(data, data1); BeanUtils.copyProperties(data, data1);
data1.setInformationAddress(informationObjectAddress); data1.setInformationAddress(informationObjectAddress);
IeSinglePointWithQuality singlePoint1 = (IeSinglePointWithQuality) informationElement[0][1]; IeSinglePointWithQuality singlePoint1 = (IeSinglePointWithQuality) informationElement[0][1];
data1.setQuality(singlePoint1.toJson().toString()); data1.setQuality(singlePoint1.toJson().toString());
RecDataQueue.getInstance().add(data1); RecDataQueue.getInstance().add(data1);
//} //}
} }
break; break;
default: default:
Logger.getLogger(this.getClass()).error("其他类型 I帧: " + asdu.getTypeId()); Logger.getLogger(this.getClass()).error("其他类型 I帧: " + asdu.getTypeId());
} }
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Logger.getLogger(this.getClass()).error(e.getMessage()); Logger.getLogger(this.getClass()).error(e.getMessage());
} }
} }
} }
}; };
......
package com.yeejoin.amos.iec104.tcp.entity;
import io.netty.buffer.ByteBuf;
import java.io.IOException;
public class IeShort extends InformationElement {
private final float value;
public IeShort(float value) {
this.value = value;
}
public IeShort(ByteBuf is) throws IOException {
value = Float.intBitsToFloat((is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8));
}
@Override
public int encode(byte[] buffer, int i) {
int tempVal = Float.floatToIntBits(value);
buffer[i++] = (byte) tempVal;
buffer[i] = (byte) (tempVal >> 8);
return 2;
}
public float getValue() {
return value;
}
@Override
public String toString() {
return "短浮点数值: " + value;
}
}
...@@ -40,6 +40,16 @@ public class InformationObject { ...@@ -40,6 +40,16 @@ public class InformationObject {
} }
break; break;
// 9 测量值, 规一化值
case 9:
informationElements = new InformationElement[numberOfSequenceElements][2];
for (int i = 0; i < numberOfSequenceElements; i++) {
informationElements[i][0] = new IeShort(is);
informationElements[i][1] = new IeQuality(is);
log.debug("9 浮点型遥测1: " + i + "--->" + informationElements[i][0].toString());
log.debug("9 浮点型遥测2: " + i + "--->" + informationElements[i][1].toString());
}
break;
// 13 浮点型遥测 // 13 浮点型遥测
case 13: case 13:
informationElements = new InformationElement[numberOfSequenceElements][2]; informationElements = new InformationElement[numberOfSequenceElements][2];
...@@ -54,7 +64,7 @@ public class InformationObject { ...@@ -54,7 +64,7 @@ public class InformationObject {
case 21: case 21:
informationElements = new InformationElement[numberOfSequenceElements][1]; informationElements = new InformationElement[numberOfSequenceElements][1];
for (int i = 0; i < numberOfSequenceElements; i++) { for (int i = 0; i < numberOfSequenceElements; i++) {
informationElements[i][0] = new IeShortFloat(is); informationElements[i][0] = new IeShort(is);
log.debug("21 浮点型遥测, 不带品质描述词的规一化值: " + i + "--->" + informationElements[i][0].toString()); log.debug("21 浮点型遥测, 不带品质描述词的规一化值: " + i + "--->" + informationElements[i][0].toString());
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment