diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 12d1c18..736bc18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -13,11 +13,12 @@ import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.message.command.read.ReadCH4StatusCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -123,17 +124,25 @@ // 3根据参数类型调用相应的方法进行解析 switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - received = bytesToReadCH4ParamCommand(finsFrame); + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, readCmd); break; case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + received = bytesToReadCH4StatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, readCmd); break; } - // 4将有效的命令的是否有响应字段置1 - readCmdDao.updateCmdRecordResponsed(readCmd.getId()); + // 4将已响应的命令删除 + readCmdDao.deleteCmdRecord(readCmd.getId()); } } else if (commandCode.equalsIgnoreCase("0102")) { @@ -320,6 +329,7 @@ } + /** * 将握手响应字节数组转换为消息对象 * @@ -352,15 +362,15 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4ParamCommand(FINSByteFrame finsFrame) { - ReadCH4ParamCommandResponse rcpcr = new ReadCH4ParamCommandResponse(); + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadCH4ValueCommandResponse rcpcr = new ReadCH4ValueCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; rcpcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = data.length / (2 * 2 * 2); //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占2个字,每个字占2个字节 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 for (int i = 0; i < chct; i++) { byte[] valueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; byte[] thresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; @@ -383,7 +393,7 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; @@ -391,7 +401,7 @@ if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); @@ -401,3097 +411,92 @@ rcscr.getJwldbj().add(ldBit == '1' ? true : false); } } - + return rcscr; } -// -// /** -// * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryAddressResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryAddressCommandResponse qacr = new QueryAddressCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String addressRes = ByteUtil.bcdToString(new byte[] { data[0], data[1], data[2] }) + -// ByteUtil.binToHexString(new byte[] { data[4], data[3] }); -// if (addressRes.length() == 10) { -// qacr.setValid(true); -// qacr.setAddress(addressRes); -// } else { -// logger.error("查询终端地址响应消息解析错误"); -// qacr.setValid(false); -// } -// } else { -// logger.error("查询终端地址响应消息长度错误"); -// qacr.setValid(false); -// } -// -// return qacr; -// } -// -// /** -// * 将设置终端时钟响应消息字节数组解析为消息对象AFN=11H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetClockCommandResponse sccr = new SetClockCommandResponse(Calendar.getInstance(), address); -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// try { -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// sccr.setValid(false); -// return sccr; -// } catch (Exception re) { -// logger.error("时间字段解析异常"); -// sccr.setValid(false); -// return sccr; -// } -// -// sccr.setNewClock(clock); -// -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端时钟响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端时钟响应消息字节数组解析为消息对象AFN=51H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryClockCommandResponse qccr = new QueryClockCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// try { -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// qccr.setValid(false); -// return qccr; -// } -// -// qccr.setClock(clock); -// qccr.setValid(true); -// } else { -// logger.error("查询终端时钟响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端工作模式响应消息字节数组解析为消息对象AFN=12H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPatternCommandResponse spcr = new SetPatternCommandResponse(Calendar.getInstance(), address); -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setWorkPattern(patternRes); -// } else { -// logger.error("设置终端工作模式响应消息长度错误"); -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端工作模式响应消息字节数组解析为消息对象AFN=52H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryPatternCommandResponse qpcr = new QueryPatternCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// qpcr.setValid(true); -// qpcr.setWorkPattern(patternRes); -// } else { -// logger.error("查询终端工作模式响应消息长度错误"); -// qpcr.setValid(false); -// } -// -// return qpcr; -// } -// -// /** -// * 将设置终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=A1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetIntervalCommandResponse sicr = new SetIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// sicr.setValid(true); -// sicr.setIntervals(intervals); -// -// sicr.setValid(true); -// sicr.setSuccess(true); -// } else { -// logger.error("设置终端自报种类及时间间隔响应消息长度错误"); -// sicr.setValid(false); -// } -// -// return sicr; -// } -// -// /** -// * 将查询终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=53H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryIntervalCommandResponse qicr = new QueryIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// qicr.setValid(true); -// qicr.setIntervals(intervals); -// } else { -// logger.error("查询终端自报种类及时间间隔响应消息长度错误"); -// qicr.setValid(false); -// } -// -// return qicr; -// } -// -// /** -// * 将设置终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=A0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetRttypesCommandResponse srcr = new SetRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// srcr.setRttypes(rttypes); -// -// srcr.setValid(true); -// srcr.setSuccess(true); -// } else { -// logger.error("设置终端需查询的实时数据种类响应消息长度错误"); -// srcr.setValid(false); -// } -// -// return srcr; -// } -// -// /** -// * 将查询终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=54H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRttypesCommandResponse qrcr = new QueryRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// -// qrcr.setValid(true); -// qrcr.setRttypes(rttypes); -// } else { -// logger.error("查询终端需查询的实时数据种类响应消息长度错误"); -// qrcr.setValid(false); -// } -// -// return qrcr; -// } -// -// /** -// * 将设置终端充值量响应消息字节数组解析为消息对象AFN=15H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetChargingCommandResponse sccr = new SetChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// -// sccr.setCharging(Integer.parseInt(charging)); -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端充值量响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端充值量和剩余水量响应消息字节数组解析为消息对象AFN=55H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryChargingCommandResponse qccr = new QueryChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 9) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[8] & 0x7F), data[7], data[6], data[5], data[4] }); -// -// if (charging.equals("") == false && current.equals("") == false) { -// qccr.setValid(true); -// qccr.setCharging(Integer.parseInt(charging)); -// // 判断剩余水量正负符号 -// if ((data[8] & 0x80) == 0x80) { -// qccr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qccr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息解析错误"); -// qccr.setValid(false); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端剩余水量报警值响应消息字节数组解析为消息对象AFN=16H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWarningCommandResponse swcr = new SetWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 3) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (warning.equals("") == false) { -// swcr.setNewWarning(Integer.parseInt(warning)); -// } -// -// swcr.setValid(true); -// swcr.setSuccess(true); -// } else { -// logger.error("设置终端剩余水量报警值响应消息长度错误"); -// swcr.setValid(false); -// } -// -// return swcr; -// } -// -// /** -// * 将查询终端剩余水量报警值响应消息字节数组解析为消息对象AFN=56H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWarningCommandResponse qwcr = new QueryWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[7] & 0x7F), data[6], data[5], data[4], data[3] }); -// -// if (warning.equals("") == false && current.equals("") == false) { -// qwcr.setValid(true); -// qwcr.setWarning(Integer.parseInt(warning)); -// // 判断剩余水量正负符号 -// if ((data[7] & 0x80) == 0x80) { -// qwcr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qwcr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息解析错误"); -// qwcr.setValid(false); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息长度错误"); -// qwcr.setValid(false); -// } -// -// return qwcr; -// } -// -// /** -// * 将设置终端水位参数响应消息字节数组解析为消息对象AFN=17H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWlParamCommandResponse swpcr = new SetWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 7 == 0) { -// int n = data.length / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// swpcr.setWlParams(wlParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水位参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水位参数响应消息字节数组解析为消息对象AFN=57H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWlParamCommandResponse qwpcr = new QueryWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 9 && data.length % 7 == 2) { -// int n = (data.length - 2) / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWlParams(wlParams); -// qwpcr.setValid(true); -// -// } else { -// logger.error("查询水位参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=18H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWpParamCommandResponse swpcr = new SetWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 8 && data.length % 8 == 0) { -// int n = data.length / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// swpcr.setWpParams(wpParams); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水压参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数响应消息字节数组解析为消息对象AFN=58H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWpParamCommandResponse qwpcr = new QueryWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 10 && data.length % 8 == 2) { -// int n = (data.length - 2) / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWpParams(wpParams); -// qwpcr.setValid(true); -// } else { -// logger.error("查询水压参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=19H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqUpperParamCommandResponse swpcr = new SetWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=1AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqLowerParamCommandResponse swpcr = new SetWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数上限响应消息字节数组解析为消息对象AFN=59H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqUpperParamCommandResponse qwpcr = new QueryWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将查询终端水压参数下限响应消息字节数组解析为消息对象AFN=5AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqLowerParamCommandResponse qwpcr = new QueryWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端流量参数响应消息字节数组解析为消息对象AFN=1FH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWfParamCommandResponse swpcr = new SetWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// swpcr.setNewUppers(uppers); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端流量参数响应消息字节数组解析为消息对象AFN=64H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWfParamCommandResponse qwpcr = new QueryWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 5 == 2) { -// int n = (data.length - 2) / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setUppers(uppers); -// qwpcr.setValid(true); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水量表底值响应消息字节数组解析为消息对象AFN=1BH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFlowInitCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFlowInitCommandResponse sficr = new SetFlowInitCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5; //监测点个数 -// List inits = new ArrayList(n); -// -// // 解析多个监测点的值 -// for (int i = 0; i < n; i++) { -// String init = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4]), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// -// inits.add(Long.valueOf(init)); -// } -// sficr.setNewInits(inits); -// -// sficr.setValid(true); -// sficr.setSuccess(true); -// } else { -// sficr.setValid(false); -// } -// -// return sficr; -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔响应消息字节数组解析为消息对象AFN=20H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetThresholdCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetThresholdCommandResponse stcr = new SetThresholdCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 3) { -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// int inter = data[1]; -// double thresh = 0.0; -// -// stcr.setType(type); -// stcr.setNo(no); -// stcr.setInter(inter); -// -// switch (type) { -// case 0: //雨量参数 -// stcr.setThresh(ByteUtil.bcdToInt(data[2])/10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 1: //水位参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[5] & 0x0F), data[4], data[3], data[2]}); -// if ((data[5] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 2: //水量参数 -// if (data.length == 7) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[6] & 0x7F), data[5], data[4], data[3], data[2]}); -// if ((data[6] & 0x80) == 0x80) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 3: //流速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[4] & 0x0F), data[3], data[2]}); -// if ((data[4] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 4: //闸位参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 5: //功率参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 6: //气压参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 7: //风速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 8: //水温参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 10: //土壤含水率参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 11: //蒸发量参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 12: //水压参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[5], data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// default: -// stcr.setThresh(0.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// } -// } else { -// stcr.setValid(false); -// } -// -// return stcr; -// } -// -// /** -// * 将设置终端定值量响应消息字节数组解析为消息对象AFN=34H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFixedValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFixedValueCommandResponse sfvcr = new SetFixedValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String fixed = ByteUtil.bcdToString(new byte[] {(byte) (data[4]), data[3], data[2], data[1], data[0]}); -// -// sfvcr.setFixedValue(Long.parseLong(fixed)); -// -// sfvcr.setValid(true); -// sfvcr.setSuccess(true); -// } else { -// sfvcr.setValid(false); -// } -// -// return sfvcr; -// } -// -// /** -// * 将修改终端密码响应消息字节数组解析为消息对象AFN=96H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPasswordCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPasswordCommandResponse spcr = new SetPasswordCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setNewPassword((int) ByteUtil.bcdToLong(new byte[] {data[1], data[0]})); -// } else { -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端实时值命令响应消息字节数组解析为消息对象AFN=B0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeValueCommandResponse qrtvcr = new QueryRealTimeValueCommandResponse(Calendar.getInstance(), address); -// qrtvcr.setRttype(gbFrame.FRAME_CONTROL_FN); -// -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return qrtvcr; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } catch (Exception e) { -// results += "0"+ ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt))); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// qrtvcr.setResults(results); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[1] & 0x0F), data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 2 + 1], data[i * 2] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] {data[data.length - 3], data[data.length - 4] }); -// qrtvcr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] {data[data.length - 1], data[data.length - 2] }); -// qrtvcr.setStatus(status); -// -// qrtvcr.setValid(true); -// return qrtvcr; -// } -// -// /** -// * 将查询终端实时状态命令响应消息字节数组解析为消息对象AFN=5EH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeStatusCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeStatusCommandResponse qrtscr = new QueryRealTimeStatusCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// qrtscr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[3], data[2] }); -// qrtscr.setStatus(status); -// -// qrtscr.setValid(true); -// } else { -// qrtscr.setValid(false); -// } -// -// return qrtscr; -// } -// -// /** -// * 将定时自报消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToTimingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// TimingDataMessage tdm = new TimingDataMessage(Calendar.getInstance(), address); -// -// // 先处理时标 -// byte[] bt = new byte[4]; -// for (int i = 0; i < bt.length; i++) { -// bt[i] = gbFrame.FRAME_DATA_BODY[gbFrame.FRAME_DATA_BODY.length - 1 - bt.length + i]; -// } -// -// // TP中的秒分时日 -// int second = ByteUtil.bcdToInt(bt[bt.length - 4]); -// int minute = ByteUtil.bcdToInt(bt[bt.length - 3]); -// int hour = ByteUtil.bcdToInt(bt[bt.length - 2]); -// int date = ByteUtil.bcdToInt(bt[bt.length - 1]); -// -// Calendar tp = null; -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// -// if (date == tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期与当前日期相同 -// * 表示为最近的自报消息 -// * 判断是否超前 -// * 不超前即认为是正常自报或当日的补报 -// */ -// if (tp.getTimeInMillis() - tdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("定时自报消息时标超前"); // 超前半小时以上 -// logger.error("定时自报消息时标超前"); -// tdm.setValid(false); -// -// return tdm; -// } -// -// tdm.setTime(tp); -// } -// else if (date > tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期大于当前日期 -// * 表示可能为上月的补报自报消息 -// * 将月份减1 -// */ -// try { -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// else { -// /** -// * 日期小于当前日期 -// * 认为是当月的补报自报消息 -// * 月份不变 -// */ -// tdm.setTime(tp); -// } -// } catch (Exception re) { -// /** -// * 判断是否是日期为31导致的错误 -// * 将月份减1 -// */ -// try { -// tp = Calendar.getInstance(); -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// -// tdm.setTime(tp); -// tdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// tdm.setAfn(gbFrame.FRAME_DATA_AFN); -// tdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return tdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") ==false) { -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "-1" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true ) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } -// -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// tdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// tdm.setStatus(status); -// -// tdm.setValid(true); -// -// return tdm; -// } -// -// /** -// * 将随机报警消息字节数组解析为消息对象AFN=81H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToWarningMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// WarningMessage wm = new WarningMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("随机报警消息时标解析异常"); -// logger.error("随机报警消息时标解析异常"); -// wm.setValid(false); -// } -// if (tp.getTimeInMillis() - wm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("随机报警消息时标超前"); // 超前半小时以上 -// logger.error("随机报警消息时标超前"); -// wm.setValid(false); -// } else if (tpDelay != 0 -// && (wm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("随机报警消息超时"); -// logger.error("随机报警消息超时"); -// wm.setValid(false); -// } else { -// wm.setTime(tp); -// wm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// wm.setAfn(gbFrame.FRAME_DATA_AFN); -// wm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置报警状态 -// String warn = ""; -// warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// wm.setWarn(warn); -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return wm; -// case GBConstants.CTRL_DIR1_MWL:// 水位超限 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 5] & 0x0F), data[i * 4 + 4], data[i * 4 + 3], data[i * 4 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 5] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)超限 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 6] & 0x7F), data[i * 5 + 5], data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 6] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质超限 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[6], data[5], data[4], data[3], data[2] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 7; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("") == false) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// default: -// if (data.length == 4) -// break; -// else { -// wm.setValid(false); -// return wm; -// } -// } -// -// String status = ""; -// status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// wm.setStatus(status); -// wm.setValid(true); -// } -// -// return wm; -// } -// -// /** -// * 将人工置数消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSettingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// SettingDataMessage sdm = new SettingDataMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("人工置数消息时标解析异常"); -// logger.error("人工置数消息时标解析异常"); -// sdm.setValid(false); -// } -// if (tp.getTimeInMillis() - sdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("人工置数消息时标超前"); // 超前半小时以上 -// logger.error("人工置数消息时标超前"); -// sdm.setValid(false); -// } else if (tpDelay != 0 && (sdm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("人工置数消息超时"); -// logger.error("人工置数消息超时"); -// sdm.setValid(false); -// } else { -// sdm.setTime(tp); -// sdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// sdm.setAfn(gbFrame.FRAME_DATA_AFN); -// sdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return sdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 5; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("")) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// sdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// sdm.setStatus(status); -// -// sdm.setValid(true); -// } -// -// return sdm; -// } -// -// /** -// * 将设置终端IC卡有效功能命令响应消息字节数组解析为消息对象AFN=30H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableICCardCommandResponse eicccr = new EnableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// eicccr.setSuccess(true); -// } else { -// eicccr.setSuccess(false); -// } -// -// eicccr.setValid(true); -// } else { -// eicccr.setValid(false); -// } -// -// return eicccr; -// } -// -// /** -// * 将设置终端IC卡功能无效命令响应消息字节数组解析为消息对象AFN=31H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableICCardCommandResponse dicccr = new DisableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dicccr.setSuccess(true); -// } else { -// dicccr.setSuccess(false); -// } -// -// dicccr.setValid(true); -// } else { -// dicccr.setValid(false); -// } -// -// return dicccr; -// } -// -// /** -// * 将设置终端定值控制投入功能命令响应消息字节数组解析为消息对象AFN=32H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableFixedValCommandResponse efvcr = new EnableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// efvcr.setSuccess(true); -// } else { -// efvcr.setSuccess(false); -// } -// -// efvcr.setValid(true); -// } else { -// efvcr.setValid(false); -// } -// -// return efvcr; -// } -// -// /** -// * 将设置终端定值控制退出功能命令响应消息字节数组解析为消息对象AFN=33H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableFixedValCommandResponse dfvcr = new DisableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dfvcr.setSuccess(true); -// } else { -// dfvcr.setSuccess(false); -// } -// -// dfvcr.setValid(true); -// } else { -// dfvcr.setValid(false); -// } -// -// return dfvcr; -// } -// -// /** -// * 将遥控开启水泵/闸门命令响应消息字节数组解析为消息对象AFN=92H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteOpenPumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteOpenPumpCommandResponse ropcr = new RemoteOpenPumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// ropcr.setSuccess(true); -// } else { -// ropcr.setSuccess(false); -// } -// -// ropcr.setValid(true); -// } else { -// ropcr.setValid(false); -// } -// -// return ropcr; -// } -// -// /** -// * 将遥控关闭水泵/闸门命令响应消息字节数组解析为消息对象AFN=93H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteClosePumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteClosePumpCommandResponse rcpcr = new RemoteClosePumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// rcpcr.setSuccess(true); -// } else { -// rcpcr.setSuccess(false); -// } -// -// rcpcr.setValid(true); -// } else { -// rcpcr.setValid(false); -// } -// -// return rcpcr; -// } -// -// /** -// * 将复位终端参数命令响应消息字节数组解析为消息对象AFN=90H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToResetParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ResetParamCommandResponse rpcr = new ResetParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// rpcr.setSuccess(true); -// } else { -// rpcr.setSuccess(false); -// } -// -// rpcr.setValid(true); -// } else { -// rpcr.setValid(false); -// } -// -// return rpcr; -// } -// -// /** -// * 将清空终端历史数据单元命令响应消息字节数组解析为消息对象AFN=91H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToClearHistoryCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ClearHistoryCommandResponse chcr = new ClearHistoryCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x01 || data[0] == 0x02) { -// chcr.setSuccess(true); -// } else { -// chcr.setSuccess(false); -// } -// -// chcr.setValid(true); -// } else { -// chcr.setValid(false); -// } -// -// return chcr; -// } -// -// /** -// * 将查询水泵电机实时工作数据命令响应消息字节数解析为消息对象AFN=5FH -// * -// * @param message -// * @return -// */ -// private AppMessage bytesToQueryRealTimeMotoValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeMotoValueCommandResponse qrtmv = new QueryRealTimeMotoValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 12) { -// // 解析并设置A相电压 -// int vaInt = ByteUtil.binToInt(new byte[] { data[1], data[0] }); -// if (vaInt < 1000) -// qrtmv.setVoltageA(String.valueOf(vaInt)); -// else -// qrtmv.setVoltageA("0"); -// -// // 解析并设置B相电压 -// int vbInt = ByteUtil.binToInt(new byte[] { data[3], data[2] }); -// if (vbInt < 1000) -// qrtmv.setVoltageB(String.valueOf(vbInt)); -// else -// qrtmv.setVoltageB("0"); -// -// // 解析并设置C相电压 -// int vcInt = ByteUtil.binToInt(new byte[] { data[5], data[4] }); -// if (vcInt < 1000) -// qrtmv.setVoltageC(String.valueOf(vcInt)); -// else -// qrtmv.setVoltageC("0"); -// -// // 解析并设置A相电流 -// int eaInt = ByteUtil.binToInt(new byte[] { data[7], data[6] }); -// if (eaInt < 1000) -// qrtmv.setEcurrentA(String.valueOf(eaInt)); -// else -// qrtmv.setEcurrentA("0"); -// -// // 解析并设置B相电流 -// int ebInt = ByteUtil.binToInt(new byte[] { data[9], data[8] }); -// if (ebInt < 1000) -// qrtmv.setEcurrentB(String.valueOf(ebInt)); -// else -// qrtmv.setEcurrentB("0"); -// -// // 解析并设置C相电流 -// int ecInt = ByteUtil.binToInt(new byte[] { data[11], data[10] }); -// if (ecInt < 1000) -// qrtmv.setEcurrentC(String.valueOf(ecInt)); -// else -// qrtmv.setEcurrentC("0"); -// -// qrtmv.setValid(true); -// } else { -// qrtmv.setValid(false); -// } -// return qrtmv; -// } -// -// /** -// * 将查询终端事件记录命令响应消息字节数组解析为消息对象AFN=5DH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryEventRecordsCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryEventRecordsCommandResponse qprcr = new QueryEventRecordsCommandResponse(Calendar.getInstance(), address); -// Map ercs = new HashMap(); -// -// int temp = 0; -// -// // 解析并设置数据域 -// if (data.length == 64) { -// // int num = 1; -// // erc19-32备用 -// for (int j = 0; j < 19; j++) { -// temp = ByteUtil.binToInt(new byte[] { data[j * 2 + 1], data[2 * j] }); -// ercs.put("erc" + Integer.toString(j + 1), Integer.valueOf(temp)); -// // System.out.println(j+"==="+temp+"=="); -// } -// -// qprcr.setErcs(ercs); -// qprcr.setValid(true); -// -// } else { -// qprcr.setValid(false); -// } -// return qprcr; -// } -// -// /** -// * 将查询内存自报数据命令响应消息字节数组解析为消息对象AFH=B2H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryMemeryValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryMemeryValueCommandResponse qmvcr = new QueryMemeryValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// qmvcr.setValid(true); -// } else { -// qmvcr.setValid(false); -// } -// return qmvcr; -// } -// -// /** -// * 将查询终端固态存储数据命令响应消息字节数组解析为消息对象AFH=B1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryHDValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryHDValueCommandResponse qhdvcr = new QueryHDValueCommandResponse(Calendar.getInstance(), address); -// Map qhdm = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length > 9) { -// // 解析并设置参数及起止时间数据 -// String starttime = ByteUtil.bcdToString(new byte[] { data[4], data[3], data[2], data[1] }); -// String endtime = ByteUtil.bcdToString(new byte[] { data[8], data[7], data[6], data[5] }); -// if (starttime.equals("") == true || endtime.equals("") == true) { -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// Calendar start = Calendar.getInstance(); -// Calendar end = Calendar.getInstance(); -// start.set(2000 + Integer.parseInt(starttime.substring(0, 2)), -// Integer.parseInt(starttime.substring(2, 4)) - 1, -// Integer.parseInt(starttime.substring(4, 6)), -// Integer.parseInt(starttime.substring(6, 8)), 0, 0); -// end.set(2000 + Integer.parseInt(endtime.substring(0, 2)), -// Integer.parseInt(endtime.substring(2, 4)) - 1, -// Integer.parseInt(endtime.substring(4, 6)), -// Integer.parseInt(endtime.substring(6, 8)), 0, 0); -// long hour = (end.getTimeInMillis() - start.getTimeInMillis()) / (1000 * 3600); -// -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// qhdvcr.setType(type); -// qhdvcr.setNo(no); -// -// switch (type) { -// case 0: //雨量参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format((Integer.parseInt(realtime) / 10.0), "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 1: //水位参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 3] & 0x0F), data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 3] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 2: //水量参数 -// { -// int interval = (data.length - 9) / 5; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 5) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 4] & 0x7F), data[i + 3], data[i + 2], data[i + 1], data[i]}); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// // 判断剩余水量正负符号 -// Long realtimelong = Long.valueOf(0); -// if ((data[i + 4] & 0x80) == 0x80) -// realtimelong = Long.valueOf(Long.parseLong(realtime) * -1); -// else -// realtimelong = Long.valueOf(realtime); -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(realtimelong)); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 3: //流速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 2] & 0x0F), data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 2] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 4: //闸位参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 5: //功率参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 6: //气压参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 7: //风速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 8: //水温参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 10: //土壤含水率参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 11: //水压参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] { data[i + 3], data[i + 2 ], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// default://其它参数未实现 -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// qhdvcr.setValid(true); -// -// } else { -// qhdvcr.setValid(false); -// } -// return qhdvcr; -// } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //获取传感器数量 + + int offset = cmd.getOffset(); //获取湿度变量的内存地址偏移量 + offset = offset + wsct * 2 * 2 * 2; + + // 解析并存储温度值 + for (int i = 0; i < wsct; i++) { + byte[] tempValueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; + byte[] tempThresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; + + float tempValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempValueByte), 16)); //温度监测值 + float tempThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempThresholdByte), 16)); //温度报警阈值 + + rwvcr.getWd().add(tempValue); + rwvcr.getWdbjz().add(tempThreshold); + } + + // 解析并存储湿度值 + for (int i = 0; i < wsct; i++) { + byte[] humValueByte = new byte[] { data[i*8 + 2 + offset], data[i*8 + 3 + offset], data[i*8 + offset], data[i*8 + 1 + offset] }; + byte[] humThresholdByte = new byte[] { data[i*8 + 6 + offset], data[i*8 + 7 + offset], data[i*8 + 4 + offset], data[i*8 + 5 + offset] }; + + float humValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humValueByte), 16)); //湿度监测值 + float humThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humThresholdByte), 16)); //湿度报警阈值 + + rwvcr.getSd().add(humValue); + rwvcr.getSdbjz().add(humThreshold); + } + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //温湿度监测点的数量 + + // 处理温度状态 + String tempDataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 1); + char bjBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 2); + + rwsscr.getWdbj().add(bjBit == '1' ? true : false); + rwsscr.getWdldbj().add(ldBit == '1' ? true : false); + } + + // 处理湿度状态 + String humDataStr = ByteUtil.binToBinString(new byte[] { data[4], data[5] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = humDataStr.charAt(humDataStr.length() - 2 * i - 1); + char bjBit = humDataStr.charAt(humDataStr.length() - 2 * i - 2); + + rwsscr.getSdbj().add(bjBit == '1' ? true : false); + rwsscr.getSdldbj().add(ldBit == '1' ? true : false); + } + } + + return rwsscr; + } + /** * 将消息对象解析为字节数组 @@ -3507,18 +512,25 @@ frame = LinkCommandToBytes((LinkCommand) message); } - // 读取甲烷参数内存命令 - if (message instanceof ReadCH4ParamCommand) { - frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); - } else if (message instanceof ReadCH4StatusCommand) { - frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); - } - -// // 读内存命令 -// if (message instanceof FreeMessageResponse) { -// frame = freeMessageResponseToBytes((FreeMessageResponse) message); +// // 读取甲烷参数内存命令 +// if (message instanceof ReadCH4ValueCommand) { +// frame = ReadCH4ValueCommandToBytes((ReadCH4ValueCommand) message); +// } else if (message instanceof ReadCH4StatusCommand) { +// frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); // } // +// // 读取温湿度命令 +// else if (message instanceof ReadWSValueCommand) { +// frame = ReadWSValueCommandToBytes((ReadWSValueCommand) message); +// } else if (message instanceof ReadWSStatusCommand) { +// frame = ReadWSStatusCommandToBytes((ReadWSStatusCommand) message); +// } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } +// // // 写内存命令 // if (message instanceof QueryRealTimeValueCommand) { // frame = queryRealTimeValueCommandToBytes((QueryRealTimeValueCommand) message); @@ -3527,6 +539,8 @@ return frame; } + + /** * 将握手命令转换为字节数组 * @@ -3540,28 +554,12 @@ } /** - * 将读取甲烷监测值命令转换为字节数组 - * @param read - * @return - */ - private byte[] ReadCH4ParamCommandToBytes(ReadCH4ParamCommand read) { - byte[] start = ByteUtil.hexStringToBytes(read.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(read.getDestinationId(), - read.getMessageProducerId(), - read.getMemoryArea(), - start, - read.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将读取甲烷报警状态命令转换为字节数组 + * 将读取PLC内存命令转换为字节数组 + * * @param message * @return */ - private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), @@ -3569,1221 +567,78 @@ message.getMemoryArea(), start, message.getCountWord()); - + return finsFrame.toBytes(); } + /** + * 将读取甲烷监测值命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4ValueCommandToBytes(ReadCH4ValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } -// /** -// * 将退出登录命令对象转换为字节数组AFN=02H -// * -// * @param hmr -// * @return -// */ -// private byte[] logoutCommandToBytes(LogoutCommand lc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, lc.getDestinationId(), -// GBConstants.DATA_AFN_LOGIN, new byte[] { (byte) 0xF1 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置地址命令对象转换为字节数组AFN=10H -// * -// * @param message -// * @return -// */ -// private byte[] setAddressCommandToBytes(SetAddressCommand sac) { -// String address = sac.getNewAddress(); -// -// // 解析设置的新地址内容 -// byte[] add1 = ByteUtil.bcdStringToBytes(address.substring(0, 6)); -// byte[] add2 = ByteUtil.hexStringToBytes(address.substring(7, 10)); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(add1).append(add2[1]).append(add2[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sac.getDestinationId(), -// GBConstants.DATA_AFN_SETADDRESS, data.toBytes(), pw, -// sac.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询地址命令对象转换为字节数组AFN=50H -// * -// * @param message -// * @return -// */ -// private byte[] queryAddressCommandToBytes(QueryAddressCommand qac) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qac.getDestinationId(), -// GBConstants.DATA_AFN_QUERYADDRESS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置时钟命令对象转换为字节数组AFN=11H -// * -// * @param scc -// * @return -// */ -// private byte[] setClockCommandToBytes(SetClockCommand scc) { -// Calendar clock = scc.getClock(); -// -// // 解析设置的新时钟内容 -// int week = clock.get(Calendar.DAY_OF_WEEK); -// switch (week) { -// case Calendar.MONDAY: -// case Calendar.TUESDAY: -// case Calendar.WEDNESDAY: -// case Calendar.THURSDAY: -// case Calendar.FRIDAY: -// case Calendar.SATURDAY: -// week = week - 1; -// break; -// case Calendar.SUNDAY: -// week = week - 1 + 7; -// break; -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcd(clock.get(Calendar.SECOND))); // 秒 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append((byte) (ByteUtil.intToBcd(clock.get(Calendar.MONTH) + 1) | (ByteUtil -// .intToBcd(week) << 5))); // 月 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.YEAR) - 2000)); // 年 -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCLOCK, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询时钟命令对象转换为字节数组AFN=51H -// * -// * @param message -// * @return -// */ -// private byte[] queryClockCommandToBytes(QueryClockCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCLOCK); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置工作模式命令对象转换为字节数组AFN=12H -// * -// * @param message -// * @return -// */ -// private byte[] setPatternCommandToBytes(SetPatternCommand spc) { -// String newPattern = spc.getPattern(); -// if (newPattern.length() > 2) { -// newPattern = newPattern.substring(0, 2); -// } -// -// // 解析设置的新工作模式内容 -// byte[] pattern = ByteUtil.hexStringToBytes(newPattern); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(pattern); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETWORKPATTERN, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询工作模式命令对象转换为字节数组AFN=52H -// * -// * @param message -// * @return -// */ -// private byte[] queryPatternCommandToBytes(QueryPatternCommand qpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWORKPATTERN); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置自报种类及时间间隔命令对象转换为字节数组AFN=A1H -// * -// * @param message -// * @return -// */ -// private byte[] setIntervalCommandToBytes(SetIntervalCommand sic) { -// Map newIntervals = sic.getIntervals(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// Bytes di = new Bytes(); // 每种参数自报的时间间隔 -// for (int i = 0; i < SetIntervalCommand.index.length; i++) { -// String key = SetIntervalCommand.index[i]; -// if (newIntervals.containsKey(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// int val = ((Integer) newIntervals.get(key)).intValue(); -// int low = val % 100; -// int high = val / 100; -// di.append(ByteUtil.intToBcd(low)).append(ByteUtil.intToBcd(high)); -// } else { -// di.append(new byte[] { 0x00, 0x00 }); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]).append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sic.getDestinationId(), -// GBConstants.DATA_AFN_SETINTERVAL, data.toBytes(), pw, -// sic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询自报种类及时间间隔命令对象转换为字节数组AFN=53H -// * -// * @param message -// * @return -// */ -// private byte[] queryIntervalCommandToBytes(QueryIntervalCommand qic) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qic.getDestinationId(), -// GBConstants.DATA_AFN_QUERYINTERVAL); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端需查询的实时数据种类命令对象转换为字节数组AFN=A0H -// * -// * @param message -// * @return -// */ -// private byte[] setRttypesCommandToBytes(SetRttypesCommand src) { -// Set newRttypes = src.getRttypes(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// for (int i = 0; i < SetRttypesCommand.index.length; i++) { -// String key = SetRttypesCommand.index[i]; -// if (newRttypes.contains(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, src.getDestinationId(), -// GBConstants.DATA_AFN_SETRTTYPES, data.toBytes(), pw, -// src.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端需查询的实时数据种类命令对象转换为字节数组AFN=54H -// * -// * @param message -// * @return -// */ -// private byte[] queryRttypesCommandToBytes(QueryRttypesCommand qrc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYRTTYPES); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端充值量命令对象转换为字节数组AFN=15H -// * -// * @param message -// * @return -// */ -// private byte[] setChargingCommandToBytes(SetChargingCommand scc) { -// String charging = scc.getNewCharging(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(charging), 4)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCHARGING, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端充值量命令对象转换为字节数组AFN=55H -// * -// * @param message -// * @return -// */ -// private byte[] queryChargingCommandToBytes(QueryChargingCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCHARGING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端剩余水量报警值命令对象转换为字节数组AFN=16H -// * -// * @param message -// * @return -// */ -// private byte[] setWarningCommandToBytes(SetWarningCommand swc) { -// String warning = swc.getNewWarning(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(warning), 3)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swc.getDestinationId(), -// GBConstants.DATA_AFN_SETWARNING, data.toBytes(), pw, -// swc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端剩余水量报警值命令对象转换为字节数组AFN=56H -// * -// * @param message -// * @return -// */ -// private byte[] queryWarningCommandToBytes(QueryWarningCommand qwc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWARNING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水位参数命令对象转换为字节数组AFN=17H -// * -// * @param message -// * @return -// */ -// private byte[] setWlParamCommandToBytes(SetWlParamCommand swpc) { -// List> wlParams = swpc.getWlParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wlParams.size(); i++) { -// List wlp = (List) wlParams.get(i); -// -// int benchmark = (int) (((Double) wlp.get(0)).doubleValue() * 100); -// int upper = (int) (((Double) wlp.get(1)).doubleValue() * 100); -// int lower = (int) (((Double) wlp.get(2)).doubleValue() * 100); -// -// byte[] bb = ByteUtil.intToBcdsHL(Math.abs(benchmark), 3); -// if (benchmark < 0) { -// bb[2] = (byte) (bb[2] + 0x80); -// } -// byte[] ub = ByteUtil.intToBcdsHL(upper, 2); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 2); -// data.append(bb).append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERLEVELPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水位参数命令对象转换为字节数组AFN=57H -// * -// * @param message -// * @return -// */ -// private byte[] queryWlParamCommandToBytes(QueryWlParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERLEVELPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水压参数命令对象转换为字节数组AFN=18H -// * -// * @param message -// * @return -// */ -// private byte[] setWpParamCommandToBytes(SetWpParamCommand swpc) { -// List> wpParams = swpc.getWpParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wpParams.size(); i++) { -// List wpp = (List) wpParams.get(i); -// -// int upper = (int) (((Double) wpp.get(0)).doubleValue() * 100); -// int lower = (int) (((Double) wpp.get(1)).doubleValue() * 100); -// -// byte[] ub = ByteUtil.intToBcdsHL(upper, 4); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 4); -// data.append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERPRESSUREPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水压参数命令对象转换为字节数组AFN=58H -// * -// * @param message -// * @return -// */ -// private byte[] queryWpParamCommandToBytes(QueryWpParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERPRESSUREPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数上限命令对象转换为字节数组AFN=19H -// * -// * @param message -// * @return -// */ -// private byte[] setWqUpperParamCommandToBytes(SetWqUpperParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqUpperParamCommand.index.length; i++) { -// String key = SetWqUpperParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqUpperParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYUPPERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数下限命令对象转换为字节数组AFN=1AH -// * -// * @param message -// * @return -// */ -// private byte[] setWqLowerParamCommandToBytes(SetWqLowerParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqLowerParamCommand.index.length; i++) { -// String key = SetWqLowerParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqLowerParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYLOWERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数上限命令对象转换为字节数组AFN=59H -// * -// * @param message -// * @return -// */ -// private byte[] queryWqUpperParamCommandToBytes(QueryWqUpperParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数下限命令对象转换为字节数组AFN=5AH -// * -// * @param message -// * @return -// */ -// private byte[] queryWqLowerParamCommandToBytes(QueryWqLowerParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYLOWERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端流量参数命令对象转换为字节数组AFN=1FH -// * -// * @param message -// * @return -// */ -// private byte[] setWfParamCommandToBytes(SetWfParamCommand swpc) { -// List newUppers = swpc.getNewUppers(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < newUppers.size(); i++) { -// double value = ((Double) newUppers.get(i)).doubleValue(); -// int upper = (int) (Math.abs(value) * 1000); -// byte[] ub = ByteUtil.intToBcdsHL(upper, 5); -// if (value < 0) { -// ub[4] = (byte) (ub[4] + 0xF0); -// } -// data.append(ub); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERFLOWUPPERPARAM, data.toBytes(), -// pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端流量参数命令对象转换为字节数组AFN=64H -// * -// * @param message -// * @return -// */ -// private byte[] queryWfParamCommandToBytes(QueryWfParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERFLOWUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时值命令对象转换为字节数组AFN=B0H -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeValueCommandToBytes(QueryRealTimeValueCommand qrtvc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// qrtvc.getRttype(), qrtvc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMEVALUE); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水量表底值命令对象转换为字节数组AFN=1BH -// * -// * @param message -// * @return -// */ -// private byte[] setFlowInitCommandToBytes(SetFlowInitCommand sfic) { -// List inits = sfic.getNewInits(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < inits.size(); i++) { -// long init = ((Long) inits.get(i)).longValue(); -// byte[] ib = ByteUtil.intToBcdsHL(init, 5); -// data.append(ib); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfic.getDestinationId(), -// GBConstants.DATA_AFN_SETFLOWINIT, data.toBytes(), pw, -// sfic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔命令对象转换为字节数组AFN=20H -// * -// * @param message -// * @return -// */ -// private byte[] setThresholdCommandToBytes(SetThresholdCommand stc) { -// int type = stc.getType(); -// int no = stc.getNo(); -// int inter = stc.getInter(); -// double thresh = stc.getThresh(); + /** + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); // -// String noHex = ByteUtil.binToHexString(ByteUtil.intToBins(no, 1)); -// noHex = noHex.substring(noHex.length() - 1); -// String typeHex = ByteUtil.binToHexString(ByteUtil.intToBins(type, 1)); -// typeHex = typeHex.substring(typeHex.length() - 1); +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); // -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.hexStringToBytes(typeHex + noHex)); -// data.append(ByteUtil.intToBins(inter, 1)); -// byte[] threshBytes = null; -// -// // 控制域FN -// int control_fn = 0; -// -// // 判断设置检测参数的类型 -// switch (type) { -// case 0: //雨量参数 -// data.append(ByteUtil.intToBcd((int) (thresh * 10))); -// control_fn = 1; -// break; -// -// case 1: //水位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 4); -// if (thresh < 0) { -// threshBytes[3] = (byte) (threshBytes[3] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 2; -// break; -// -// case 2: //水量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh)), 5); -// if (thresh < 0) { -// threshBytes[4] = (byte) (threshBytes[4] | 0x80); -// } -// data.append(threshBytes); -// -// control_fn = 3; -// break; -// -// case 3: //流速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 3); -// if (thresh < 0) { -// threshBytes[2] = (byte) (threshBytes[2] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 4; -// break; -// -// case 4: //闸位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 5; -// break; -// -// case 5: //功率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 6; -// break; -// -// case 6: //气压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 7; -// break; -// -// case 7: //风速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 8; -// break; -// -// case 8: //水温参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 9; -// break; -// -// case 10: //土壤含水率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 11; -// break; -// -// case 11: //蒸发量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 3); -// data.append(threshBytes); -// -// control_fn = 12; -// break; -// -// case 12: //水压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 4); -// data.append(threshBytes); -// -// control_fn = 15; -// break; -// -// default: -// thresh = 0.0; -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, stc.getDestinationId(), -// GBConstants.DATA_AFN_SETTHRESHOLD, data.toBytes(), pw, -// stc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端定值量命令对象转换为字节数组AFN=34H -// * -// * @param message -// * @return -// */ -// private byte[] setFixedValueCommandToBytes(SetFixedValueCommand sfvc) { -// long fixedvalue = sfvc.getNewFixedValue(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] fb = ByteUtil.intToBcdsHL(fixedvalue, 5); -// data.append(fb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfvc.getDestinationId(), -// GBConstants.DATA_AFN_SETFIXEDVALUE, data.toBytes(), pw, -// sfvc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将修改终端密码命令对象转换为字节数组AFN=96H -// * -// * @param message -// * @return -// */ -// private byte[] setPasswordCommandToBytes(SetPasswordCommand spc) { -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] pb = ByteUtil.intToBcdsHL(spc.getNewPassword(), 2); -// data.append(pb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETPASSWORD, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时状态命令对象转换为字节数组AFN=5EH -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeStatusCommandToBytes(QueryRealTimeStatusCommand qrtsc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_QSS, qrtsc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMESTATUS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将自报响应消息转换为字节数组 自报消息通用响应 -// * -// * @param message -// * @return -// */ -// private byte[] freeMessageResponseToBytes(FreeMessageResponse fmr) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, fmr.getFcb(), -// fmr.getType(), fmr.getDestinationId(), -// fmr.getAfn(), new byte[] { 0x00 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能有效命令转换为字节数组AFN=30H -// * -// * @param message -// * @return -// */ -// private byte[] enableICCardCommandToBytes(EnableICCardCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEICCARD, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能无效命令转换为字节数组AFN=31H -// * -// * @param message -// * @return -// */ -// private byte[] disableICCardCommandToBytes(DisableICCardCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEICCARD, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制投入功能命令转换为字节数组AFN=32H -// * -// * @param message -// * @return -// */ -// private byte[] enableFixedValCommandToBytes(EnableFixedValCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEFIXEDVAL, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制退出功能命令转换为字节数组AFN=33H -// * -// * @param message -// * @return -// */ -// private byte[] disableFixedValCommandToBytes(DisableFixedValCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEFIXEDVAL, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控开启水泵/闸门命令转换为字节数组AFN=92H -// * -// * @param message -// * @return -// */ -// private byte[] remoteOpenPumpCommandToBytes(RemoteOpenPumpCommand ropc) { -// byte[] data = ByteUtil.hexStringToBytes(ropc.getPump() + ropc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, ropc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTEOPENPUMP, data, pw, ropc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控关闭水泵/闸门命令转换为字节数组AFN=93H -// * -// * @param message -// * @return -// */ -// private byte[] remoteClosePumpCommandToBytes(RemoteClosePumpCommand rcpc) { -// byte[] data = ByteUtil.hexStringToBytes(rcpc.getPump() + rcpc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rcpc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTECLOSEPUMP, data, pw, rcpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将复位终端参数命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] resetParamCommandToBytes(ResetParamCommand rpc) { -// byte[] data = ByteUtil.hexStringToBytes(rpc.getReset(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rpc.getDestinationId(), -// GBConstants.DATA_AFN_RESETPARAM, data, pw, rpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将清空历史数据单元命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] clearHistoryCommandToBytes(ClearHistoryCommand chc) { -// byte[] data = ByteUtil.hexStringToBytes(chc.getClear(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, chc.getDestinationId(), -// GBConstants.DATA_AFN_CLEARHISTORY, data, pw, chc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询水泵电机实时工作数据的命令转换为字节数组AFN=5FH -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryRealTimeMotoValueCommandToBytes( -// QueryRealTimeMotoValueCommand qrtmv) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrtmv.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEMOTOSS); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端事件记录的命令转换为字节数组5DH -// * -// * @param message -// * @return -// */ -// private byte[] queryEventRecordsCommandToBytes(QueryEventRecordsCommand qerc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEVENTREC); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询内存自报数据的命令转换为字节数组B2H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryMemeryValueCommandToBytes(QueryMemeryValueCommand qerc) { -// Calendar bclock = qerc.getBdate(); -// Calendar eclock = qerc.getEdate(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYMEMERYVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询固态存储数据的命令转换为字节数组B1H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryHDValueCommandToBytes(QueryHDValueCommand qhdc) { -// int type = qhdc.getType(); -// int no = qhdc.getNo(); -// Calendar sclock = qhdc.getSclock(); -// Calendar eclock = qhdc.getEclock(); -// -// int i = type * 16 + no; -// -// int control_fn = GBConstants.CTRL_DIR0_QACC; -// if (type == 0) //查询雨量参数 -// control_fn = GBConstants.CTRL_DIR0_QRF; -// else if (type == 1) //查询水位参数 -// control_fn = GBConstants.CTRL_DIR0_QWL; -// else if (type == 2) //查询水量参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 3) //查询流速参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 4) //查询闸位参数 -// control_fn = GBConstants.CTRL_DIR0_QBC; -// else if (type == 5) //查询功率参数 -// control_fn = GBConstants.CTRL_DIR0_QPW; -// else if (type == 6) //查询气压参数 -// control_fn = GBConstants.CTRL_DIR0_QAP; -// else if (type == 7) //查询风速参数 -// control_fn = GBConstants.CTRL_DIR0_QWS; -// else if (type == 8) //查询水温参数 -// control_fn = GBConstants.CTRL_DIR0_QWT; -// else if (type == 9) //查询水质参数 -// control_fn = GBConstants.CTRL_DIR0_QWQ; -// else if (type == 10) //查询土壤含水率参数 -// control_fn = GBConstants.CTRL_DIR0_QSA; -// else if (type == 11) //查询水压参数 -// control_fn = GBConstants.CTRL_DIR0_QHP; -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBins(i, 1)); -// -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.YEAR))); // 年 -// -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.YEAR))); // 年 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, qhdc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYHARDDISCVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// -// /** -// * 从重叠消息中提取规范消息 -// */ -// public List extractByteMessage(byte[] byteMessage) { -// List bytesList = new ArrayList(); -// -// try { -// int i = 0; -// while (i < byteMessage.length) { -// if ((byteMessage[i] == GBByteFrame.FRAME_HEAD) && (byteMessage[i + 2] == GBByteFrame.FRAME_HEAD)) { -// int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 1]}); -// if (i + length + 5 <= byteMessage.length && byteMessage[i + length + 4] == GBByteFrame.FRAME_END) { -// Bytes bytes = new Bytes(); -// bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]); -// for (int j = 0; j < length + 2; j++) { -// bytes.append(byteMessage[i + 3 + j]); -// } -// -// i = i + length + 5; -// bytesList.add(bytes.toBytes()); -// } else { -// i++; -// } -// } else { -// i++; -// } -// } -// } catch (Exception e) { -// bytesList.clear(); -// bytesList.add(byteMessage); -// return bytesList; -// } -// -// return bytesList; +// return finsFrame.toBytes(); // } + /** + * 将读取温湿度监测值命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSValueCommandToBytes(ReadWSValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + + /** + * 将读取温湿度报警状态命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSStatusCommandToBytes(ReadWSStatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 12d1c18..736bc18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -13,11 +13,12 @@ import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.message.command.read.ReadCH4StatusCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -123,17 +124,25 @@ // 3根据参数类型调用相应的方法进行解析 switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - received = bytesToReadCH4ParamCommand(finsFrame); + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, readCmd); break; case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + received = bytesToReadCH4StatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, readCmd); break; } - // 4将有效的命令的是否有响应字段置1 - readCmdDao.updateCmdRecordResponsed(readCmd.getId()); + // 4将已响应的命令删除 + readCmdDao.deleteCmdRecord(readCmd.getId()); } } else if (commandCode.equalsIgnoreCase("0102")) { @@ -320,6 +329,7 @@ } + /** * 将握手响应字节数组转换为消息对象 * @@ -352,15 +362,15 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4ParamCommand(FINSByteFrame finsFrame) { - ReadCH4ParamCommandResponse rcpcr = new ReadCH4ParamCommandResponse(); + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadCH4ValueCommandResponse rcpcr = new ReadCH4ValueCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; rcpcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = data.length / (2 * 2 * 2); //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占2个字,每个字占2个字节 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 for (int i = 0; i < chct; i++) { byte[] valueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; byte[] thresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; @@ -383,7 +393,7 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; @@ -391,7 +401,7 @@ if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); @@ -401,3097 +411,92 @@ rcscr.getJwldbj().add(ldBit == '1' ? true : false); } } - + return rcscr; } -// -// /** -// * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryAddressResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryAddressCommandResponse qacr = new QueryAddressCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String addressRes = ByteUtil.bcdToString(new byte[] { data[0], data[1], data[2] }) + -// ByteUtil.binToHexString(new byte[] { data[4], data[3] }); -// if (addressRes.length() == 10) { -// qacr.setValid(true); -// qacr.setAddress(addressRes); -// } else { -// logger.error("查询终端地址响应消息解析错误"); -// qacr.setValid(false); -// } -// } else { -// logger.error("查询终端地址响应消息长度错误"); -// qacr.setValid(false); -// } -// -// return qacr; -// } -// -// /** -// * 将设置终端时钟响应消息字节数组解析为消息对象AFN=11H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetClockCommandResponse sccr = new SetClockCommandResponse(Calendar.getInstance(), address); -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// try { -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// sccr.setValid(false); -// return sccr; -// } catch (Exception re) { -// logger.error("时间字段解析异常"); -// sccr.setValid(false); -// return sccr; -// } -// -// sccr.setNewClock(clock); -// -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端时钟响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端时钟响应消息字节数组解析为消息对象AFN=51H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryClockCommandResponse qccr = new QueryClockCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// try { -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// qccr.setValid(false); -// return qccr; -// } -// -// qccr.setClock(clock); -// qccr.setValid(true); -// } else { -// logger.error("查询终端时钟响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端工作模式响应消息字节数组解析为消息对象AFN=12H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPatternCommandResponse spcr = new SetPatternCommandResponse(Calendar.getInstance(), address); -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setWorkPattern(patternRes); -// } else { -// logger.error("设置终端工作模式响应消息长度错误"); -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端工作模式响应消息字节数组解析为消息对象AFN=52H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryPatternCommandResponse qpcr = new QueryPatternCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// qpcr.setValid(true); -// qpcr.setWorkPattern(patternRes); -// } else { -// logger.error("查询终端工作模式响应消息长度错误"); -// qpcr.setValid(false); -// } -// -// return qpcr; -// } -// -// /** -// * 将设置终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=A1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetIntervalCommandResponse sicr = new SetIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// sicr.setValid(true); -// sicr.setIntervals(intervals); -// -// sicr.setValid(true); -// sicr.setSuccess(true); -// } else { -// logger.error("设置终端自报种类及时间间隔响应消息长度错误"); -// sicr.setValid(false); -// } -// -// return sicr; -// } -// -// /** -// * 将查询终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=53H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryIntervalCommandResponse qicr = new QueryIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// qicr.setValid(true); -// qicr.setIntervals(intervals); -// } else { -// logger.error("查询终端自报种类及时间间隔响应消息长度错误"); -// qicr.setValid(false); -// } -// -// return qicr; -// } -// -// /** -// * 将设置终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=A0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetRttypesCommandResponse srcr = new SetRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// srcr.setRttypes(rttypes); -// -// srcr.setValid(true); -// srcr.setSuccess(true); -// } else { -// logger.error("设置终端需查询的实时数据种类响应消息长度错误"); -// srcr.setValid(false); -// } -// -// return srcr; -// } -// -// /** -// * 将查询终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=54H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRttypesCommandResponse qrcr = new QueryRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// -// qrcr.setValid(true); -// qrcr.setRttypes(rttypes); -// } else { -// logger.error("查询终端需查询的实时数据种类响应消息长度错误"); -// qrcr.setValid(false); -// } -// -// return qrcr; -// } -// -// /** -// * 将设置终端充值量响应消息字节数组解析为消息对象AFN=15H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetChargingCommandResponse sccr = new SetChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// -// sccr.setCharging(Integer.parseInt(charging)); -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端充值量响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端充值量和剩余水量响应消息字节数组解析为消息对象AFN=55H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryChargingCommandResponse qccr = new QueryChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 9) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[8] & 0x7F), data[7], data[6], data[5], data[4] }); -// -// if (charging.equals("") == false && current.equals("") == false) { -// qccr.setValid(true); -// qccr.setCharging(Integer.parseInt(charging)); -// // 判断剩余水量正负符号 -// if ((data[8] & 0x80) == 0x80) { -// qccr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qccr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息解析错误"); -// qccr.setValid(false); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端剩余水量报警值响应消息字节数组解析为消息对象AFN=16H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWarningCommandResponse swcr = new SetWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 3) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (warning.equals("") == false) { -// swcr.setNewWarning(Integer.parseInt(warning)); -// } -// -// swcr.setValid(true); -// swcr.setSuccess(true); -// } else { -// logger.error("设置终端剩余水量报警值响应消息长度错误"); -// swcr.setValid(false); -// } -// -// return swcr; -// } -// -// /** -// * 将查询终端剩余水量报警值响应消息字节数组解析为消息对象AFN=56H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWarningCommandResponse qwcr = new QueryWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[7] & 0x7F), data[6], data[5], data[4], data[3] }); -// -// if (warning.equals("") == false && current.equals("") == false) { -// qwcr.setValid(true); -// qwcr.setWarning(Integer.parseInt(warning)); -// // 判断剩余水量正负符号 -// if ((data[7] & 0x80) == 0x80) { -// qwcr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qwcr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息解析错误"); -// qwcr.setValid(false); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息长度错误"); -// qwcr.setValid(false); -// } -// -// return qwcr; -// } -// -// /** -// * 将设置终端水位参数响应消息字节数组解析为消息对象AFN=17H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWlParamCommandResponse swpcr = new SetWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 7 == 0) { -// int n = data.length / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// swpcr.setWlParams(wlParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水位参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水位参数响应消息字节数组解析为消息对象AFN=57H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWlParamCommandResponse qwpcr = new QueryWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 9 && data.length % 7 == 2) { -// int n = (data.length - 2) / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWlParams(wlParams); -// qwpcr.setValid(true); -// -// } else { -// logger.error("查询水位参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=18H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWpParamCommandResponse swpcr = new SetWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 8 && data.length % 8 == 0) { -// int n = data.length / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// swpcr.setWpParams(wpParams); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水压参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数响应消息字节数组解析为消息对象AFN=58H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWpParamCommandResponse qwpcr = new QueryWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 10 && data.length % 8 == 2) { -// int n = (data.length - 2) / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWpParams(wpParams); -// qwpcr.setValid(true); -// } else { -// logger.error("查询水压参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=19H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqUpperParamCommandResponse swpcr = new SetWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=1AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqLowerParamCommandResponse swpcr = new SetWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数上限响应消息字节数组解析为消息对象AFN=59H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqUpperParamCommandResponse qwpcr = new QueryWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将查询终端水压参数下限响应消息字节数组解析为消息对象AFN=5AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqLowerParamCommandResponse qwpcr = new QueryWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端流量参数响应消息字节数组解析为消息对象AFN=1FH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWfParamCommandResponse swpcr = new SetWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// swpcr.setNewUppers(uppers); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端流量参数响应消息字节数组解析为消息对象AFN=64H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWfParamCommandResponse qwpcr = new QueryWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 5 == 2) { -// int n = (data.length - 2) / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setUppers(uppers); -// qwpcr.setValid(true); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水量表底值响应消息字节数组解析为消息对象AFN=1BH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFlowInitCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFlowInitCommandResponse sficr = new SetFlowInitCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5; //监测点个数 -// List inits = new ArrayList(n); -// -// // 解析多个监测点的值 -// for (int i = 0; i < n; i++) { -// String init = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4]), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// -// inits.add(Long.valueOf(init)); -// } -// sficr.setNewInits(inits); -// -// sficr.setValid(true); -// sficr.setSuccess(true); -// } else { -// sficr.setValid(false); -// } -// -// return sficr; -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔响应消息字节数组解析为消息对象AFN=20H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetThresholdCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetThresholdCommandResponse stcr = new SetThresholdCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 3) { -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// int inter = data[1]; -// double thresh = 0.0; -// -// stcr.setType(type); -// stcr.setNo(no); -// stcr.setInter(inter); -// -// switch (type) { -// case 0: //雨量参数 -// stcr.setThresh(ByteUtil.bcdToInt(data[2])/10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 1: //水位参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[5] & 0x0F), data[4], data[3], data[2]}); -// if ((data[5] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 2: //水量参数 -// if (data.length == 7) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[6] & 0x7F), data[5], data[4], data[3], data[2]}); -// if ((data[6] & 0x80) == 0x80) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 3: //流速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[4] & 0x0F), data[3], data[2]}); -// if ((data[4] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 4: //闸位参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 5: //功率参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 6: //气压参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 7: //风速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 8: //水温参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 10: //土壤含水率参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 11: //蒸发量参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 12: //水压参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[5], data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// default: -// stcr.setThresh(0.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// } -// } else { -// stcr.setValid(false); -// } -// -// return stcr; -// } -// -// /** -// * 将设置终端定值量响应消息字节数组解析为消息对象AFN=34H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFixedValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFixedValueCommandResponse sfvcr = new SetFixedValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String fixed = ByteUtil.bcdToString(new byte[] {(byte) (data[4]), data[3], data[2], data[1], data[0]}); -// -// sfvcr.setFixedValue(Long.parseLong(fixed)); -// -// sfvcr.setValid(true); -// sfvcr.setSuccess(true); -// } else { -// sfvcr.setValid(false); -// } -// -// return sfvcr; -// } -// -// /** -// * 将修改终端密码响应消息字节数组解析为消息对象AFN=96H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPasswordCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPasswordCommandResponse spcr = new SetPasswordCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setNewPassword((int) ByteUtil.bcdToLong(new byte[] {data[1], data[0]})); -// } else { -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端实时值命令响应消息字节数组解析为消息对象AFN=B0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeValueCommandResponse qrtvcr = new QueryRealTimeValueCommandResponse(Calendar.getInstance(), address); -// qrtvcr.setRttype(gbFrame.FRAME_CONTROL_FN); -// -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return qrtvcr; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } catch (Exception e) { -// results += "0"+ ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt))); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// qrtvcr.setResults(results); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[1] & 0x0F), data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 2 + 1], data[i * 2] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] {data[data.length - 3], data[data.length - 4] }); -// qrtvcr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] {data[data.length - 1], data[data.length - 2] }); -// qrtvcr.setStatus(status); -// -// qrtvcr.setValid(true); -// return qrtvcr; -// } -// -// /** -// * 将查询终端实时状态命令响应消息字节数组解析为消息对象AFN=5EH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeStatusCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeStatusCommandResponse qrtscr = new QueryRealTimeStatusCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// qrtscr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[3], data[2] }); -// qrtscr.setStatus(status); -// -// qrtscr.setValid(true); -// } else { -// qrtscr.setValid(false); -// } -// -// return qrtscr; -// } -// -// /** -// * 将定时自报消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToTimingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// TimingDataMessage tdm = new TimingDataMessage(Calendar.getInstance(), address); -// -// // 先处理时标 -// byte[] bt = new byte[4]; -// for (int i = 0; i < bt.length; i++) { -// bt[i] = gbFrame.FRAME_DATA_BODY[gbFrame.FRAME_DATA_BODY.length - 1 - bt.length + i]; -// } -// -// // TP中的秒分时日 -// int second = ByteUtil.bcdToInt(bt[bt.length - 4]); -// int minute = ByteUtil.bcdToInt(bt[bt.length - 3]); -// int hour = ByteUtil.bcdToInt(bt[bt.length - 2]); -// int date = ByteUtil.bcdToInt(bt[bt.length - 1]); -// -// Calendar tp = null; -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// -// if (date == tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期与当前日期相同 -// * 表示为最近的自报消息 -// * 判断是否超前 -// * 不超前即认为是正常自报或当日的补报 -// */ -// if (tp.getTimeInMillis() - tdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("定时自报消息时标超前"); // 超前半小时以上 -// logger.error("定时自报消息时标超前"); -// tdm.setValid(false); -// -// return tdm; -// } -// -// tdm.setTime(tp); -// } -// else if (date > tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期大于当前日期 -// * 表示可能为上月的补报自报消息 -// * 将月份减1 -// */ -// try { -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// else { -// /** -// * 日期小于当前日期 -// * 认为是当月的补报自报消息 -// * 月份不变 -// */ -// tdm.setTime(tp); -// } -// } catch (Exception re) { -// /** -// * 判断是否是日期为31导致的错误 -// * 将月份减1 -// */ -// try { -// tp = Calendar.getInstance(); -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// -// tdm.setTime(tp); -// tdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// tdm.setAfn(gbFrame.FRAME_DATA_AFN); -// tdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return tdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") ==false) { -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "-1" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true ) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } -// -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// tdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// tdm.setStatus(status); -// -// tdm.setValid(true); -// -// return tdm; -// } -// -// /** -// * 将随机报警消息字节数组解析为消息对象AFN=81H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToWarningMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// WarningMessage wm = new WarningMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("随机报警消息时标解析异常"); -// logger.error("随机报警消息时标解析异常"); -// wm.setValid(false); -// } -// if (tp.getTimeInMillis() - wm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("随机报警消息时标超前"); // 超前半小时以上 -// logger.error("随机报警消息时标超前"); -// wm.setValid(false); -// } else if (tpDelay != 0 -// && (wm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("随机报警消息超时"); -// logger.error("随机报警消息超时"); -// wm.setValid(false); -// } else { -// wm.setTime(tp); -// wm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// wm.setAfn(gbFrame.FRAME_DATA_AFN); -// wm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置报警状态 -// String warn = ""; -// warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// wm.setWarn(warn); -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return wm; -// case GBConstants.CTRL_DIR1_MWL:// 水位超限 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 5] & 0x0F), data[i * 4 + 4], data[i * 4 + 3], data[i * 4 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 5] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)超限 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 6] & 0x7F), data[i * 5 + 5], data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 6] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质超限 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[6], data[5], data[4], data[3], data[2] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 7; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("") == false) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// default: -// if (data.length == 4) -// break; -// else { -// wm.setValid(false); -// return wm; -// } -// } -// -// String status = ""; -// status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// wm.setStatus(status); -// wm.setValid(true); -// } -// -// return wm; -// } -// -// /** -// * 将人工置数消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSettingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// SettingDataMessage sdm = new SettingDataMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("人工置数消息时标解析异常"); -// logger.error("人工置数消息时标解析异常"); -// sdm.setValid(false); -// } -// if (tp.getTimeInMillis() - sdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("人工置数消息时标超前"); // 超前半小时以上 -// logger.error("人工置数消息时标超前"); -// sdm.setValid(false); -// } else if (tpDelay != 0 && (sdm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("人工置数消息超时"); -// logger.error("人工置数消息超时"); -// sdm.setValid(false); -// } else { -// sdm.setTime(tp); -// sdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// sdm.setAfn(gbFrame.FRAME_DATA_AFN); -// sdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return sdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 5; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("")) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// sdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// sdm.setStatus(status); -// -// sdm.setValid(true); -// } -// -// return sdm; -// } -// -// /** -// * 将设置终端IC卡有效功能命令响应消息字节数组解析为消息对象AFN=30H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableICCardCommandResponse eicccr = new EnableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// eicccr.setSuccess(true); -// } else { -// eicccr.setSuccess(false); -// } -// -// eicccr.setValid(true); -// } else { -// eicccr.setValid(false); -// } -// -// return eicccr; -// } -// -// /** -// * 将设置终端IC卡功能无效命令响应消息字节数组解析为消息对象AFN=31H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableICCardCommandResponse dicccr = new DisableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dicccr.setSuccess(true); -// } else { -// dicccr.setSuccess(false); -// } -// -// dicccr.setValid(true); -// } else { -// dicccr.setValid(false); -// } -// -// return dicccr; -// } -// -// /** -// * 将设置终端定值控制投入功能命令响应消息字节数组解析为消息对象AFN=32H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableFixedValCommandResponse efvcr = new EnableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// efvcr.setSuccess(true); -// } else { -// efvcr.setSuccess(false); -// } -// -// efvcr.setValid(true); -// } else { -// efvcr.setValid(false); -// } -// -// return efvcr; -// } -// -// /** -// * 将设置终端定值控制退出功能命令响应消息字节数组解析为消息对象AFN=33H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableFixedValCommandResponse dfvcr = new DisableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dfvcr.setSuccess(true); -// } else { -// dfvcr.setSuccess(false); -// } -// -// dfvcr.setValid(true); -// } else { -// dfvcr.setValid(false); -// } -// -// return dfvcr; -// } -// -// /** -// * 将遥控开启水泵/闸门命令响应消息字节数组解析为消息对象AFN=92H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteOpenPumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteOpenPumpCommandResponse ropcr = new RemoteOpenPumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// ropcr.setSuccess(true); -// } else { -// ropcr.setSuccess(false); -// } -// -// ropcr.setValid(true); -// } else { -// ropcr.setValid(false); -// } -// -// return ropcr; -// } -// -// /** -// * 将遥控关闭水泵/闸门命令响应消息字节数组解析为消息对象AFN=93H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteClosePumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteClosePumpCommandResponse rcpcr = new RemoteClosePumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// rcpcr.setSuccess(true); -// } else { -// rcpcr.setSuccess(false); -// } -// -// rcpcr.setValid(true); -// } else { -// rcpcr.setValid(false); -// } -// -// return rcpcr; -// } -// -// /** -// * 将复位终端参数命令响应消息字节数组解析为消息对象AFN=90H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToResetParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ResetParamCommandResponse rpcr = new ResetParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// rpcr.setSuccess(true); -// } else { -// rpcr.setSuccess(false); -// } -// -// rpcr.setValid(true); -// } else { -// rpcr.setValid(false); -// } -// -// return rpcr; -// } -// -// /** -// * 将清空终端历史数据单元命令响应消息字节数组解析为消息对象AFN=91H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToClearHistoryCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ClearHistoryCommandResponse chcr = new ClearHistoryCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x01 || data[0] == 0x02) { -// chcr.setSuccess(true); -// } else { -// chcr.setSuccess(false); -// } -// -// chcr.setValid(true); -// } else { -// chcr.setValid(false); -// } -// -// return chcr; -// } -// -// /** -// * 将查询水泵电机实时工作数据命令响应消息字节数解析为消息对象AFN=5FH -// * -// * @param message -// * @return -// */ -// private AppMessage bytesToQueryRealTimeMotoValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeMotoValueCommandResponse qrtmv = new QueryRealTimeMotoValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 12) { -// // 解析并设置A相电压 -// int vaInt = ByteUtil.binToInt(new byte[] { data[1], data[0] }); -// if (vaInt < 1000) -// qrtmv.setVoltageA(String.valueOf(vaInt)); -// else -// qrtmv.setVoltageA("0"); -// -// // 解析并设置B相电压 -// int vbInt = ByteUtil.binToInt(new byte[] { data[3], data[2] }); -// if (vbInt < 1000) -// qrtmv.setVoltageB(String.valueOf(vbInt)); -// else -// qrtmv.setVoltageB("0"); -// -// // 解析并设置C相电压 -// int vcInt = ByteUtil.binToInt(new byte[] { data[5], data[4] }); -// if (vcInt < 1000) -// qrtmv.setVoltageC(String.valueOf(vcInt)); -// else -// qrtmv.setVoltageC("0"); -// -// // 解析并设置A相电流 -// int eaInt = ByteUtil.binToInt(new byte[] { data[7], data[6] }); -// if (eaInt < 1000) -// qrtmv.setEcurrentA(String.valueOf(eaInt)); -// else -// qrtmv.setEcurrentA("0"); -// -// // 解析并设置B相电流 -// int ebInt = ByteUtil.binToInt(new byte[] { data[9], data[8] }); -// if (ebInt < 1000) -// qrtmv.setEcurrentB(String.valueOf(ebInt)); -// else -// qrtmv.setEcurrentB("0"); -// -// // 解析并设置C相电流 -// int ecInt = ByteUtil.binToInt(new byte[] { data[11], data[10] }); -// if (ecInt < 1000) -// qrtmv.setEcurrentC(String.valueOf(ecInt)); -// else -// qrtmv.setEcurrentC("0"); -// -// qrtmv.setValid(true); -// } else { -// qrtmv.setValid(false); -// } -// return qrtmv; -// } -// -// /** -// * 将查询终端事件记录命令响应消息字节数组解析为消息对象AFN=5DH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryEventRecordsCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryEventRecordsCommandResponse qprcr = new QueryEventRecordsCommandResponse(Calendar.getInstance(), address); -// Map ercs = new HashMap(); -// -// int temp = 0; -// -// // 解析并设置数据域 -// if (data.length == 64) { -// // int num = 1; -// // erc19-32备用 -// for (int j = 0; j < 19; j++) { -// temp = ByteUtil.binToInt(new byte[] { data[j * 2 + 1], data[2 * j] }); -// ercs.put("erc" + Integer.toString(j + 1), Integer.valueOf(temp)); -// // System.out.println(j+"==="+temp+"=="); -// } -// -// qprcr.setErcs(ercs); -// qprcr.setValid(true); -// -// } else { -// qprcr.setValid(false); -// } -// return qprcr; -// } -// -// /** -// * 将查询内存自报数据命令响应消息字节数组解析为消息对象AFH=B2H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryMemeryValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryMemeryValueCommandResponse qmvcr = new QueryMemeryValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// qmvcr.setValid(true); -// } else { -// qmvcr.setValid(false); -// } -// return qmvcr; -// } -// -// /** -// * 将查询终端固态存储数据命令响应消息字节数组解析为消息对象AFH=B1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryHDValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryHDValueCommandResponse qhdvcr = new QueryHDValueCommandResponse(Calendar.getInstance(), address); -// Map qhdm = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length > 9) { -// // 解析并设置参数及起止时间数据 -// String starttime = ByteUtil.bcdToString(new byte[] { data[4], data[3], data[2], data[1] }); -// String endtime = ByteUtil.bcdToString(new byte[] { data[8], data[7], data[6], data[5] }); -// if (starttime.equals("") == true || endtime.equals("") == true) { -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// Calendar start = Calendar.getInstance(); -// Calendar end = Calendar.getInstance(); -// start.set(2000 + Integer.parseInt(starttime.substring(0, 2)), -// Integer.parseInt(starttime.substring(2, 4)) - 1, -// Integer.parseInt(starttime.substring(4, 6)), -// Integer.parseInt(starttime.substring(6, 8)), 0, 0); -// end.set(2000 + Integer.parseInt(endtime.substring(0, 2)), -// Integer.parseInt(endtime.substring(2, 4)) - 1, -// Integer.parseInt(endtime.substring(4, 6)), -// Integer.parseInt(endtime.substring(6, 8)), 0, 0); -// long hour = (end.getTimeInMillis() - start.getTimeInMillis()) / (1000 * 3600); -// -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// qhdvcr.setType(type); -// qhdvcr.setNo(no); -// -// switch (type) { -// case 0: //雨量参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format((Integer.parseInt(realtime) / 10.0), "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 1: //水位参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 3] & 0x0F), data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 3] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 2: //水量参数 -// { -// int interval = (data.length - 9) / 5; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 5) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 4] & 0x7F), data[i + 3], data[i + 2], data[i + 1], data[i]}); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// // 判断剩余水量正负符号 -// Long realtimelong = Long.valueOf(0); -// if ((data[i + 4] & 0x80) == 0x80) -// realtimelong = Long.valueOf(Long.parseLong(realtime) * -1); -// else -// realtimelong = Long.valueOf(realtime); -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(realtimelong)); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 3: //流速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 2] & 0x0F), data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 2] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 4: //闸位参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 5: //功率参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 6: //气压参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 7: //风速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 8: //水温参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 10: //土壤含水率参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 11: //水压参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] { data[i + 3], data[i + 2 ], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// default://其它参数未实现 -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// qhdvcr.setValid(true); -// -// } else { -// qhdvcr.setValid(false); -// } -// return qhdvcr; -// } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //获取传感器数量 + + int offset = cmd.getOffset(); //获取湿度变量的内存地址偏移量 + offset = offset + wsct * 2 * 2 * 2; + + // 解析并存储温度值 + for (int i = 0; i < wsct; i++) { + byte[] tempValueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; + byte[] tempThresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; + + float tempValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempValueByte), 16)); //温度监测值 + float tempThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempThresholdByte), 16)); //温度报警阈值 + + rwvcr.getWd().add(tempValue); + rwvcr.getWdbjz().add(tempThreshold); + } + + // 解析并存储湿度值 + for (int i = 0; i < wsct; i++) { + byte[] humValueByte = new byte[] { data[i*8 + 2 + offset], data[i*8 + 3 + offset], data[i*8 + offset], data[i*8 + 1 + offset] }; + byte[] humThresholdByte = new byte[] { data[i*8 + 6 + offset], data[i*8 + 7 + offset], data[i*8 + 4 + offset], data[i*8 + 5 + offset] }; + + float humValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humValueByte), 16)); //湿度监测值 + float humThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humThresholdByte), 16)); //湿度报警阈值 + + rwvcr.getSd().add(humValue); + rwvcr.getSdbjz().add(humThreshold); + } + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //温湿度监测点的数量 + + // 处理温度状态 + String tempDataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 1); + char bjBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 2); + + rwsscr.getWdbj().add(bjBit == '1' ? true : false); + rwsscr.getWdldbj().add(ldBit == '1' ? true : false); + } + + // 处理湿度状态 + String humDataStr = ByteUtil.binToBinString(new byte[] { data[4], data[5] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = humDataStr.charAt(humDataStr.length() - 2 * i - 1); + char bjBit = humDataStr.charAt(humDataStr.length() - 2 * i - 2); + + rwsscr.getSdbj().add(bjBit == '1' ? true : false); + rwsscr.getSdldbj().add(ldBit == '1' ? true : false); + } + } + + return rwsscr; + } + /** * 将消息对象解析为字节数组 @@ -3507,18 +512,25 @@ frame = LinkCommandToBytes((LinkCommand) message); } - // 读取甲烷参数内存命令 - if (message instanceof ReadCH4ParamCommand) { - frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); - } else if (message instanceof ReadCH4StatusCommand) { - frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); - } - -// // 读内存命令 -// if (message instanceof FreeMessageResponse) { -// frame = freeMessageResponseToBytes((FreeMessageResponse) message); +// // 读取甲烷参数内存命令 +// if (message instanceof ReadCH4ValueCommand) { +// frame = ReadCH4ValueCommandToBytes((ReadCH4ValueCommand) message); +// } else if (message instanceof ReadCH4StatusCommand) { +// frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); // } // +// // 读取温湿度命令 +// else if (message instanceof ReadWSValueCommand) { +// frame = ReadWSValueCommandToBytes((ReadWSValueCommand) message); +// } else if (message instanceof ReadWSStatusCommand) { +// frame = ReadWSStatusCommandToBytes((ReadWSStatusCommand) message); +// } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } +// // // 写内存命令 // if (message instanceof QueryRealTimeValueCommand) { // frame = queryRealTimeValueCommandToBytes((QueryRealTimeValueCommand) message); @@ -3527,6 +539,8 @@ return frame; } + + /** * 将握手命令转换为字节数组 * @@ -3540,28 +554,12 @@ } /** - * 将读取甲烷监测值命令转换为字节数组 - * @param read - * @return - */ - private byte[] ReadCH4ParamCommandToBytes(ReadCH4ParamCommand read) { - byte[] start = ByteUtil.hexStringToBytes(read.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(read.getDestinationId(), - read.getMessageProducerId(), - read.getMemoryArea(), - start, - read.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将读取甲烷报警状态命令转换为字节数组 + * 将读取PLC内存命令转换为字节数组 + * * @param message * @return */ - private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), @@ -3569,1221 +567,78 @@ message.getMemoryArea(), start, message.getCountWord()); - + return finsFrame.toBytes(); } + /** + * 将读取甲烷监测值命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4ValueCommandToBytes(ReadCH4ValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } -// /** -// * 将退出登录命令对象转换为字节数组AFN=02H -// * -// * @param hmr -// * @return -// */ -// private byte[] logoutCommandToBytes(LogoutCommand lc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, lc.getDestinationId(), -// GBConstants.DATA_AFN_LOGIN, new byte[] { (byte) 0xF1 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置地址命令对象转换为字节数组AFN=10H -// * -// * @param message -// * @return -// */ -// private byte[] setAddressCommandToBytes(SetAddressCommand sac) { -// String address = sac.getNewAddress(); -// -// // 解析设置的新地址内容 -// byte[] add1 = ByteUtil.bcdStringToBytes(address.substring(0, 6)); -// byte[] add2 = ByteUtil.hexStringToBytes(address.substring(7, 10)); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(add1).append(add2[1]).append(add2[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sac.getDestinationId(), -// GBConstants.DATA_AFN_SETADDRESS, data.toBytes(), pw, -// sac.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询地址命令对象转换为字节数组AFN=50H -// * -// * @param message -// * @return -// */ -// private byte[] queryAddressCommandToBytes(QueryAddressCommand qac) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qac.getDestinationId(), -// GBConstants.DATA_AFN_QUERYADDRESS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置时钟命令对象转换为字节数组AFN=11H -// * -// * @param scc -// * @return -// */ -// private byte[] setClockCommandToBytes(SetClockCommand scc) { -// Calendar clock = scc.getClock(); -// -// // 解析设置的新时钟内容 -// int week = clock.get(Calendar.DAY_OF_WEEK); -// switch (week) { -// case Calendar.MONDAY: -// case Calendar.TUESDAY: -// case Calendar.WEDNESDAY: -// case Calendar.THURSDAY: -// case Calendar.FRIDAY: -// case Calendar.SATURDAY: -// week = week - 1; -// break; -// case Calendar.SUNDAY: -// week = week - 1 + 7; -// break; -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcd(clock.get(Calendar.SECOND))); // 秒 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append((byte) (ByteUtil.intToBcd(clock.get(Calendar.MONTH) + 1) | (ByteUtil -// .intToBcd(week) << 5))); // 月 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.YEAR) - 2000)); // 年 -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCLOCK, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询时钟命令对象转换为字节数组AFN=51H -// * -// * @param message -// * @return -// */ -// private byte[] queryClockCommandToBytes(QueryClockCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCLOCK); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置工作模式命令对象转换为字节数组AFN=12H -// * -// * @param message -// * @return -// */ -// private byte[] setPatternCommandToBytes(SetPatternCommand spc) { -// String newPattern = spc.getPattern(); -// if (newPattern.length() > 2) { -// newPattern = newPattern.substring(0, 2); -// } -// -// // 解析设置的新工作模式内容 -// byte[] pattern = ByteUtil.hexStringToBytes(newPattern); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(pattern); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETWORKPATTERN, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询工作模式命令对象转换为字节数组AFN=52H -// * -// * @param message -// * @return -// */ -// private byte[] queryPatternCommandToBytes(QueryPatternCommand qpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWORKPATTERN); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置自报种类及时间间隔命令对象转换为字节数组AFN=A1H -// * -// * @param message -// * @return -// */ -// private byte[] setIntervalCommandToBytes(SetIntervalCommand sic) { -// Map newIntervals = sic.getIntervals(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// Bytes di = new Bytes(); // 每种参数自报的时间间隔 -// for (int i = 0; i < SetIntervalCommand.index.length; i++) { -// String key = SetIntervalCommand.index[i]; -// if (newIntervals.containsKey(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// int val = ((Integer) newIntervals.get(key)).intValue(); -// int low = val % 100; -// int high = val / 100; -// di.append(ByteUtil.intToBcd(low)).append(ByteUtil.intToBcd(high)); -// } else { -// di.append(new byte[] { 0x00, 0x00 }); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]).append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sic.getDestinationId(), -// GBConstants.DATA_AFN_SETINTERVAL, data.toBytes(), pw, -// sic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询自报种类及时间间隔命令对象转换为字节数组AFN=53H -// * -// * @param message -// * @return -// */ -// private byte[] queryIntervalCommandToBytes(QueryIntervalCommand qic) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qic.getDestinationId(), -// GBConstants.DATA_AFN_QUERYINTERVAL); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端需查询的实时数据种类命令对象转换为字节数组AFN=A0H -// * -// * @param message -// * @return -// */ -// private byte[] setRttypesCommandToBytes(SetRttypesCommand src) { -// Set newRttypes = src.getRttypes(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// for (int i = 0; i < SetRttypesCommand.index.length; i++) { -// String key = SetRttypesCommand.index[i]; -// if (newRttypes.contains(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, src.getDestinationId(), -// GBConstants.DATA_AFN_SETRTTYPES, data.toBytes(), pw, -// src.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端需查询的实时数据种类命令对象转换为字节数组AFN=54H -// * -// * @param message -// * @return -// */ -// private byte[] queryRttypesCommandToBytes(QueryRttypesCommand qrc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYRTTYPES); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端充值量命令对象转换为字节数组AFN=15H -// * -// * @param message -// * @return -// */ -// private byte[] setChargingCommandToBytes(SetChargingCommand scc) { -// String charging = scc.getNewCharging(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(charging), 4)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCHARGING, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端充值量命令对象转换为字节数组AFN=55H -// * -// * @param message -// * @return -// */ -// private byte[] queryChargingCommandToBytes(QueryChargingCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCHARGING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端剩余水量报警值命令对象转换为字节数组AFN=16H -// * -// * @param message -// * @return -// */ -// private byte[] setWarningCommandToBytes(SetWarningCommand swc) { -// String warning = swc.getNewWarning(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(warning), 3)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swc.getDestinationId(), -// GBConstants.DATA_AFN_SETWARNING, data.toBytes(), pw, -// swc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端剩余水量报警值命令对象转换为字节数组AFN=56H -// * -// * @param message -// * @return -// */ -// private byte[] queryWarningCommandToBytes(QueryWarningCommand qwc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWARNING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水位参数命令对象转换为字节数组AFN=17H -// * -// * @param message -// * @return -// */ -// private byte[] setWlParamCommandToBytes(SetWlParamCommand swpc) { -// List> wlParams = swpc.getWlParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wlParams.size(); i++) { -// List wlp = (List) wlParams.get(i); -// -// int benchmark = (int) (((Double) wlp.get(0)).doubleValue() * 100); -// int upper = (int) (((Double) wlp.get(1)).doubleValue() * 100); -// int lower = (int) (((Double) wlp.get(2)).doubleValue() * 100); -// -// byte[] bb = ByteUtil.intToBcdsHL(Math.abs(benchmark), 3); -// if (benchmark < 0) { -// bb[2] = (byte) (bb[2] + 0x80); -// } -// byte[] ub = ByteUtil.intToBcdsHL(upper, 2); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 2); -// data.append(bb).append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERLEVELPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水位参数命令对象转换为字节数组AFN=57H -// * -// * @param message -// * @return -// */ -// private byte[] queryWlParamCommandToBytes(QueryWlParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERLEVELPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水压参数命令对象转换为字节数组AFN=18H -// * -// * @param message -// * @return -// */ -// private byte[] setWpParamCommandToBytes(SetWpParamCommand swpc) { -// List> wpParams = swpc.getWpParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wpParams.size(); i++) { -// List wpp = (List) wpParams.get(i); -// -// int upper = (int) (((Double) wpp.get(0)).doubleValue() * 100); -// int lower = (int) (((Double) wpp.get(1)).doubleValue() * 100); -// -// byte[] ub = ByteUtil.intToBcdsHL(upper, 4); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 4); -// data.append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERPRESSUREPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水压参数命令对象转换为字节数组AFN=58H -// * -// * @param message -// * @return -// */ -// private byte[] queryWpParamCommandToBytes(QueryWpParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERPRESSUREPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数上限命令对象转换为字节数组AFN=19H -// * -// * @param message -// * @return -// */ -// private byte[] setWqUpperParamCommandToBytes(SetWqUpperParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqUpperParamCommand.index.length; i++) { -// String key = SetWqUpperParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqUpperParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYUPPERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数下限命令对象转换为字节数组AFN=1AH -// * -// * @param message -// * @return -// */ -// private byte[] setWqLowerParamCommandToBytes(SetWqLowerParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqLowerParamCommand.index.length; i++) { -// String key = SetWqLowerParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqLowerParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYLOWERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数上限命令对象转换为字节数组AFN=59H -// * -// * @param message -// * @return -// */ -// private byte[] queryWqUpperParamCommandToBytes(QueryWqUpperParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数下限命令对象转换为字节数组AFN=5AH -// * -// * @param message -// * @return -// */ -// private byte[] queryWqLowerParamCommandToBytes(QueryWqLowerParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYLOWERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端流量参数命令对象转换为字节数组AFN=1FH -// * -// * @param message -// * @return -// */ -// private byte[] setWfParamCommandToBytes(SetWfParamCommand swpc) { -// List newUppers = swpc.getNewUppers(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < newUppers.size(); i++) { -// double value = ((Double) newUppers.get(i)).doubleValue(); -// int upper = (int) (Math.abs(value) * 1000); -// byte[] ub = ByteUtil.intToBcdsHL(upper, 5); -// if (value < 0) { -// ub[4] = (byte) (ub[4] + 0xF0); -// } -// data.append(ub); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERFLOWUPPERPARAM, data.toBytes(), -// pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端流量参数命令对象转换为字节数组AFN=64H -// * -// * @param message -// * @return -// */ -// private byte[] queryWfParamCommandToBytes(QueryWfParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERFLOWUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时值命令对象转换为字节数组AFN=B0H -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeValueCommandToBytes(QueryRealTimeValueCommand qrtvc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// qrtvc.getRttype(), qrtvc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMEVALUE); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水量表底值命令对象转换为字节数组AFN=1BH -// * -// * @param message -// * @return -// */ -// private byte[] setFlowInitCommandToBytes(SetFlowInitCommand sfic) { -// List inits = sfic.getNewInits(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < inits.size(); i++) { -// long init = ((Long) inits.get(i)).longValue(); -// byte[] ib = ByteUtil.intToBcdsHL(init, 5); -// data.append(ib); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfic.getDestinationId(), -// GBConstants.DATA_AFN_SETFLOWINIT, data.toBytes(), pw, -// sfic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔命令对象转换为字节数组AFN=20H -// * -// * @param message -// * @return -// */ -// private byte[] setThresholdCommandToBytes(SetThresholdCommand stc) { -// int type = stc.getType(); -// int no = stc.getNo(); -// int inter = stc.getInter(); -// double thresh = stc.getThresh(); + /** + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); // -// String noHex = ByteUtil.binToHexString(ByteUtil.intToBins(no, 1)); -// noHex = noHex.substring(noHex.length() - 1); -// String typeHex = ByteUtil.binToHexString(ByteUtil.intToBins(type, 1)); -// typeHex = typeHex.substring(typeHex.length() - 1); +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); // -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.hexStringToBytes(typeHex + noHex)); -// data.append(ByteUtil.intToBins(inter, 1)); -// byte[] threshBytes = null; -// -// // 控制域FN -// int control_fn = 0; -// -// // 判断设置检测参数的类型 -// switch (type) { -// case 0: //雨量参数 -// data.append(ByteUtil.intToBcd((int) (thresh * 10))); -// control_fn = 1; -// break; -// -// case 1: //水位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 4); -// if (thresh < 0) { -// threshBytes[3] = (byte) (threshBytes[3] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 2; -// break; -// -// case 2: //水量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh)), 5); -// if (thresh < 0) { -// threshBytes[4] = (byte) (threshBytes[4] | 0x80); -// } -// data.append(threshBytes); -// -// control_fn = 3; -// break; -// -// case 3: //流速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 3); -// if (thresh < 0) { -// threshBytes[2] = (byte) (threshBytes[2] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 4; -// break; -// -// case 4: //闸位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 5; -// break; -// -// case 5: //功率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 6; -// break; -// -// case 6: //气压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 7; -// break; -// -// case 7: //风速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 8; -// break; -// -// case 8: //水温参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 9; -// break; -// -// case 10: //土壤含水率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 11; -// break; -// -// case 11: //蒸发量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 3); -// data.append(threshBytes); -// -// control_fn = 12; -// break; -// -// case 12: //水压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 4); -// data.append(threshBytes); -// -// control_fn = 15; -// break; -// -// default: -// thresh = 0.0; -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, stc.getDestinationId(), -// GBConstants.DATA_AFN_SETTHRESHOLD, data.toBytes(), pw, -// stc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端定值量命令对象转换为字节数组AFN=34H -// * -// * @param message -// * @return -// */ -// private byte[] setFixedValueCommandToBytes(SetFixedValueCommand sfvc) { -// long fixedvalue = sfvc.getNewFixedValue(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] fb = ByteUtil.intToBcdsHL(fixedvalue, 5); -// data.append(fb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfvc.getDestinationId(), -// GBConstants.DATA_AFN_SETFIXEDVALUE, data.toBytes(), pw, -// sfvc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将修改终端密码命令对象转换为字节数组AFN=96H -// * -// * @param message -// * @return -// */ -// private byte[] setPasswordCommandToBytes(SetPasswordCommand spc) { -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] pb = ByteUtil.intToBcdsHL(spc.getNewPassword(), 2); -// data.append(pb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETPASSWORD, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时状态命令对象转换为字节数组AFN=5EH -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeStatusCommandToBytes(QueryRealTimeStatusCommand qrtsc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_QSS, qrtsc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMESTATUS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将自报响应消息转换为字节数组 自报消息通用响应 -// * -// * @param message -// * @return -// */ -// private byte[] freeMessageResponseToBytes(FreeMessageResponse fmr) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, fmr.getFcb(), -// fmr.getType(), fmr.getDestinationId(), -// fmr.getAfn(), new byte[] { 0x00 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能有效命令转换为字节数组AFN=30H -// * -// * @param message -// * @return -// */ -// private byte[] enableICCardCommandToBytes(EnableICCardCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEICCARD, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能无效命令转换为字节数组AFN=31H -// * -// * @param message -// * @return -// */ -// private byte[] disableICCardCommandToBytes(DisableICCardCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEICCARD, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制投入功能命令转换为字节数组AFN=32H -// * -// * @param message -// * @return -// */ -// private byte[] enableFixedValCommandToBytes(EnableFixedValCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEFIXEDVAL, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制退出功能命令转换为字节数组AFN=33H -// * -// * @param message -// * @return -// */ -// private byte[] disableFixedValCommandToBytes(DisableFixedValCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEFIXEDVAL, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控开启水泵/闸门命令转换为字节数组AFN=92H -// * -// * @param message -// * @return -// */ -// private byte[] remoteOpenPumpCommandToBytes(RemoteOpenPumpCommand ropc) { -// byte[] data = ByteUtil.hexStringToBytes(ropc.getPump() + ropc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, ropc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTEOPENPUMP, data, pw, ropc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控关闭水泵/闸门命令转换为字节数组AFN=93H -// * -// * @param message -// * @return -// */ -// private byte[] remoteClosePumpCommandToBytes(RemoteClosePumpCommand rcpc) { -// byte[] data = ByteUtil.hexStringToBytes(rcpc.getPump() + rcpc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rcpc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTECLOSEPUMP, data, pw, rcpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将复位终端参数命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] resetParamCommandToBytes(ResetParamCommand rpc) { -// byte[] data = ByteUtil.hexStringToBytes(rpc.getReset(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rpc.getDestinationId(), -// GBConstants.DATA_AFN_RESETPARAM, data, pw, rpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将清空历史数据单元命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] clearHistoryCommandToBytes(ClearHistoryCommand chc) { -// byte[] data = ByteUtil.hexStringToBytes(chc.getClear(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, chc.getDestinationId(), -// GBConstants.DATA_AFN_CLEARHISTORY, data, pw, chc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询水泵电机实时工作数据的命令转换为字节数组AFN=5FH -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryRealTimeMotoValueCommandToBytes( -// QueryRealTimeMotoValueCommand qrtmv) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrtmv.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEMOTOSS); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端事件记录的命令转换为字节数组5DH -// * -// * @param message -// * @return -// */ -// private byte[] queryEventRecordsCommandToBytes(QueryEventRecordsCommand qerc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEVENTREC); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询内存自报数据的命令转换为字节数组B2H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryMemeryValueCommandToBytes(QueryMemeryValueCommand qerc) { -// Calendar bclock = qerc.getBdate(); -// Calendar eclock = qerc.getEdate(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYMEMERYVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询固态存储数据的命令转换为字节数组B1H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryHDValueCommandToBytes(QueryHDValueCommand qhdc) { -// int type = qhdc.getType(); -// int no = qhdc.getNo(); -// Calendar sclock = qhdc.getSclock(); -// Calendar eclock = qhdc.getEclock(); -// -// int i = type * 16 + no; -// -// int control_fn = GBConstants.CTRL_DIR0_QACC; -// if (type == 0) //查询雨量参数 -// control_fn = GBConstants.CTRL_DIR0_QRF; -// else if (type == 1) //查询水位参数 -// control_fn = GBConstants.CTRL_DIR0_QWL; -// else if (type == 2) //查询水量参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 3) //查询流速参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 4) //查询闸位参数 -// control_fn = GBConstants.CTRL_DIR0_QBC; -// else if (type == 5) //查询功率参数 -// control_fn = GBConstants.CTRL_DIR0_QPW; -// else if (type == 6) //查询气压参数 -// control_fn = GBConstants.CTRL_DIR0_QAP; -// else if (type == 7) //查询风速参数 -// control_fn = GBConstants.CTRL_DIR0_QWS; -// else if (type == 8) //查询水温参数 -// control_fn = GBConstants.CTRL_DIR0_QWT; -// else if (type == 9) //查询水质参数 -// control_fn = GBConstants.CTRL_DIR0_QWQ; -// else if (type == 10) //查询土壤含水率参数 -// control_fn = GBConstants.CTRL_DIR0_QSA; -// else if (type == 11) //查询水压参数 -// control_fn = GBConstants.CTRL_DIR0_QHP; -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBins(i, 1)); -// -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.YEAR))); // 年 -// -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.YEAR))); // 年 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, qhdc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYHARDDISCVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// -// /** -// * 从重叠消息中提取规范消息 -// */ -// public List extractByteMessage(byte[] byteMessage) { -// List bytesList = new ArrayList(); -// -// try { -// int i = 0; -// while (i < byteMessage.length) { -// if ((byteMessage[i] == GBByteFrame.FRAME_HEAD) && (byteMessage[i + 2] == GBByteFrame.FRAME_HEAD)) { -// int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 1]}); -// if (i + length + 5 <= byteMessage.length && byteMessage[i + length + 4] == GBByteFrame.FRAME_END) { -// Bytes bytes = new Bytes(); -// bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]); -// for (int j = 0; j < length + 2; j++) { -// bytes.append(byteMessage[i + 3 + j]); -// } -// -// i = i + length + 5; -// bytesList.add(bytes.toBytes()); -// } else { -// i++; -// } -// } else { -// i++; -// } -// } -// } catch (Exception e) { -// bytesList.clear(); -// bytesList.add(byteMessage); -// return bytesList; -// } -// -// return bytesList; +// return finsFrame.toBytes(); // } + /** + * 将读取温湿度监测值命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSValueCommandToBytes(ReadWSValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + + /** + * 将读取温湿度报警状态命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSStatusCommandToBytes(ReadWSStatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + } diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java deleted file mode 100644 index 3570a07..0000000 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.szpg.task; - -import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; -import com.szpg.db.data.PgAcuRdcmd; -import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; - -public class ReadCH4ParamTask implements Runnable { - - private ACUClient client; - private AppCommand appCommand; - - public ReadCH4ParamTask(ACUClient client, AppCommand command) { - this.client = client; - this.appCommand = command; - } - - @Override - public void run() { - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(appCommand); - - // 发送读取甲烷参数内存命令 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - ReadCH4ParamCommand ch4Cmd = (ReadCH4ParamCommand) appCommand; - - // 发送完成之后将命令保存在数据库中 - PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(ch4Cmd.getCommandType()); - cmd.setDest(ch4Cmd.getDestinationId()); - cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); - cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); - cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCountWord()); - cmd.setCount_bit(ch4Cmd.getCountBit()); - - new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); - } - -} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 12d1c18..736bc18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -13,11 +13,12 @@ import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.message.command.read.ReadCH4StatusCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -123,17 +124,25 @@ // 3根据参数类型调用相应的方法进行解析 switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - received = bytesToReadCH4ParamCommand(finsFrame); + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, readCmd); break; case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + received = bytesToReadCH4StatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, readCmd); break; } - // 4将有效的命令的是否有响应字段置1 - readCmdDao.updateCmdRecordResponsed(readCmd.getId()); + // 4将已响应的命令删除 + readCmdDao.deleteCmdRecord(readCmd.getId()); } } else if (commandCode.equalsIgnoreCase("0102")) { @@ -320,6 +329,7 @@ } + /** * 将握手响应字节数组转换为消息对象 * @@ -352,15 +362,15 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4ParamCommand(FINSByteFrame finsFrame) { - ReadCH4ParamCommandResponse rcpcr = new ReadCH4ParamCommandResponse(); + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadCH4ValueCommandResponse rcpcr = new ReadCH4ValueCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; rcpcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = data.length / (2 * 2 * 2); //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占2个字,每个字占2个字节 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 for (int i = 0; i < chct; i++) { byte[] valueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; byte[] thresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; @@ -383,7 +393,7 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; @@ -391,7 +401,7 @@ if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); @@ -401,3097 +411,92 @@ rcscr.getJwldbj().add(ldBit == '1' ? true : false); } } - + return rcscr; } -// -// /** -// * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryAddressResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryAddressCommandResponse qacr = new QueryAddressCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String addressRes = ByteUtil.bcdToString(new byte[] { data[0], data[1], data[2] }) + -// ByteUtil.binToHexString(new byte[] { data[4], data[3] }); -// if (addressRes.length() == 10) { -// qacr.setValid(true); -// qacr.setAddress(addressRes); -// } else { -// logger.error("查询终端地址响应消息解析错误"); -// qacr.setValid(false); -// } -// } else { -// logger.error("查询终端地址响应消息长度错误"); -// qacr.setValid(false); -// } -// -// return qacr; -// } -// -// /** -// * 将设置终端时钟响应消息字节数组解析为消息对象AFN=11H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetClockCommandResponse sccr = new SetClockCommandResponse(Calendar.getInstance(), address); -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// try { -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// sccr.setValid(false); -// return sccr; -// } catch (Exception re) { -// logger.error("时间字段解析异常"); -// sccr.setValid(false); -// return sccr; -// } -// -// sccr.setNewClock(clock); -// -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端时钟响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端时钟响应消息字节数组解析为消息对象AFN=51H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryClockCommandResponse qccr = new QueryClockCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// try { -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// qccr.setValid(false); -// return qccr; -// } -// -// qccr.setClock(clock); -// qccr.setValid(true); -// } else { -// logger.error("查询终端时钟响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端工作模式响应消息字节数组解析为消息对象AFN=12H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPatternCommandResponse spcr = new SetPatternCommandResponse(Calendar.getInstance(), address); -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setWorkPattern(patternRes); -// } else { -// logger.error("设置终端工作模式响应消息长度错误"); -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端工作模式响应消息字节数组解析为消息对象AFN=52H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryPatternCommandResponse qpcr = new QueryPatternCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// qpcr.setValid(true); -// qpcr.setWorkPattern(patternRes); -// } else { -// logger.error("查询终端工作模式响应消息长度错误"); -// qpcr.setValid(false); -// } -// -// return qpcr; -// } -// -// /** -// * 将设置终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=A1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetIntervalCommandResponse sicr = new SetIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// sicr.setValid(true); -// sicr.setIntervals(intervals); -// -// sicr.setValid(true); -// sicr.setSuccess(true); -// } else { -// logger.error("设置终端自报种类及时间间隔响应消息长度错误"); -// sicr.setValid(false); -// } -// -// return sicr; -// } -// -// /** -// * 将查询终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=53H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryIntervalCommandResponse qicr = new QueryIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// qicr.setValid(true); -// qicr.setIntervals(intervals); -// } else { -// logger.error("查询终端自报种类及时间间隔响应消息长度错误"); -// qicr.setValid(false); -// } -// -// return qicr; -// } -// -// /** -// * 将设置终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=A0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetRttypesCommandResponse srcr = new SetRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// srcr.setRttypes(rttypes); -// -// srcr.setValid(true); -// srcr.setSuccess(true); -// } else { -// logger.error("设置终端需查询的实时数据种类响应消息长度错误"); -// srcr.setValid(false); -// } -// -// return srcr; -// } -// -// /** -// * 将查询终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=54H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRttypesCommandResponse qrcr = new QueryRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// -// qrcr.setValid(true); -// qrcr.setRttypes(rttypes); -// } else { -// logger.error("查询终端需查询的实时数据种类响应消息长度错误"); -// qrcr.setValid(false); -// } -// -// return qrcr; -// } -// -// /** -// * 将设置终端充值量响应消息字节数组解析为消息对象AFN=15H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetChargingCommandResponse sccr = new SetChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// -// sccr.setCharging(Integer.parseInt(charging)); -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端充值量响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端充值量和剩余水量响应消息字节数组解析为消息对象AFN=55H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryChargingCommandResponse qccr = new QueryChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 9) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[8] & 0x7F), data[7], data[6], data[5], data[4] }); -// -// if (charging.equals("") == false && current.equals("") == false) { -// qccr.setValid(true); -// qccr.setCharging(Integer.parseInt(charging)); -// // 判断剩余水量正负符号 -// if ((data[8] & 0x80) == 0x80) { -// qccr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qccr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息解析错误"); -// qccr.setValid(false); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端剩余水量报警值响应消息字节数组解析为消息对象AFN=16H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWarningCommandResponse swcr = new SetWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 3) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (warning.equals("") == false) { -// swcr.setNewWarning(Integer.parseInt(warning)); -// } -// -// swcr.setValid(true); -// swcr.setSuccess(true); -// } else { -// logger.error("设置终端剩余水量报警值响应消息长度错误"); -// swcr.setValid(false); -// } -// -// return swcr; -// } -// -// /** -// * 将查询终端剩余水量报警值响应消息字节数组解析为消息对象AFN=56H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWarningCommandResponse qwcr = new QueryWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[7] & 0x7F), data[6], data[5], data[4], data[3] }); -// -// if (warning.equals("") == false && current.equals("") == false) { -// qwcr.setValid(true); -// qwcr.setWarning(Integer.parseInt(warning)); -// // 判断剩余水量正负符号 -// if ((data[7] & 0x80) == 0x80) { -// qwcr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qwcr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息解析错误"); -// qwcr.setValid(false); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息长度错误"); -// qwcr.setValid(false); -// } -// -// return qwcr; -// } -// -// /** -// * 将设置终端水位参数响应消息字节数组解析为消息对象AFN=17H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWlParamCommandResponse swpcr = new SetWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 7 == 0) { -// int n = data.length / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// swpcr.setWlParams(wlParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水位参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水位参数响应消息字节数组解析为消息对象AFN=57H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWlParamCommandResponse qwpcr = new QueryWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 9 && data.length % 7 == 2) { -// int n = (data.length - 2) / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWlParams(wlParams); -// qwpcr.setValid(true); -// -// } else { -// logger.error("查询水位参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=18H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWpParamCommandResponse swpcr = new SetWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 8 && data.length % 8 == 0) { -// int n = data.length / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// swpcr.setWpParams(wpParams); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水压参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数响应消息字节数组解析为消息对象AFN=58H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWpParamCommandResponse qwpcr = new QueryWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 10 && data.length % 8 == 2) { -// int n = (data.length - 2) / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWpParams(wpParams); -// qwpcr.setValid(true); -// } else { -// logger.error("查询水压参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=19H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqUpperParamCommandResponse swpcr = new SetWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=1AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqLowerParamCommandResponse swpcr = new SetWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数上限响应消息字节数组解析为消息对象AFN=59H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqUpperParamCommandResponse qwpcr = new QueryWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将查询终端水压参数下限响应消息字节数组解析为消息对象AFN=5AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqLowerParamCommandResponse qwpcr = new QueryWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端流量参数响应消息字节数组解析为消息对象AFN=1FH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWfParamCommandResponse swpcr = new SetWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// swpcr.setNewUppers(uppers); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端流量参数响应消息字节数组解析为消息对象AFN=64H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWfParamCommandResponse qwpcr = new QueryWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 5 == 2) { -// int n = (data.length - 2) / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setUppers(uppers); -// qwpcr.setValid(true); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水量表底值响应消息字节数组解析为消息对象AFN=1BH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFlowInitCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFlowInitCommandResponse sficr = new SetFlowInitCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5; //监测点个数 -// List inits = new ArrayList(n); -// -// // 解析多个监测点的值 -// for (int i = 0; i < n; i++) { -// String init = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4]), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// -// inits.add(Long.valueOf(init)); -// } -// sficr.setNewInits(inits); -// -// sficr.setValid(true); -// sficr.setSuccess(true); -// } else { -// sficr.setValid(false); -// } -// -// return sficr; -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔响应消息字节数组解析为消息对象AFN=20H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetThresholdCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetThresholdCommandResponse stcr = new SetThresholdCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 3) { -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// int inter = data[1]; -// double thresh = 0.0; -// -// stcr.setType(type); -// stcr.setNo(no); -// stcr.setInter(inter); -// -// switch (type) { -// case 0: //雨量参数 -// stcr.setThresh(ByteUtil.bcdToInt(data[2])/10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 1: //水位参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[5] & 0x0F), data[4], data[3], data[2]}); -// if ((data[5] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 2: //水量参数 -// if (data.length == 7) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[6] & 0x7F), data[5], data[4], data[3], data[2]}); -// if ((data[6] & 0x80) == 0x80) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 3: //流速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[4] & 0x0F), data[3], data[2]}); -// if ((data[4] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 4: //闸位参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 5: //功率参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 6: //气压参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 7: //风速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 8: //水温参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 10: //土壤含水率参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 11: //蒸发量参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 12: //水压参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[5], data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// default: -// stcr.setThresh(0.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// } -// } else { -// stcr.setValid(false); -// } -// -// return stcr; -// } -// -// /** -// * 将设置终端定值量响应消息字节数组解析为消息对象AFN=34H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFixedValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFixedValueCommandResponse sfvcr = new SetFixedValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String fixed = ByteUtil.bcdToString(new byte[] {(byte) (data[4]), data[3], data[2], data[1], data[0]}); -// -// sfvcr.setFixedValue(Long.parseLong(fixed)); -// -// sfvcr.setValid(true); -// sfvcr.setSuccess(true); -// } else { -// sfvcr.setValid(false); -// } -// -// return sfvcr; -// } -// -// /** -// * 将修改终端密码响应消息字节数组解析为消息对象AFN=96H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPasswordCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPasswordCommandResponse spcr = new SetPasswordCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setNewPassword((int) ByteUtil.bcdToLong(new byte[] {data[1], data[0]})); -// } else { -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端实时值命令响应消息字节数组解析为消息对象AFN=B0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeValueCommandResponse qrtvcr = new QueryRealTimeValueCommandResponse(Calendar.getInstance(), address); -// qrtvcr.setRttype(gbFrame.FRAME_CONTROL_FN); -// -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return qrtvcr; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } catch (Exception e) { -// results += "0"+ ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt))); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// qrtvcr.setResults(results); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[1] & 0x0F), data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 2 + 1], data[i * 2] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] {data[data.length - 3], data[data.length - 4] }); -// qrtvcr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] {data[data.length - 1], data[data.length - 2] }); -// qrtvcr.setStatus(status); -// -// qrtvcr.setValid(true); -// return qrtvcr; -// } -// -// /** -// * 将查询终端实时状态命令响应消息字节数组解析为消息对象AFN=5EH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeStatusCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeStatusCommandResponse qrtscr = new QueryRealTimeStatusCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// qrtscr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[3], data[2] }); -// qrtscr.setStatus(status); -// -// qrtscr.setValid(true); -// } else { -// qrtscr.setValid(false); -// } -// -// return qrtscr; -// } -// -// /** -// * 将定时自报消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToTimingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// TimingDataMessage tdm = new TimingDataMessage(Calendar.getInstance(), address); -// -// // 先处理时标 -// byte[] bt = new byte[4]; -// for (int i = 0; i < bt.length; i++) { -// bt[i] = gbFrame.FRAME_DATA_BODY[gbFrame.FRAME_DATA_BODY.length - 1 - bt.length + i]; -// } -// -// // TP中的秒分时日 -// int second = ByteUtil.bcdToInt(bt[bt.length - 4]); -// int minute = ByteUtil.bcdToInt(bt[bt.length - 3]); -// int hour = ByteUtil.bcdToInt(bt[bt.length - 2]); -// int date = ByteUtil.bcdToInt(bt[bt.length - 1]); -// -// Calendar tp = null; -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// -// if (date == tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期与当前日期相同 -// * 表示为最近的自报消息 -// * 判断是否超前 -// * 不超前即认为是正常自报或当日的补报 -// */ -// if (tp.getTimeInMillis() - tdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("定时自报消息时标超前"); // 超前半小时以上 -// logger.error("定时自报消息时标超前"); -// tdm.setValid(false); -// -// return tdm; -// } -// -// tdm.setTime(tp); -// } -// else if (date > tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期大于当前日期 -// * 表示可能为上月的补报自报消息 -// * 将月份减1 -// */ -// try { -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// else { -// /** -// * 日期小于当前日期 -// * 认为是当月的补报自报消息 -// * 月份不变 -// */ -// tdm.setTime(tp); -// } -// } catch (Exception re) { -// /** -// * 判断是否是日期为31导致的错误 -// * 将月份减1 -// */ -// try { -// tp = Calendar.getInstance(); -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// -// tdm.setTime(tp); -// tdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// tdm.setAfn(gbFrame.FRAME_DATA_AFN); -// tdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return tdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") ==false) { -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "-1" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true ) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } -// -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// tdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// tdm.setStatus(status); -// -// tdm.setValid(true); -// -// return tdm; -// } -// -// /** -// * 将随机报警消息字节数组解析为消息对象AFN=81H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToWarningMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// WarningMessage wm = new WarningMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("随机报警消息时标解析异常"); -// logger.error("随机报警消息时标解析异常"); -// wm.setValid(false); -// } -// if (tp.getTimeInMillis() - wm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("随机报警消息时标超前"); // 超前半小时以上 -// logger.error("随机报警消息时标超前"); -// wm.setValid(false); -// } else if (tpDelay != 0 -// && (wm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("随机报警消息超时"); -// logger.error("随机报警消息超时"); -// wm.setValid(false); -// } else { -// wm.setTime(tp); -// wm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// wm.setAfn(gbFrame.FRAME_DATA_AFN); -// wm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置报警状态 -// String warn = ""; -// warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// wm.setWarn(warn); -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return wm; -// case GBConstants.CTRL_DIR1_MWL:// 水位超限 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 5] & 0x0F), data[i * 4 + 4], data[i * 4 + 3], data[i * 4 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 5] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)超限 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 6] & 0x7F), data[i * 5 + 5], data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 6] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质超限 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[6], data[5], data[4], data[3], data[2] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 7; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("") == false) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// default: -// if (data.length == 4) -// break; -// else { -// wm.setValid(false); -// return wm; -// } -// } -// -// String status = ""; -// status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// wm.setStatus(status); -// wm.setValid(true); -// } -// -// return wm; -// } -// -// /** -// * 将人工置数消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSettingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// SettingDataMessage sdm = new SettingDataMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("人工置数消息时标解析异常"); -// logger.error("人工置数消息时标解析异常"); -// sdm.setValid(false); -// } -// if (tp.getTimeInMillis() - sdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("人工置数消息时标超前"); // 超前半小时以上 -// logger.error("人工置数消息时标超前"); -// sdm.setValid(false); -// } else if (tpDelay != 0 && (sdm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("人工置数消息超时"); -// logger.error("人工置数消息超时"); -// sdm.setValid(false); -// } else { -// sdm.setTime(tp); -// sdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// sdm.setAfn(gbFrame.FRAME_DATA_AFN); -// sdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return sdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 5; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("")) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// sdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// sdm.setStatus(status); -// -// sdm.setValid(true); -// } -// -// return sdm; -// } -// -// /** -// * 将设置终端IC卡有效功能命令响应消息字节数组解析为消息对象AFN=30H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableICCardCommandResponse eicccr = new EnableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// eicccr.setSuccess(true); -// } else { -// eicccr.setSuccess(false); -// } -// -// eicccr.setValid(true); -// } else { -// eicccr.setValid(false); -// } -// -// return eicccr; -// } -// -// /** -// * 将设置终端IC卡功能无效命令响应消息字节数组解析为消息对象AFN=31H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableICCardCommandResponse dicccr = new DisableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dicccr.setSuccess(true); -// } else { -// dicccr.setSuccess(false); -// } -// -// dicccr.setValid(true); -// } else { -// dicccr.setValid(false); -// } -// -// return dicccr; -// } -// -// /** -// * 将设置终端定值控制投入功能命令响应消息字节数组解析为消息对象AFN=32H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableFixedValCommandResponse efvcr = new EnableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// efvcr.setSuccess(true); -// } else { -// efvcr.setSuccess(false); -// } -// -// efvcr.setValid(true); -// } else { -// efvcr.setValid(false); -// } -// -// return efvcr; -// } -// -// /** -// * 将设置终端定值控制退出功能命令响应消息字节数组解析为消息对象AFN=33H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableFixedValCommandResponse dfvcr = new DisableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dfvcr.setSuccess(true); -// } else { -// dfvcr.setSuccess(false); -// } -// -// dfvcr.setValid(true); -// } else { -// dfvcr.setValid(false); -// } -// -// return dfvcr; -// } -// -// /** -// * 将遥控开启水泵/闸门命令响应消息字节数组解析为消息对象AFN=92H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteOpenPumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteOpenPumpCommandResponse ropcr = new RemoteOpenPumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// ropcr.setSuccess(true); -// } else { -// ropcr.setSuccess(false); -// } -// -// ropcr.setValid(true); -// } else { -// ropcr.setValid(false); -// } -// -// return ropcr; -// } -// -// /** -// * 将遥控关闭水泵/闸门命令响应消息字节数组解析为消息对象AFN=93H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteClosePumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteClosePumpCommandResponse rcpcr = new RemoteClosePumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// rcpcr.setSuccess(true); -// } else { -// rcpcr.setSuccess(false); -// } -// -// rcpcr.setValid(true); -// } else { -// rcpcr.setValid(false); -// } -// -// return rcpcr; -// } -// -// /** -// * 将复位终端参数命令响应消息字节数组解析为消息对象AFN=90H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToResetParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ResetParamCommandResponse rpcr = new ResetParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// rpcr.setSuccess(true); -// } else { -// rpcr.setSuccess(false); -// } -// -// rpcr.setValid(true); -// } else { -// rpcr.setValid(false); -// } -// -// return rpcr; -// } -// -// /** -// * 将清空终端历史数据单元命令响应消息字节数组解析为消息对象AFN=91H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToClearHistoryCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ClearHistoryCommandResponse chcr = new ClearHistoryCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x01 || data[0] == 0x02) { -// chcr.setSuccess(true); -// } else { -// chcr.setSuccess(false); -// } -// -// chcr.setValid(true); -// } else { -// chcr.setValid(false); -// } -// -// return chcr; -// } -// -// /** -// * 将查询水泵电机实时工作数据命令响应消息字节数解析为消息对象AFN=5FH -// * -// * @param message -// * @return -// */ -// private AppMessage bytesToQueryRealTimeMotoValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeMotoValueCommandResponse qrtmv = new QueryRealTimeMotoValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 12) { -// // 解析并设置A相电压 -// int vaInt = ByteUtil.binToInt(new byte[] { data[1], data[0] }); -// if (vaInt < 1000) -// qrtmv.setVoltageA(String.valueOf(vaInt)); -// else -// qrtmv.setVoltageA("0"); -// -// // 解析并设置B相电压 -// int vbInt = ByteUtil.binToInt(new byte[] { data[3], data[2] }); -// if (vbInt < 1000) -// qrtmv.setVoltageB(String.valueOf(vbInt)); -// else -// qrtmv.setVoltageB("0"); -// -// // 解析并设置C相电压 -// int vcInt = ByteUtil.binToInt(new byte[] { data[5], data[4] }); -// if (vcInt < 1000) -// qrtmv.setVoltageC(String.valueOf(vcInt)); -// else -// qrtmv.setVoltageC("0"); -// -// // 解析并设置A相电流 -// int eaInt = ByteUtil.binToInt(new byte[] { data[7], data[6] }); -// if (eaInt < 1000) -// qrtmv.setEcurrentA(String.valueOf(eaInt)); -// else -// qrtmv.setEcurrentA("0"); -// -// // 解析并设置B相电流 -// int ebInt = ByteUtil.binToInt(new byte[] { data[9], data[8] }); -// if (ebInt < 1000) -// qrtmv.setEcurrentB(String.valueOf(ebInt)); -// else -// qrtmv.setEcurrentB("0"); -// -// // 解析并设置C相电流 -// int ecInt = ByteUtil.binToInt(new byte[] { data[11], data[10] }); -// if (ecInt < 1000) -// qrtmv.setEcurrentC(String.valueOf(ecInt)); -// else -// qrtmv.setEcurrentC("0"); -// -// qrtmv.setValid(true); -// } else { -// qrtmv.setValid(false); -// } -// return qrtmv; -// } -// -// /** -// * 将查询终端事件记录命令响应消息字节数组解析为消息对象AFN=5DH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryEventRecordsCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryEventRecordsCommandResponse qprcr = new QueryEventRecordsCommandResponse(Calendar.getInstance(), address); -// Map ercs = new HashMap(); -// -// int temp = 0; -// -// // 解析并设置数据域 -// if (data.length == 64) { -// // int num = 1; -// // erc19-32备用 -// for (int j = 0; j < 19; j++) { -// temp = ByteUtil.binToInt(new byte[] { data[j * 2 + 1], data[2 * j] }); -// ercs.put("erc" + Integer.toString(j + 1), Integer.valueOf(temp)); -// // System.out.println(j+"==="+temp+"=="); -// } -// -// qprcr.setErcs(ercs); -// qprcr.setValid(true); -// -// } else { -// qprcr.setValid(false); -// } -// return qprcr; -// } -// -// /** -// * 将查询内存自报数据命令响应消息字节数组解析为消息对象AFH=B2H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryMemeryValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryMemeryValueCommandResponse qmvcr = new QueryMemeryValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// qmvcr.setValid(true); -// } else { -// qmvcr.setValid(false); -// } -// return qmvcr; -// } -// -// /** -// * 将查询终端固态存储数据命令响应消息字节数组解析为消息对象AFH=B1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryHDValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryHDValueCommandResponse qhdvcr = new QueryHDValueCommandResponse(Calendar.getInstance(), address); -// Map qhdm = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length > 9) { -// // 解析并设置参数及起止时间数据 -// String starttime = ByteUtil.bcdToString(new byte[] { data[4], data[3], data[2], data[1] }); -// String endtime = ByteUtil.bcdToString(new byte[] { data[8], data[7], data[6], data[5] }); -// if (starttime.equals("") == true || endtime.equals("") == true) { -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// Calendar start = Calendar.getInstance(); -// Calendar end = Calendar.getInstance(); -// start.set(2000 + Integer.parseInt(starttime.substring(0, 2)), -// Integer.parseInt(starttime.substring(2, 4)) - 1, -// Integer.parseInt(starttime.substring(4, 6)), -// Integer.parseInt(starttime.substring(6, 8)), 0, 0); -// end.set(2000 + Integer.parseInt(endtime.substring(0, 2)), -// Integer.parseInt(endtime.substring(2, 4)) - 1, -// Integer.parseInt(endtime.substring(4, 6)), -// Integer.parseInt(endtime.substring(6, 8)), 0, 0); -// long hour = (end.getTimeInMillis() - start.getTimeInMillis()) / (1000 * 3600); -// -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// qhdvcr.setType(type); -// qhdvcr.setNo(no); -// -// switch (type) { -// case 0: //雨量参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format((Integer.parseInt(realtime) / 10.0), "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 1: //水位参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 3] & 0x0F), data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 3] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 2: //水量参数 -// { -// int interval = (data.length - 9) / 5; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 5) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 4] & 0x7F), data[i + 3], data[i + 2], data[i + 1], data[i]}); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// // 判断剩余水量正负符号 -// Long realtimelong = Long.valueOf(0); -// if ((data[i + 4] & 0x80) == 0x80) -// realtimelong = Long.valueOf(Long.parseLong(realtime) * -1); -// else -// realtimelong = Long.valueOf(realtime); -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(realtimelong)); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 3: //流速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 2] & 0x0F), data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 2] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 4: //闸位参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 5: //功率参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 6: //气压参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 7: //风速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 8: //水温参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 10: //土壤含水率参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 11: //水压参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] { data[i + 3], data[i + 2 ], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// default://其它参数未实现 -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// qhdvcr.setValid(true); -// -// } else { -// qhdvcr.setValid(false); -// } -// return qhdvcr; -// } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //获取传感器数量 + + int offset = cmd.getOffset(); //获取湿度变量的内存地址偏移量 + offset = offset + wsct * 2 * 2 * 2; + + // 解析并存储温度值 + for (int i = 0; i < wsct; i++) { + byte[] tempValueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; + byte[] tempThresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; + + float tempValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempValueByte), 16)); //温度监测值 + float tempThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempThresholdByte), 16)); //温度报警阈值 + + rwvcr.getWd().add(tempValue); + rwvcr.getWdbjz().add(tempThreshold); + } + + // 解析并存储湿度值 + for (int i = 0; i < wsct; i++) { + byte[] humValueByte = new byte[] { data[i*8 + 2 + offset], data[i*8 + 3 + offset], data[i*8 + offset], data[i*8 + 1 + offset] }; + byte[] humThresholdByte = new byte[] { data[i*8 + 6 + offset], data[i*8 + 7 + offset], data[i*8 + 4 + offset], data[i*8 + 5 + offset] }; + + float humValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humValueByte), 16)); //湿度监测值 + float humThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humThresholdByte), 16)); //湿度报警阈值 + + rwvcr.getSd().add(humValue); + rwvcr.getSdbjz().add(humThreshold); + } + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //温湿度监测点的数量 + + // 处理温度状态 + String tempDataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 1); + char bjBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 2); + + rwsscr.getWdbj().add(bjBit == '1' ? true : false); + rwsscr.getWdldbj().add(ldBit == '1' ? true : false); + } + + // 处理湿度状态 + String humDataStr = ByteUtil.binToBinString(new byte[] { data[4], data[5] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = humDataStr.charAt(humDataStr.length() - 2 * i - 1); + char bjBit = humDataStr.charAt(humDataStr.length() - 2 * i - 2); + + rwsscr.getSdbj().add(bjBit == '1' ? true : false); + rwsscr.getSdldbj().add(ldBit == '1' ? true : false); + } + } + + return rwsscr; + } + /** * 将消息对象解析为字节数组 @@ -3507,18 +512,25 @@ frame = LinkCommandToBytes((LinkCommand) message); } - // 读取甲烷参数内存命令 - if (message instanceof ReadCH4ParamCommand) { - frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); - } else if (message instanceof ReadCH4StatusCommand) { - frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); - } - -// // 读内存命令 -// if (message instanceof FreeMessageResponse) { -// frame = freeMessageResponseToBytes((FreeMessageResponse) message); +// // 读取甲烷参数内存命令 +// if (message instanceof ReadCH4ValueCommand) { +// frame = ReadCH4ValueCommandToBytes((ReadCH4ValueCommand) message); +// } else if (message instanceof ReadCH4StatusCommand) { +// frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); // } // +// // 读取温湿度命令 +// else if (message instanceof ReadWSValueCommand) { +// frame = ReadWSValueCommandToBytes((ReadWSValueCommand) message); +// } else if (message instanceof ReadWSStatusCommand) { +// frame = ReadWSStatusCommandToBytes((ReadWSStatusCommand) message); +// } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } +// // // 写内存命令 // if (message instanceof QueryRealTimeValueCommand) { // frame = queryRealTimeValueCommandToBytes((QueryRealTimeValueCommand) message); @@ -3527,6 +539,8 @@ return frame; } + + /** * 将握手命令转换为字节数组 * @@ -3540,28 +554,12 @@ } /** - * 将读取甲烷监测值命令转换为字节数组 - * @param read - * @return - */ - private byte[] ReadCH4ParamCommandToBytes(ReadCH4ParamCommand read) { - byte[] start = ByteUtil.hexStringToBytes(read.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(read.getDestinationId(), - read.getMessageProducerId(), - read.getMemoryArea(), - start, - read.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将读取甲烷报警状态命令转换为字节数组 + * 将读取PLC内存命令转换为字节数组 + * * @param message * @return */ - private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), @@ -3569,1221 +567,78 @@ message.getMemoryArea(), start, message.getCountWord()); - + return finsFrame.toBytes(); } + /** + * 将读取甲烷监测值命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4ValueCommandToBytes(ReadCH4ValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } -// /** -// * 将退出登录命令对象转换为字节数组AFN=02H -// * -// * @param hmr -// * @return -// */ -// private byte[] logoutCommandToBytes(LogoutCommand lc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, lc.getDestinationId(), -// GBConstants.DATA_AFN_LOGIN, new byte[] { (byte) 0xF1 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置地址命令对象转换为字节数组AFN=10H -// * -// * @param message -// * @return -// */ -// private byte[] setAddressCommandToBytes(SetAddressCommand sac) { -// String address = sac.getNewAddress(); -// -// // 解析设置的新地址内容 -// byte[] add1 = ByteUtil.bcdStringToBytes(address.substring(0, 6)); -// byte[] add2 = ByteUtil.hexStringToBytes(address.substring(7, 10)); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(add1).append(add2[1]).append(add2[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sac.getDestinationId(), -// GBConstants.DATA_AFN_SETADDRESS, data.toBytes(), pw, -// sac.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询地址命令对象转换为字节数组AFN=50H -// * -// * @param message -// * @return -// */ -// private byte[] queryAddressCommandToBytes(QueryAddressCommand qac) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qac.getDestinationId(), -// GBConstants.DATA_AFN_QUERYADDRESS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置时钟命令对象转换为字节数组AFN=11H -// * -// * @param scc -// * @return -// */ -// private byte[] setClockCommandToBytes(SetClockCommand scc) { -// Calendar clock = scc.getClock(); -// -// // 解析设置的新时钟内容 -// int week = clock.get(Calendar.DAY_OF_WEEK); -// switch (week) { -// case Calendar.MONDAY: -// case Calendar.TUESDAY: -// case Calendar.WEDNESDAY: -// case Calendar.THURSDAY: -// case Calendar.FRIDAY: -// case Calendar.SATURDAY: -// week = week - 1; -// break; -// case Calendar.SUNDAY: -// week = week - 1 + 7; -// break; -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcd(clock.get(Calendar.SECOND))); // 秒 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append((byte) (ByteUtil.intToBcd(clock.get(Calendar.MONTH) + 1) | (ByteUtil -// .intToBcd(week) << 5))); // 月 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.YEAR) - 2000)); // 年 -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCLOCK, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询时钟命令对象转换为字节数组AFN=51H -// * -// * @param message -// * @return -// */ -// private byte[] queryClockCommandToBytes(QueryClockCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCLOCK); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置工作模式命令对象转换为字节数组AFN=12H -// * -// * @param message -// * @return -// */ -// private byte[] setPatternCommandToBytes(SetPatternCommand spc) { -// String newPattern = spc.getPattern(); -// if (newPattern.length() > 2) { -// newPattern = newPattern.substring(0, 2); -// } -// -// // 解析设置的新工作模式内容 -// byte[] pattern = ByteUtil.hexStringToBytes(newPattern); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(pattern); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETWORKPATTERN, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询工作模式命令对象转换为字节数组AFN=52H -// * -// * @param message -// * @return -// */ -// private byte[] queryPatternCommandToBytes(QueryPatternCommand qpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWORKPATTERN); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置自报种类及时间间隔命令对象转换为字节数组AFN=A1H -// * -// * @param message -// * @return -// */ -// private byte[] setIntervalCommandToBytes(SetIntervalCommand sic) { -// Map newIntervals = sic.getIntervals(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// Bytes di = new Bytes(); // 每种参数自报的时间间隔 -// for (int i = 0; i < SetIntervalCommand.index.length; i++) { -// String key = SetIntervalCommand.index[i]; -// if (newIntervals.containsKey(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// int val = ((Integer) newIntervals.get(key)).intValue(); -// int low = val % 100; -// int high = val / 100; -// di.append(ByteUtil.intToBcd(low)).append(ByteUtil.intToBcd(high)); -// } else { -// di.append(new byte[] { 0x00, 0x00 }); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]).append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sic.getDestinationId(), -// GBConstants.DATA_AFN_SETINTERVAL, data.toBytes(), pw, -// sic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询自报种类及时间间隔命令对象转换为字节数组AFN=53H -// * -// * @param message -// * @return -// */ -// private byte[] queryIntervalCommandToBytes(QueryIntervalCommand qic) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qic.getDestinationId(), -// GBConstants.DATA_AFN_QUERYINTERVAL); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端需查询的实时数据种类命令对象转换为字节数组AFN=A0H -// * -// * @param message -// * @return -// */ -// private byte[] setRttypesCommandToBytes(SetRttypesCommand src) { -// Set newRttypes = src.getRttypes(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// for (int i = 0; i < SetRttypesCommand.index.length; i++) { -// String key = SetRttypesCommand.index[i]; -// if (newRttypes.contains(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, src.getDestinationId(), -// GBConstants.DATA_AFN_SETRTTYPES, data.toBytes(), pw, -// src.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端需查询的实时数据种类命令对象转换为字节数组AFN=54H -// * -// * @param message -// * @return -// */ -// private byte[] queryRttypesCommandToBytes(QueryRttypesCommand qrc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYRTTYPES); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端充值量命令对象转换为字节数组AFN=15H -// * -// * @param message -// * @return -// */ -// private byte[] setChargingCommandToBytes(SetChargingCommand scc) { -// String charging = scc.getNewCharging(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(charging), 4)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCHARGING, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端充值量命令对象转换为字节数组AFN=55H -// * -// * @param message -// * @return -// */ -// private byte[] queryChargingCommandToBytes(QueryChargingCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCHARGING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端剩余水量报警值命令对象转换为字节数组AFN=16H -// * -// * @param message -// * @return -// */ -// private byte[] setWarningCommandToBytes(SetWarningCommand swc) { -// String warning = swc.getNewWarning(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(warning), 3)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swc.getDestinationId(), -// GBConstants.DATA_AFN_SETWARNING, data.toBytes(), pw, -// swc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端剩余水量报警值命令对象转换为字节数组AFN=56H -// * -// * @param message -// * @return -// */ -// private byte[] queryWarningCommandToBytes(QueryWarningCommand qwc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWARNING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水位参数命令对象转换为字节数组AFN=17H -// * -// * @param message -// * @return -// */ -// private byte[] setWlParamCommandToBytes(SetWlParamCommand swpc) { -// List> wlParams = swpc.getWlParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wlParams.size(); i++) { -// List wlp = (List) wlParams.get(i); -// -// int benchmark = (int) (((Double) wlp.get(0)).doubleValue() * 100); -// int upper = (int) (((Double) wlp.get(1)).doubleValue() * 100); -// int lower = (int) (((Double) wlp.get(2)).doubleValue() * 100); -// -// byte[] bb = ByteUtil.intToBcdsHL(Math.abs(benchmark), 3); -// if (benchmark < 0) { -// bb[2] = (byte) (bb[2] + 0x80); -// } -// byte[] ub = ByteUtil.intToBcdsHL(upper, 2); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 2); -// data.append(bb).append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERLEVELPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水位参数命令对象转换为字节数组AFN=57H -// * -// * @param message -// * @return -// */ -// private byte[] queryWlParamCommandToBytes(QueryWlParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERLEVELPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水压参数命令对象转换为字节数组AFN=18H -// * -// * @param message -// * @return -// */ -// private byte[] setWpParamCommandToBytes(SetWpParamCommand swpc) { -// List> wpParams = swpc.getWpParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wpParams.size(); i++) { -// List wpp = (List) wpParams.get(i); -// -// int upper = (int) (((Double) wpp.get(0)).doubleValue() * 100); -// int lower = (int) (((Double) wpp.get(1)).doubleValue() * 100); -// -// byte[] ub = ByteUtil.intToBcdsHL(upper, 4); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 4); -// data.append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERPRESSUREPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水压参数命令对象转换为字节数组AFN=58H -// * -// * @param message -// * @return -// */ -// private byte[] queryWpParamCommandToBytes(QueryWpParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERPRESSUREPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数上限命令对象转换为字节数组AFN=19H -// * -// * @param message -// * @return -// */ -// private byte[] setWqUpperParamCommandToBytes(SetWqUpperParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqUpperParamCommand.index.length; i++) { -// String key = SetWqUpperParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqUpperParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYUPPERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数下限命令对象转换为字节数组AFN=1AH -// * -// * @param message -// * @return -// */ -// private byte[] setWqLowerParamCommandToBytes(SetWqLowerParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqLowerParamCommand.index.length; i++) { -// String key = SetWqLowerParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqLowerParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYLOWERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数上限命令对象转换为字节数组AFN=59H -// * -// * @param message -// * @return -// */ -// private byte[] queryWqUpperParamCommandToBytes(QueryWqUpperParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数下限命令对象转换为字节数组AFN=5AH -// * -// * @param message -// * @return -// */ -// private byte[] queryWqLowerParamCommandToBytes(QueryWqLowerParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYLOWERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端流量参数命令对象转换为字节数组AFN=1FH -// * -// * @param message -// * @return -// */ -// private byte[] setWfParamCommandToBytes(SetWfParamCommand swpc) { -// List newUppers = swpc.getNewUppers(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < newUppers.size(); i++) { -// double value = ((Double) newUppers.get(i)).doubleValue(); -// int upper = (int) (Math.abs(value) * 1000); -// byte[] ub = ByteUtil.intToBcdsHL(upper, 5); -// if (value < 0) { -// ub[4] = (byte) (ub[4] + 0xF0); -// } -// data.append(ub); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERFLOWUPPERPARAM, data.toBytes(), -// pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端流量参数命令对象转换为字节数组AFN=64H -// * -// * @param message -// * @return -// */ -// private byte[] queryWfParamCommandToBytes(QueryWfParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERFLOWUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时值命令对象转换为字节数组AFN=B0H -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeValueCommandToBytes(QueryRealTimeValueCommand qrtvc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// qrtvc.getRttype(), qrtvc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMEVALUE); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水量表底值命令对象转换为字节数组AFN=1BH -// * -// * @param message -// * @return -// */ -// private byte[] setFlowInitCommandToBytes(SetFlowInitCommand sfic) { -// List inits = sfic.getNewInits(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < inits.size(); i++) { -// long init = ((Long) inits.get(i)).longValue(); -// byte[] ib = ByteUtil.intToBcdsHL(init, 5); -// data.append(ib); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfic.getDestinationId(), -// GBConstants.DATA_AFN_SETFLOWINIT, data.toBytes(), pw, -// sfic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔命令对象转换为字节数组AFN=20H -// * -// * @param message -// * @return -// */ -// private byte[] setThresholdCommandToBytes(SetThresholdCommand stc) { -// int type = stc.getType(); -// int no = stc.getNo(); -// int inter = stc.getInter(); -// double thresh = stc.getThresh(); + /** + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); // -// String noHex = ByteUtil.binToHexString(ByteUtil.intToBins(no, 1)); -// noHex = noHex.substring(noHex.length() - 1); -// String typeHex = ByteUtil.binToHexString(ByteUtil.intToBins(type, 1)); -// typeHex = typeHex.substring(typeHex.length() - 1); +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); // -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.hexStringToBytes(typeHex + noHex)); -// data.append(ByteUtil.intToBins(inter, 1)); -// byte[] threshBytes = null; -// -// // 控制域FN -// int control_fn = 0; -// -// // 判断设置检测参数的类型 -// switch (type) { -// case 0: //雨量参数 -// data.append(ByteUtil.intToBcd((int) (thresh * 10))); -// control_fn = 1; -// break; -// -// case 1: //水位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 4); -// if (thresh < 0) { -// threshBytes[3] = (byte) (threshBytes[3] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 2; -// break; -// -// case 2: //水量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh)), 5); -// if (thresh < 0) { -// threshBytes[4] = (byte) (threshBytes[4] | 0x80); -// } -// data.append(threshBytes); -// -// control_fn = 3; -// break; -// -// case 3: //流速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 3); -// if (thresh < 0) { -// threshBytes[2] = (byte) (threshBytes[2] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 4; -// break; -// -// case 4: //闸位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 5; -// break; -// -// case 5: //功率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 6; -// break; -// -// case 6: //气压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 7; -// break; -// -// case 7: //风速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 8; -// break; -// -// case 8: //水温参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 9; -// break; -// -// case 10: //土壤含水率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 11; -// break; -// -// case 11: //蒸发量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 3); -// data.append(threshBytes); -// -// control_fn = 12; -// break; -// -// case 12: //水压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 4); -// data.append(threshBytes); -// -// control_fn = 15; -// break; -// -// default: -// thresh = 0.0; -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, stc.getDestinationId(), -// GBConstants.DATA_AFN_SETTHRESHOLD, data.toBytes(), pw, -// stc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端定值量命令对象转换为字节数组AFN=34H -// * -// * @param message -// * @return -// */ -// private byte[] setFixedValueCommandToBytes(SetFixedValueCommand sfvc) { -// long fixedvalue = sfvc.getNewFixedValue(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] fb = ByteUtil.intToBcdsHL(fixedvalue, 5); -// data.append(fb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfvc.getDestinationId(), -// GBConstants.DATA_AFN_SETFIXEDVALUE, data.toBytes(), pw, -// sfvc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将修改终端密码命令对象转换为字节数组AFN=96H -// * -// * @param message -// * @return -// */ -// private byte[] setPasswordCommandToBytes(SetPasswordCommand spc) { -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] pb = ByteUtil.intToBcdsHL(spc.getNewPassword(), 2); -// data.append(pb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETPASSWORD, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时状态命令对象转换为字节数组AFN=5EH -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeStatusCommandToBytes(QueryRealTimeStatusCommand qrtsc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_QSS, qrtsc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMESTATUS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将自报响应消息转换为字节数组 自报消息通用响应 -// * -// * @param message -// * @return -// */ -// private byte[] freeMessageResponseToBytes(FreeMessageResponse fmr) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, fmr.getFcb(), -// fmr.getType(), fmr.getDestinationId(), -// fmr.getAfn(), new byte[] { 0x00 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能有效命令转换为字节数组AFN=30H -// * -// * @param message -// * @return -// */ -// private byte[] enableICCardCommandToBytes(EnableICCardCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEICCARD, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能无效命令转换为字节数组AFN=31H -// * -// * @param message -// * @return -// */ -// private byte[] disableICCardCommandToBytes(DisableICCardCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEICCARD, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制投入功能命令转换为字节数组AFN=32H -// * -// * @param message -// * @return -// */ -// private byte[] enableFixedValCommandToBytes(EnableFixedValCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEFIXEDVAL, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制退出功能命令转换为字节数组AFN=33H -// * -// * @param message -// * @return -// */ -// private byte[] disableFixedValCommandToBytes(DisableFixedValCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEFIXEDVAL, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控开启水泵/闸门命令转换为字节数组AFN=92H -// * -// * @param message -// * @return -// */ -// private byte[] remoteOpenPumpCommandToBytes(RemoteOpenPumpCommand ropc) { -// byte[] data = ByteUtil.hexStringToBytes(ropc.getPump() + ropc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, ropc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTEOPENPUMP, data, pw, ropc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控关闭水泵/闸门命令转换为字节数组AFN=93H -// * -// * @param message -// * @return -// */ -// private byte[] remoteClosePumpCommandToBytes(RemoteClosePumpCommand rcpc) { -// byte[] data = ByteUtil.hexStringToBytes(rcpc.getPump() + rcpc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rcpc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTECLOSEPUMP, data, pw, rcpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将复位终端参数命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] resetParamCommandToBytes(ResetParamCommand rpc) { -// byte[] data = ByteUtil.hexStringToBytes(rpc.getReset(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rpc.getDestinationId(), -// GBConstants.DATA_AFN_RESETPARAM, data, pw, rpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将清空历史数据单元命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] clearHistoryCommandToBytes(ClearHistoryCommand chc) { -// byte[] data = ByteUtil.hexStringToBytes(chc.getClear(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, chc.getDestinationId(), -// GBConstants.DATA_AFN_CLEARHISTORY, data, pw, chc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询水泵电机实时工作数据的命令转换为字节数组AFN=5FH -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryRealTimeMotoValueCommandToBytes( -// QueryRealTimeMotoValueCommand qrtmv) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrtmv.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEMOTOSS); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端事件记录的命令转换为字节数组5DH -// * -// * @param message -// * @return -// */ -// private byte[] queryEventRecordsCommandToBytes(QueryEventRecordsCommand qerc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEVENTREC); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询内存自报数据的命令转换为字节数组B2H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryMemeryValueCommandToBytes(QueryMemeryValueCommand qerc) { -// Calendar bclock = qerc.getBdate(); -// Calendar eclock = qerc.getEdate(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYMEMERYVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询固态存储数据的命令转换为字节数组B1H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryHDValueCommandToBytes(QueryHDValueCommand qhdc) { -// int type = qhdc.getType(); -// int no = qhdc.getNo(); -// Calendar sclock = qhdc.getSclock(); -// Calendar eclock = qhdc.getEclock(); -// -// int i = type * 16 + no; -// -// int control_fn = GBConstants.CTRL_DIR0_QACC; -// if (type == 0) //查询雨量参数 -// control_fn = GBConstants.CTRL_DIR0_QRF; -// else if (type == 1) //查询水位参数 -// control_fn = GBConstants.CTRL_DIR0_QWL; -// else if (type == 2) //查询水量参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 3) //查询流速参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 4) //查询闸位参数 -// control_fn = GBConstants.CTRL_DIR0_QBC; -// else if (type == 5) //查询功率参数 -// control_fn = GBConstants.CTRL_DIR0_QPW; -// else if (type == 6) //查询气压参数 -// control_fn = GBConstants.CTRL_DIR0_QAP; -// else if (type == 7) //查询风速参数 -// control_fn = GBConstants.CTRL_DIR0_QWS; -// else if (type == 8) //查询水温参数 -// control_fn = GBConstants.CTRL_DIR0_QWT; -// else if (type == 9) //查询水质参数 -// control_fn = GBConstants.CTRL_DIR0_QWQ; -// else if (type == 10) //查询土壤含水率参数 -// control_fn = GBConstants.CTRL_DIR0_QSA; -// else if (type == 11) //查询水压参数 -// control_fn = GBConstants.CTRL_DIR0_QHP; -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBins(i, 1)); -// -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.YEAR))); // 年 -// -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.YEAR))); // 年 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, qhdc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYHARDDISCVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// -// /** -// * 从重叠消息中提取规范消息 -// */ -// public List extractByteMessage(byte[] byteMessage) { -// List bytesList = new ArrayList(); -// -// try { -// int i = 0; -// while (i < byteMessage.length) { -// if ((byteMessage[i] == GBByteFrame.FRAME_HEAD) && (byteMessage[i + 2] == GBByteFrame.FRAME_HEAD)) { -// int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 1]}); -// if (i + length + 5 <= byteMessage.length && byteMessage[i + length + 4] == GBByteFrame.FRAME_END) { -// Bytes bytes = new Bytes(); -// bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]); -// for (int j = 0; j < length + 2; j++) { -// bytes.append(byteMessage[i + 3 + j]); -// } -// -// i = i + length + 5; -// bytesList.add(bytes.toBytes()); -// } else { -// i++; -// } -// } else { -// i++; -// } -// } -// } catch (Exception e) { -// bytesList.clear(); -// bytesList.add(byteMessage); -// return bytesList; -// } -// -// return bytesList; +// return finsFrame.toBytes(); // } + /** + * 将读取温湿度监测值命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSValueCommandToBytes(ReadWSValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + + /** + * 将读取温湿度报警状态命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSStatusCommandToBytes(ReadWSStatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + } diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java deleted file mode 100644 index 3570a07..0000000 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.szpg.task; - -import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; -import com.szpg.db.data.PgAcuRdcmd; -import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; - -public class ReadCH4ParamTask implements Runnable { - - private ACUClient client; - private AppCommand appCommand; - - public ReadCH4ParamTask(ACUClient client, AppCommand command) { - this.client = client; - this.appCommand = command; - } - - @Override - public void run() { - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(appCommand); - - // 发送读取甲烷参数内存命令 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - ReadCH4ParamCommand ch4Cmd = (ReadCH4ParamCommand) appCommand; - - // 发送完成之后将命令保存在数据库中 - PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(ch4Cmd.getCommandType()); - cmd.setDest(ch4Cmd.getDestinationId()); - cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); - cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); - cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCountWord()); - cmd.setCount_bit(ch4Cmd.getCountBit()); - - new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); - } - -} diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 196d7e3..11b33b4 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -41,6 +41,7 @@ cmd.setStart_mem_bit(ch4AlmCmd.getStartAddress().substring(4)); cmd.setCount_word(ch4AlmCmd.getCountWord()); cmd.setCount_bit(ch4AlmCmd.getCountBit()); + cmd.setCount_sensor(ch4AlmCmd.getCountSensor()); new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 12d1c18..736bc18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -13,11 +13,12 @@ import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.message.command.read.ReadCH4StatusCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -123,17 +124,25 @@ // 3根据参数类型调用相应的方法进行解析 switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - received = bytesToReadCH4ParamCommand(finsFrame); + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, readCmd); break; case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + received = bytesToReadCH4StatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, readCmd); break; } - // 4将有效的命令的是否有响应字段置1 - readCmdDao.updateCmdRecordResponsed(readCmd.getId()); + // 4将已响应的命令删除 + readCmdDao.deleteCmdRecord(readCmd.getId()); } } else if (commandCode.equalsIgnoreCase("0102")) { @@ -320,6 +329,7 @@ } + /** * 将握手响应字节数组转换为消息对象 * @@ -352,15 +362,15 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4ParamCommand(FINSByteFrame finsFrame) { - ReadCH4ParamCommandResponse rcpcr = new ReadCH4ParamCommandResponse(); + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadCH4ValueCommandResponse rcpcr = new ReadCH4ValueCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; rcpcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = data.length / (2 * 2 * 2); //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占2个字,每个字占2个字节 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 for (int i = 0; i < chct; i++) { byte[] valueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; byte[] thresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; @@ -383,7 +393,7 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; @@ -391,7 +401,7 @@ if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); @@ -401,3097 +411,92 @@ rcscr.getJwldbj().add(ldBit == '1' ? true : false); } } - + return rcscr; } -// -// /** -// * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryAddressResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryAddressCommandResponse qacr = new QueryAddressCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String addressRes = ByteUtil.bcdToString(new byte[] { data[0], data[1], data[2] }) + -// ByteUtil.binToHexString(new byte[] { data[4], data[3] }); -// if (addressRes.length() == 10) { -// qacr.setValid(true); -// qacr.setAddress(addressRes); -// } else { -// logger.error("查询终端地址响应消息解析错误"); -// qacr.setValid(false); -// } -// } else { -// logger.error("查询终端地址响应消息长度错误"); -// qacr.setValid(false); -// } -// -// return qacr; -// } -// -// /** -// * 将设置终端时钟响应消息字节数组解析为消息对象AFN=11H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetClockCommandResponse sccr = new SetClockCommandResponse(Calendar.getInstance(), address); -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// try { -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// sccr.setValid(false); -// return sccr; -// } catch (Exception re) { -// logger.error("时间字段解析异常"); -// sccr.setValid(false); -// return sccr; -// } -// -// sccr.setNewClock(clock); -// -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端时钟响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端时钟响应消息字节数组解析为消息对象AFN=51H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryClockCommandResponse qccr = new QueryClockCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// try { -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// qccr.setValid(false); -// return qccr; -// } -// -// qccr.setClock(clock); -// qccr.setValid(true); -// } else { -// logger.error("查询终端时钟响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端工作模式响应消息字节数组解析为消息对象AFN=12H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPatternCommandResponse spcr = new SetPatternCommandResponse(Calendar.getInstance(), address); -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setWorkPattern(patternRes); -// } else { -// logger.error("设置终端工作模式响应消息长度错误"); -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端工作模式响应消息字节数组解析为消息对象AFN=52H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryPatternCommandResponse qpcr = new QueryPatternCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// qpcr.setValid(true); -// qpcr.setWorkPattern(patternRes); -// } else { -// logger.error("查询终端工作模式响应消息长度错误"); -// qpcr.setValid(false); -// } -// -// return qpcr; -// } -// -// /** -// * 将设置终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=A1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetIntervalCommandResponse sicr = new SetIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// sicr.setValid(true); -// sicr.setIntervals(intervals); -// -// sicr.setValid(true); -// sicr.setSuccess(true); -// } else { -// logger.error("设置终端自报种类及时间间隔响应消息长度错误"); -// sicr.setValid(false); -// } -// -// return sicr; -// } -// -// /** -// * 将查询终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=53H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryIntervalCommandResponse qicr = new QueryIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// qicr.setValid(true); -// qicr.setIntervals(intervals); -// } else { -// logger.error("查询终端自报种类及时间间隔响应消息长度错误"); -// qicr.setValid(false); -// } -// -// return qicr; -// } -// -// /** -// * 将设置终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=A0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetRttypesCommandResponse srcr = new SetRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// srcr.setRttypes(rttypes); -// -// srcr.setValid(true); -// srcr.setSuccess(true); -// } else { -// logger.error("设置终端需查询的实时数据种类响应消息长度错误"); -// srcr.setValid(false); -// } -// -// return srcr; -// } -// -// /** -// * 将查询终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=54H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRttypesCommandResponse qrcr = new QueryRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// -// qrcr.setValid(true); -// qrcr.setRttypes(rttypes); -// } else { -// logger.error("查询终端需查询的实时数据种类响应消息长度错误"); -// qrcr.setValid(false); -// } -// -// return qrcr; -// } -// -// /** -// * 将设置终端充值量响应消息字节数组解析为消息对象AFN=15H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetChargingCommandResponse sccr = new SetChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// -// sccr.setCharging(Integer.parseInt(charging)); -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端充值量响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端充值量和剩余水量响应消息字节数组解析为消息对象AFN=55H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryChargingCommandResponse qccr = new QueryChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 9) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[8] & 0x7F), data[7], data[6], data[5], data[4] }); -// -// if (charging.equals("") == false && current.equals("") == false) { -// qccr.setValid(true); -// qccr.setCharging(Integer.parseInt(charging)); -// // 判断剩余水量正负符号 -// if ((data[8] & 0x80) == 0x80) { -// qccr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qccr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息解析错误"); -// qccr.setValid(false); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端剩余水量报警值响应消息字节数组解析为消息对象AFN=16H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWarningCommandResponse swcr = new SetWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 3) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (warning.equals("") == false) { -// swcr.setNewWarning(Integer.parseInt(warning)); -// } -// -// swcr.setValid(true); -// swcr.setSuccess(true); -// } else { -// logger.error("设置终端剩余水量报警值响应消息长度错误"); -// swcr.setValid(false); -// } -// -// return swcr; -// } -// -// /** -// * 将查询终端剩余水量报警值响应消息字节数组解析为消息对象AFN=56H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWarningCommandResponse qwcr = new QueryWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[7] & 0x7F), data[6], data[5], data[4], data[3] }); -// -// if (warning.equals("") == false && current.equals("") == false) { -// qwcr.setValid(true); -// qwcr.setWarning(Integer.parseInt(warning)); -// // 判断剩余水量正负符号 -// if ((data[7] & 0x80) == 0x80) { -// qwcr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qwcr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息解析错误"); -// qwcr.setValid(false); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息长度错误"); -// qwcr.setValid(false); -// } -// -// return qwcr; -// } -// -// /** -// * 将设置终端水位参数响应消息字节数组解析为消息对象AFN=17H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWlParamCommandResponse swpcr = new SetWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 7 == 0) { -// int n = data.length / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// swpcr.setWlParams(wlParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水位参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水位参数响应消息字节数组解析为消息对象AFN=57H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWlParamCommandResponse qwpcr = new QueryWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 9 && data.length % 7 == 2) { -// int n = (data.length - 2) / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWlParams(wlParams); -// qwpcr.setValid(true); -// -// } else { -// logger.error("查询水位参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=18H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWpParamCommandResponse swpcr = new SetWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 8 && data.length % 8 == 0) { -// int n = data.length / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// swpcr.setWpParams(wpParams); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水压参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数响应消息字节数组解析为消息对象AFN=58H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWpParamCommandResponse qwpcr = new QueryWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 10 && data.length % 8 == 2) { -// int n = (data.length - 2) / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWpParams(wpParams); -// qwpcr.setValid(true); -// } else { -// logger.error("查询水压参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=19H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqUpperParamCommandResponse swpcr = new SetWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=1AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqLowerParamCommandResponse swpcr = new SetWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数上限响应消息字节数组解析为消息对象AFN=59H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqUpperParamCommandResponse qwpcr = new QueryWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将查询终端水压参数下限响应消息字节数组解析为消息对象AFN=5AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqLowerParamCommandResponse qwpcr = new QueryWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端流量参数响应消息字节数组解析为消息对象AFN=1FH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWfParamCommandResponse swpcr = new SetWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// swpcr.setNewUppers(uppers); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端流量参数响应消息字节数组解析为消息对象AFN=64H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWfParamCommandResponse qwpcr = new QueryWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 5 == 2) { -// int n = (data.length - 2) / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setUppers(uppers); -// qwpcr.setValid(true); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水量表底值响应消息字节数组解析为消息对象AFN=1BH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFlowInitCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFlowInitCommandResponse sficr = new SetFlowInitCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5; //监测点个数 -// List inits = new ArrayList(n); -// -// // 解析多个监测点的值 -// for (int i = 0; i < n; i++) { -// String init = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4]), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// -// inits.add(Long.valueOf(init)); -// } -// sficr.setNewInits(inits); -// -// sficr.setValid(true); -// sficr.setSuccess(true); -// } else { -// sficr.setValid(false); -// } -// -// return sficr; -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔响应消息字节数组解析为消息对象AFN=20H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetThresholdCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetThresholdCommandResponse stcr = new SetThresholdCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 3) { -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// int inter = data[1]; -// double thresh = 0.0; -// -// stcr.setType(type); -// stcr.setNo(no); -// stcr.setInter(inter); -// -// switch (type) { -// case 0: //雨量参数 -// stcr.setThresh(ByteUtil.bcdToInt(data[2])/10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 1: //水位参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[5] & 0x0F), data[4], data[3], data[2]}); -// if ((data[5] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 2: //水量参数 -// if (data.length == 7) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[6] & 0x7F), data[5], data[4], data[3], data[2]}); -// if ((data[6] & 0x80) == 0x80) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 3: //流速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[4] & 0x0F), data[3], data[2]}); -// if ((data[4] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 4: //闸位参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 5: //功率参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 6: //气压参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 7: //风速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 8: //水温参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 10: //土壤含水率参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 11: //蒸发量参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 12: //水压参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[5], data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// default: -// stcr.setThresh(0.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// } -// } else { -// stcr.setValid(false); -// } -// -// return stcr; -// } -// -// /** -// * 将设置终端定值量响应消息字节数组解析为消息对象AFN=34H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFixedValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFixedValueCommandResponse sfvcr = new SetFixedValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String fixed = ByteUtil.bcdToString(new byte[] {(byte) (data[4]), data[3], data[2], data[1], data[0]}); -// -// sfvcr.setFixedValue(Long.parseLong(fixed)); -// -// sfvcr.setValid(true); -// sfvcr.setSuccess(true); -// } else { -// sfvcr.setValid(false); -// } -// -// return sfvcr; -// } -// -// /** -// * 将修改终端密码响应消息字节数组解析为消息对象AFN=96H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPasswordCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPasswordCommandResponse spcr = new SetPasswordCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setNewPassword((int) ByteUtil.bcdToLong(new byte[] {data[1], data[0]})); -// } else { -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端实时值命令响应消息字节数组解析为消息对象AFN=B0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeValueCommandResponse qrtvcr = new QueryRealTimeValueCommandResponse(Calendar.getInstance(), address); -// qrtvcr.setRttype(gbFrame.FRAME_CONTROL_FN); -// -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return qrtvcr; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } catch (Exception e) { -// results += "0"+ ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt))); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// qrtvcr.setResults(results); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[1] & 0x0F), data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 2 + 1], data[i * 2] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] {data[data.length - 3], data[data.length - 4] }); -// qrtvcr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] {data[data.length - 1], data[data.length - 2] }); -// qrtvcr.setStatus(status); -// -// qrtvcr.setValid(true); -// return qrtvcr; -// } -// -// /** -// * 将查询终端实时状态命令响应消息字节数组解析为消息对象AFN=5EH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeStatusCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeStatusCommandResponse qrtscr = new QueryRealTimeStatusCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// qrtscr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[3], data[2] }); -// qrtscr.setStatus(status); -// -// qrtscr.setValid(true); -// } else { -// qrtscr.setValid(false); -// } -// -// return qrtscr; -// } -// -// /** -// * 将定时自报消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToTimingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// TimingDataMessage tdm = new TimingDataMessage(Calendar.getInstance(), address); -// -// // 先处理时标 -// byte[] bt = new byte[4]; -// for (int i = 0; i < bt.length; i++) { -// bt[i] = gbFrame.FRAME_DATA_BODY[gbFrame.FRAME_DATA_BODY.length - 1 - bt.length + i]; -// } -// -// // TP中的秒分时日 -// int second = ByteUtil.bcdToInt(bt[bt.length - 4]); -// int minute = ByteUtil.bcdToInt(bt[bt.length - 3]); -// int hour = ByteUtil.bcdToInt(bt[bt.length - 2]); -// int date = ByteUtil.bcdToInt(bt[bt.length - 1]); -// -// Calendar tp = null; -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// -// if (date == tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期与当前日期相同 -// * 表示为最近的自报消息 -// * 判断是否超前 -// * 不超前即认为是正常自报或当日的补报 -// */ -// if (tp.getTimeInMillis() - tdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("定时自报消息时标超前"); // 超前半小时以上 -// logger.error("定时自报消息时标超前"); -// tdm.setValid(false); -// -// return tdm; -// } -// -// tdm.setTime(tp); -// } -// else if (date > tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期大于当前日期 -// * 表示可能为上月的补报自报消息 -// * 将月份减1 -// */ -// try { -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// else { -// /** -// * 日期小于当前日期 -// * 认为是当月的补报自报消息 -// * 月份不变 -// */ -// tdm.setTime(tp); -// } -// } catch (Exception re) { -// /** -// * 判断是否是日期为31导致的错误 -// * 将月份减1 -// */ -// try { -// tp = Calendar.getInstance(); -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// -// tdm.setTime(tp); -// tdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// tdm.setAfn(gbFrame.FRAME_DATA_AFN); -// tdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return tdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") ==false) { -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "-1" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true ) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } -// -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// tdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// tdm.setStatus(status); -// -// tdm.setValid(true); -// -// return tdm; -// } -// -// /** -// * 将随机报警消息字节数组解析为消息对象AFN=81H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToWarningMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// WarningMessage wm = new WarningMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("随机报警消息时标解析异常"); -// logger.error("随机报警消息时标解析异常"); -// wm.setValid(false); -// } -// if (tp.getTimeInMillis() - wm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("随机报警消息时标超前"); // 超前半小时以上 -// logger.error("随机报警消息时标超前"); -// wm.setValid(false); -// } else if (tpDelay != 0 -// && (wm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("随机报警消息超时"); -// logger.error("随机报警消息超时"); -// wm.setValid(false); -// } else { -// wm.setTime(tp); -// wm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// wm.setAfn(gbFrame.FRAME_DATA_AFN); -// wm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置报警状态 -// String warn = ""; -// warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// wm.setWarn(warn); -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return wm; -// case GBConstants.CTRL_DIR1_MWL:// 水位超限 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 5] & 0x0F), data[i * 4 + 4], data[i * 4 + 3], data[i * 4 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 5] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)超限 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 6] & 0x7F), data[i * 5 + 5], data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 6] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质超限 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[6], data[5], data[4], data[3], data[2] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 7; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("") == false) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// default: -// if (data.length == 4) -// break; -// else { -// wm.setValid(false); -// return wm; -// } -// } -// -// String status = ""; -// status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// wm.setStatus(status); -// wm.setValid(true); -// } -// -// return wm; -// } -// -// /** -// * 将人工置数消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSettingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// SettingDataMessage sdm = new SettingDataMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("人工置数消息时标解析异常"); -// logger.error("人工置数消息时标解析异常"); -// sdm.setValid(false); -// } -// if (tp.getTimeInMillis() - sdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("人工置数消息时标超前"); // 超前半小时以上 -// logger.error("人工置数消息时标超前"); -// sdm.setValid(false); -// } else if (tpDelay != 0 && (sdm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("人工置数消息超时"); -// logger.error("人工置数消息超时"); -// sdm.setValid(false); -// } else { -// sdm.setTime(tp); -// sdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// sdm.setAfn(gbFrame.FRAME_DATA_AFN); -// sdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return sdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 5; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("")) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// sdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// sdm.setStatus(status); -// -// sdm.setValid(true); -// } -// -// return sdm; -// } -// -// /** -// * 将设置终端IC卡有效功能命令响应消息字节数组解析为消息对象AFN=30H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableICCardCommandResponse eicccr = new EnableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// eicccr.setSuccess(true); -// } else { -// eicccr.setSuccess(false); -// } -// -// eicccr.setValid(true); -// } else { -// eicccr.setValid(false); -// } -// -// return eicccr; -// } -// -// /** -// * 将设置终端IC卡功能无效命令响应消息字节数组解析为消息对象AFN=31H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableICCardCommandResponse dicccr = new DisableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dicccr.setSuccess(true); -// } else { -// dicccr.setSuccess(false); -// } -// -// dicccr.setValid(true); -// } else { -// dicccr.setValid(false); -// } -// -// return dicccr; -// } -// -// /** -// * 将设置终端定值控制投入功能命令响应消息字节数组解析为消息对象AFN=32H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableFixedValCommandResponse efvcr = new EnableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// efvcr.setSuccess(true); -// } else { -// efvcr.setSuccess(false); -// } -// -// efvcr.setValid(true); -// } else { -// efvcr.setValid(false); -// } -// -// return efvcr; -// } -// -// /** -// * 将设置终端定值控制退出功能命令响应消息字节数组解析为消息对象AFN=33H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableFixedValCommandResponse dfvcr = new DisableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dfvcr.setSuccess(true); -// } else { -// dfvcr.setSuccess(false); -// } -// -// dfvcr.setValid(true); -// } else { -// dfvcr.setValid(false); -// } -// -// return dfvcr; -// } -// -// /** -// * 将遥控开启水泵/闸门命令响应消息字节数组解析为消息对象AFN=92H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteOpenPumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteOpenPumpCommandResponse ropcr = new RemoteOpenPumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// ropcr.setSuccess(true); -// } else { -// ropcr.setSuccess(false); -// } -// -// ropcr.setValid(true); -// } else { -// ropcr.setValid(false); -// } -// -// return ropcr; -// } -// -// /** -// * 将遥控关闭水泵/闸门命令响应消息字节数组解析为消息对象AFN=93H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteClosePumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteClosePumpCommandResponse rcpcr = new RemoteClosePumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// rcpcr.setSuccess(true); -// } else { -// rcpcr.setSuccess(false); -// } -// -// rcpcr.setValid(true); -// } else { -// rcpcr.setValid(false); -// } -// -// return rcpcr; -// } -// -// /** -// * 将复位终端参数命令响应消息字节数组解析为消息对象AFN=90H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToResetParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ResetParamCommandResponse rpcr = new ResetParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// rpcr.setSuccess(true); -// } else { -// rpcr.setSuccess(false); -// } -// -// rpcr.setValid(true); -// } else { -// rpcr.setValid(false); -// } -// -// return rpcr; -// } -// -// /** -// * 将清空终端历史数据单元命令响应消息字节数组解析为消息对象AFN=91H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToClearHistoryCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ClearHistoryCommandResponse chcr = new ClearHistoryCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x01 || data[0] == 0x02) { -// chcr.setSuccess(true); -// } else { -// chcr.setSuccess(false); -// } -// -// chcr.setValid(true); -// } else { -// chcr.setValid(false); -// } -// -// return chcr; -// } -// -// /** -// * 将查询水泵电机实时工作数据命令响应消息字节数解析为消息对象AFN=5FH -// * -// * @param message -// * @return -// */ -// private AppMessage bytesToQueryRealTimeMotoValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeMotoValueCommandResponse qrtmv = new QueryRealTimeMotoValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 12) { -// // 解析并设置A相电压 -// int vaInt = ByteUtil.binToInt(new byte[] { data[1], data[0] }); -// if (vaInt < 1000) -// qrtmv.setVoltageA(String.valueOf(vaInt)); -// else -// qrtmv.setVoltageA("0"); -// -// // 解析并设置B相电压 -// int vbInt = ByteUtil.binToInt(new byte[] { data[3], data[2] }); -// if (vbInt < 1000) -// qrtmv.setVoltageB(String.valueOf(vbInt)); -// else -// qrtmv.setVoltageB("0"); -// -// // 解析并设置C相电压 -// int vcInt = ByteUtil.binToInt(new byte[] { data[5], data[4] }); -// if (vcInt < 1000) -// qrtmv.setVoltageC(String.valueOf(vcInt)); -// else -// qrtmv.setVoltageC("0"); -// -// // 解析并设置A相电流 -// int eaInt = ByteUtil.binToInt(new byte[] { data[7], data[6] }); -// if (eaInt < 1000) -// qrtmv.setEcurrentA(String.valueOf(eaInt)); -// else -// qrtmv.setEcurrentA("0"); -// -// // 解析并设置B相电流 -// int ebInt = ByteUtil.binToInt(new byte[] { data[9], data[8] }); -// if (ebInt < 1000) -// qrtmv.setEcurrentB(String.valueOf(ebInt)); -// else -// qrtmv.setEcurrentB("0"); -// -// // 解析并设置C相电流 -// int ecInt = ByteUtil.binToInt(new byte[] { data[11], data[10] }); -// if (ecInt < 1000) -// qrtmv.setEcurrentC(String.valueOf(ecInt)); -// else -// qrtmv.setEcurrentC("0"); -// -// qrtmv.setValid(true); -// } else { -// qrtmv.setValid(false); -// } -// return qrtmv; -// } -// -// /** -// * 将查询终端事件记录命令响应消息字节数组解析为消息对象AFN=5DH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryEventRecordsCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryEventRecordsCommandResponse qprcr = new QueryEventRecordsCommandResponse(Calendar.getInstance(), address); -// Map ercs = new HashMap(); -// -// int temp = 0; -// -// // 解析并设置数据域 -// if (data.length == 64) { -// // int num = 1; -// // erc19-32备用 -// for (int j = 0; j < 19; j++) { -// temp = ByteUtil.binToInt(new byte[] { data[j * 2 + 1], data[2 * j] }); -// ercs.put("erc" + Integer.toString(j + 1), Integer.valueOf(temp)); -// // System.out.println(j+"==="+temp+"=="); -// } -// -// qprcr.setErcs(ercs); -// qprcr.setValid(true); -// -// } else { -// qprcr.setValid(false); -// } -// return qprcr; -// } -// -// /** -// * 将查询内存自报数据命令响应消息字节数组解析为消息对象AFH=B2H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryMemeryValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryMemeryValueCommandResponse qmvcr = new QueryMemeryValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// qmvcr.setValid(true); -// } else { -// qmvcr.setValid(false); -// } -// return qmvcr; -// } -// -// /** -// * 将查询终端固态存储数据命令响应消息字节数组解析为消息对象AFH=B1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryHDValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryHDValueCommandResponse qhdvcr = new QueryHDValueCommandResponse(Calendar.getInstance(), address); -// Map qhdm = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length > 9) { -// // 解析并设置参数及起止时间数据 -// String starttime = ByteUtil.bcdToString(new byte[] { data[4], data[3], data[2], data[1] }); -// String endtime = ByteUtil.bcdToString(new byte[] { data[8], data[7], data[6], data[5] }); -// if (starttime.equals("") == true || endtime.equals("") == true) { -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// Calendar start = Calendar.getInstance(); -// Calendar end = Calendar.getInstance(); -// start.set(2000 + Integer.parseInt(starttime.substring(0, 2)), -// Integer.parseInt(starttime.substring(2, 4)) - 1, -// Integer.parseInt(starttime.substring(4, 6)), -// Integer.parseInt(starttime.substring(6, 8)), 0, 0); -// end.set(2000 + Integer.parseInt(endtime.substring(0, 2)), -// Integer.parseInt(endtime.substring(2, 4)) - 1, -// Integer.parseInt(endtime.substring(4, 6)), -// Integer.parseInt(endtime.substring(6, 8)), 0, 0); -// long hour = (end.getTimeInMillis() - start.getTimeInMillis()) / (1000 * 3600); -// -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// qhdvcr.setType(type); -// qhdvcr.setNo(no); -// -// switch (type) { -// case 0: //雨量参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format((Integer.parseInt(realtime) / 10.0), "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 1: //水位参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 3] & 0x0F), data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 3] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 2: //水量参数 -// { -// int interval = (data.length - 9) / 5; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 5) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 4] & 0x7F), data[i + 3], data[i + 2], data[i + 1], data[i]}); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// // 判断剩余水量正负符号 -// Long realtimelong = Long.valueOf(0); -// if ((data[i + 4] & 0x80) == 0x80) -// realtimelong = Long.valueOf(Long.parseLong(realtime) * -1); -// else -// realtimelong = Long.valueOf(realtime); -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(realtimelong)); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 3: //流速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 2] & 0x0F), data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 2] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 4: //闸位参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 5: //功率参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 6: //气压参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 7: //风速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 8: //水温参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 10: //土壤含水率参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 11: //水压参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] { data[i + 3], data[i + 2 ], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// default://其它参数未实现 -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// qhdvcr.setValid(true); -// -// } else { -// qhdvcr.setValid(false); -// } -// return qhdvcr; -// } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //获取传感器数量 + + int offset = cmd.getOffset(); //获取湿度变量的内存地址偏移量 + offset = offset + wsct * 2 * 2 * 2; + + // 解析并存储温度值 + for (int i = 0; i < wsct; i++) { + byte[] tempValueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; + byte[] tempThresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; + + float tempValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempValueByte), 16)); //温度监测值 + float tempThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempThresholdByte), 16)); //温度报警阈值 + + rwvcr.getWd().add(tempValue); + rwvcr.getWdbjz().add(tempThreshold); + } + + // 解析并存储湿度值 + for (int i = 0; i < wsct; i++) { + byte[] humValueByte = new byte[] { data[i*8 + 2 + offset], data[i*8 + 3 + offset], data[i*8 + offset], data[i*8 + 1 + offset] }; + byte[] humThresholdByte = new byte[] { data[i*8 + 6 + offset], data[i*8 + 7 + offset], data[i*8 + 4 + offset], data[i*8 + 5 + offset] }; + + float humValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humValueByte), 16)); //湿度监测值 + float humThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humThresholdByte), 16)); //湿度报警阈值 + + rwvcr.getSd().add(humValue); + rwvcr.getSdbjz().add(humThreshold); + } + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //温湿度监测点的数量 + + // 处理温度状态 + String tempDataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 1); + char bjBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 2); + + rwsscr.getWdbj().add(bjBit == '1' ? true : false); + rwsscr.getWdldbj().add(ldBit == '1' ? true : false); + } + + // 处理湿度状态 + String humDataStr = ByteUtil.binToBinString(new byte[] { data[4], data[5] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = humDataStr.charAt(humDataStr.length() - 2 * i - 1); + char bjBit = humDataStr.charAt(humDataStr.length() - 2 * i - 2); + + rwsscr.getSdbj().add(bjBit == '1' ? true : false); + rwsscr.getSdldbj().add(ldBit == '1' ? true : false); + } + } + + return rwsscr; + } + /** * 将消息对象解析为字节数组 @@ -3507,18 +512,25 @@ frame = LinkCommandToBytes((LinkCommand) message); } - // 读取甲烷参数内存命令 - if (message instanceof ReadCH4ParamCommand) { - frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); - } else if (message instanceof ReadCH4StatusCommand) { - frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); - } - -// // 读内存命令 -// if (message instanceof FreeMessageResponse) { -// frame = freeMessageResponseToBytes((FreeMessageResponse) message); +// // 读取甲烷参数内存命令 +// if (message instanceof ReadCH4ValueCommand) { +// frame = ReadCH4ValueCommandToBytes((ReadCH4ValueCommand) message); +// } else if (message instanceof ReadCH4StatusCommand) { +// frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); // } // +// // 读取温湿度命令 +// else if (message instanceof ReadWSValueCommand) { +// frame = ReadWSValueCommandToBytes((ReadWSValueCommand) message); +// } else if (message instanceof ReadWSStatusCommand) { +// frame = ReadWSStatusCommandToBytes((ReadWSStatusCommand) message); +// } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } +// // // 写内存命令 // if (message instanceof QueryRealTimeValueCommand) { // frame = queryRealTimeValueCommandToBytes((QueryRealTimeValueCommand) message); @@ -3527,6 +539,8 @@ return frame; } + + /** * 将握手命令转换为字节数组 * @@ -3540,28 +554,12 @@ } /** - * 将读取甲烷监测值命令转换为字节数组 - * @param read - * @return - */ - private byte[] ReadCH4ParamCommandToBytes(ReadCH4ParamCommand read) { - byte[] start = ByteUtil.hexStringToBytes(read.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(read.getDestinationId(), - read.getMessageProducerId(), - read.getMemoryArea(), - start, - read.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将读取甲烷报警状态命令转换为字节数组 + * 将读取PLC内存命令转换为字节数组 + * * @param message * @return */ - private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), @@ -3569,1221 +567,78 @@ message.getMemoryArea(), start, message.getCountWord()); - + return finsFrame.toBytes(); } + /** + * 将读取甲烷监测值命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4ValueCommandToBytes(ReadCH4ValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } -// /** -// * 将退出登录命令对象转换为字节数组AFN=02H -// * -// * @param hmr -// * @return -// */ -// private byte[] logoutCommandToBytes(LogoutCommand lc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, lc.getDestinationId(), -// GBConstants.DATA_AFN_LOGIN, new byte[] { (byte) 0xF1 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置地址命令对象转换为字节数组AFN=10H -// * -// * @param message -// * @return -// */ -// private byte[] setAddressCommandToBytes(SetAddressCommand sac) { -// String address = sac.getNewAddress(); -// -// // 解析设置的新地址内容 -// byte[] add1 = ByteUtil.bcdStringToBytes(address.substring(0, 6)); -// byte[] add2 = ByteUtil.hexStringToBytes(address.substring(7, 10)); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(add1).append(add2[1]).append(add2[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sac.getDestinationId(), -// GBConstants.DATA_AFN_SETADDRESS, data.toBytes(), pw, -// sac.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询地址命令对象转换为字节数组AFN=50H -// * -// * @param message -// * @return -// */ -// private byte[] queryAddressCommandToBytes(QueryAddressCommand qac) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qac.getDestinationId(), -// GBConstants.DATA_AFN_QUERYADDRESS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置时钟命令对象转换为字节数组AFN=11H -// * -// * @param scc -// * @return -// */ -// private byte[] setClockCommandToBytes(SetClockCommand scc) { -// Calendar clock = scc.getClock(); -// -// // 解析设置的新时钟内容 -// int week = clock.get(Calendar.DAY_OF_WEEK); -// switch (week) { -// case Calendar.MONDAY: -// case Calendar.TUESDAY: -// case Calendar.WEDNESDAY: -// case Calendar.THURSDAY: -// case Calendar.FRIDAY: -// case Calendar.SATURDAY: -// week = week - 1; -// break; -// case Calendar.SUNDAY: -// week = week - 1 + 7; -// break; -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcd(clock.get(Calendar.SECOND))); // 秒 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append((byte) (ByteUtil.intToBcd(clock.get(Calendar.MONTH) + 1) | (ByteUtil -// .intToBcd(week) << 5))); // 月 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.YEAR) - 2000)); // 年 -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCLOCK, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询时钟命令对象转换为字节数组AFN=51H -// * -// * @param message -// * @return -// */ -// private byte[] queryClockCommandToBytes(QueryClockCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCLOCK); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置工作模式命令对象转换为字节数组AFN=12H -// * -// * @param message -// * @return -// */ -// private byte[] setPatternCommandToBytes(SetPatternCommand spc) { -// String newPattern = spc.getPattern(); -// if (newPattern.length() > 2) { -// newPattern = newPattern.substring(0, 2); -// } -// -// // 解析设置的新工作模式内容 -// byte[] pattern = ByteUtil.hexStringToBytes(newPattern); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(pattern); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETWORKPATTERN, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询工作模式命令对象转换为字节数组AFN=52H -// * -// * @param message -// * @return -// */ -// private byte[] queryPatternCommandToBytes(QueryPatternCommand qpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWORKPATTERN); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置自报种类及时间间隔命令对象转换为字节数组AFN=A1H -// * -// * @param message -// * @return -// */ -// private byte[] setIntervalCommandToBytes(SetIntervalCommand sic) { -// Map newIntervals = sic.getIntervals(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// Bytes di = new Bytes(); // 每种参数自报的时间间隔 -// for (int i = 0; i < SetIntervalCommand.index.length; i++) { -// String key = SetIntervalCommand.index[i]; -// if (newIntervals.containsKey(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// int val = ((Integer) newIntervals.get(key)).intValue(); -// int low = val % 100; -// int high = val / 100; -// di.append(ByteUtil.intToBcd(low)).append(ByteUtil.intToBcd(high)); -// } else { -// di.append(new byte[] { 0x00, 0x00 }); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]).append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sic.getDestinationId(), -// GBConstants.DATA_AFN_SETINTERVAL, data.toBytes(), pw, -// sic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询自报种类及时间间隔命令对象转换为字节数组AFN=53H -// * -// * @param message -// * @return -// */ -// private byte[] queryIntervalCommandToBytes(QueryIntervalCommand qic) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qic.getDestinationId(), -// GBConstants.DATA_AFN_QUERYINTERVAL); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端需查询的实时数据种类命令对象转换为字节数组AFN=A0H -// * -// * @param message -// * @return -// */ -// private byte[] setRttypesCommandToBytes(SetRttypesCommand src) { -// Set newRttypes = src.getRttypes(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// for (int i = 0; i < SetRttypesCommand.index.length; i++) { -// String key = SetRttypesCommand.index[i]; -// if (newRttypes.contains(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, src.getDestinationId(), -// GBConstants.DATA_AFN_SETRTTYPES, data.toBytes(), pw, -// src.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端需查询的实时数据种类命令对象转换为字节数组AFN=54H -// * -// * @param message -// * @return -// */ -// private byte[] queryRttypesCommandToBytes(QueryRttypesCommand qrc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYRTTYPES); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端充值量命令对象转换为字节数组AFN=15H -// * -// * @param message -// * @return -// */ -// private byte[] setChargingCommandToBytes(SetChargingCommand scc) { -// String charging = scc.getNewCharging(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(charging), 4)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCHARGING, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端充值量命令对象转换为字节数组AFN=55H -// * -// * @param message -// * @return -// */ -// private byte[] queryChargingCommandToBytes(QueryChargingCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCHARGING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端剩余水量报警值命令对象转换为字节数组AFN=16H -// * -// * @param message -// * @return -// */ -// private byte[] setWarningCommandToBytes(SetWarningCommand swc) { -// String warning = swc.getNewWarning(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(warning), 3)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swc.getDestinationId(), -// GBConstants.DATA_AFN_SETWARNING, data.toBytes(), pw, -// swc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端剩余水量报警值命令对象转换为字节数组AFN=56H -// * -// * @param message -// * @return -// */ -// private byte[] queryWarningCommandToBytes(QueryWarningCommand qwc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWARNING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水位参数命令对象转换为字节数组AFN=17H -// * -// * @param message -// * @return -// */ -// private byte[] setWlParamCommandToBytes(SetWlParamCommand swpc) { -// List> wlParams = swpc.getWlParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wlParams.size(); i++) { -// List wlp = (List) wlParams.get(i); -// -// int benchmark = (int) (((Double) wlp.get(0)).doubleValue() * 100); -// int upper = (int) (((Double) wlp.get(1)).doubleValue() * 100); -// int lower = (int) (((Double) wlp.get(2)).doubleValue() * 100); -// -// byte[] bb = ByteUtil.intToBcdsHL(Math.abs(benchmark), 3); -// if (benchmark < 0) { -// bb[2] = (byte) (bb[2] + 0x80); -// } -// byte[] ub = ByteUtil.intToBcdsHL(upper, 2); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 2); -// data.append(bb).append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERLEVELPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水位参数命令对象转换为字节数组AFN=57H -// * -// * @param message -// * @return -// */ -// private byte[] queryWlParamCommandToBytes(QueryWlParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERLEVELPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水压参数命令对象转换为字节数组AFN=18H -// * -// * @param message -// * @return -// */ -// private byte[] setWpParamCommandToBytes(SetWpParamCommand swpc) { -// List> wpParams = swpc.getWpParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wpParams.size(); i++) { -// List wpp = (List) wpParams.get(i); -// -// int upper = (int) (((Double) wpp.get(0)).doubleValue() * 100); -// int lower = (int) (((Double) wpp.get(1)).doubleValue() * 100); -// -// byte[] ub = ByteUtil.intToBcdsHL(upper, 4); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 4); -// data.append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERPRESSUREPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水压参数命令对象转换为字节数组AFN=58H -// * -// * @param message -// * @return -// */ -// private byte[] queryWpParamCommandToBytes(QueryWpParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERPRESSUREPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数上限命令对象转换为字节数组AFN=19H -// * -// * @param message -// * @return -// */ -// private byte[] setWqUpperParamCommandToBytes(SetWqUpperParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqUpperParamCommand.index.length; i++) { -// String key = SetWqUpperParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqUpperParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYUPPERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数下限命令对象转换为字节数组AFN=1AH -// * -// * @param message -// * @return -// */ -// private byte[] setWqLowerParamCommandToBytes(SetWqLowerParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqLowerParamCommand.index.length; i++) { -// String key = SetWqLowerParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqLowerParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYLOWERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数上限命令对象转换为字节数组AFN=59H -// * -// * @param message -// * @return -// */ -// private byte[] queryWqUpperParamCommandToBytes(QueryWqUpperParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数下限命令对象转换为字节数组AFN=5AH -// * -// * @param message -// * @return -// */ -// private byte[] queryWqLowerParamCommandToBytes(QueryWqLowerParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYLOWERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端流量参数命令对象转换为字节数组AFN=1FH -// * -// * @param message -// * @return -// */ -// private byte[] setWfParamCommandToBytes(SetWfParamCommand swpc) { -// List newUppers = swpc.getNewUppers(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < newUppers.size(); i++) { -// double value = ((Double) newUppers.get(i)).doubleValue(); -// int upper = (int) (Math.abs(value) * 1000); -// byte[] ub = ByteUtil.intToBcdsHL(upper, 5); -// if (value < 0) { -// ub[4] = (byte) (ub[4] + 0xF0); -// } -// data.append(ub); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERFLOWUPPERPARAM, data.toBytes(), -// pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端流量参数命令对象转换为字节数组AFN=64H -// * -// * @param message -// * @return -// */ -// private byte[] queryWfParamCommandToBytes(QueryWfParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERFLOWUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时值命令对象转换为字节数组AFN=B0H -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeValueCommandToBytes(QueryRealTimeValueCommand qrtvc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// qrtvc.getRttype(), qrtvc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMEVALUE); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水量表底值命令对象转换为字节数组AFN=1BH -// * -// * @param message -// * @return -// */ -// private byte[] setFlowInitCommandToBytes(SetFlowInitCommand sfic) { -// List inits = sfic.getNewInits(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < inits.size(); i++) { -// long init = ((Long) inits.get(i)).longValue(); -// byte[] ib = ByteUtil.intToBcdsHL(init, 5); -// data.append(ib); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfic.getDestinationId(), -// GBConstants.DATA_AFN_SETFLOWINIT, data.toBytes(), pw, -// sfic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔命令对象转换为字节数组AFN=20H -// * -// * @param message -// * @return -// */ -// private byte[] setThresholdCommandToBytes(SetThresholdCommand stc) { -// int type = stc.getType(); -// int no = stc.getNo(); -// int inter = stc.getInter(); -// double thresh = stc.getThresh(); + /** + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); // -// String noHex = ByteUtil.binToHexString(ByteUtil.intToBins(no, 1)); -// noHex = noHex.substring(noHex.length() - 1); -// String typeHex = ByteUtil.binToHexString(ByteUtil.intToBins(type, 1)); -// typeHex = typeHex.substring(typeHex.length() - 1); +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); // -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.hexStringToBytes(typeHex + noHex)); -// data.append(ByteUtil.intToBins(inter, 1)); -// byte[] threshBytes = null; -// -// // 控制域FN -// int control_fn = 0; -// -// // 判断设置检测参数的类型 -// switch (type) { -// case 0: //雨量参数 -// data.append(ByteUtil.intToBcd((int) (thresh * 10))); -// control_fn = 1; -// break; -// -// case 1: //水位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 4); -// if (thresh < 0) { -// threshBytes[3] = (byte) (threshBytes[3] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 2; -// break; -// -// case 2: //水量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh)), 5); -// if (thresh < 0) { -// threshBytes[4] = (byte) (threshBytes[4] | 0x80); -// } -// data.append(threshBytes); -// -// control_fn = 3; -// break; -// -// case 3: //流速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 3); -// if (thresh < 0) { -// threshBytes[2] = (byte) (threshBytes[2] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 4; -// break; -// -// case 4: //闸位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 5; -// break; -// -// case 5: //功率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 6; -// break; -// -// case 6: //气压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 7; -// break; -// -// case 7: //风速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 8; -// break; -// -// case 8: //水温参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 9; -// break; -// -// case 10: //土壤含水率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 11; -// break; -// -// case 11: //蒸发量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 3); -// data.append(threshBytes); -// -// control_fn = 12; -// break; -// -// case 12: //水压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 4); -// data.append(threshBytes); -// -// control_fn = 15; -// break; -// -// default: -// thresh = 0.0; -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, stc.getDestinationId(), -// GBConstants.DATA_AFN_SETTHRESHOLD, data.toBytes(), pw, -// stc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端定值量命令对象转换为字节数组AFN=34H -// * -// * @param message -// * @return -// */ -// private byte[] setFixedValueCommandToBytes(SetFixedValueCommand sfvc) { -// long fixedvalue = sfvc.getNewFixedValue(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] fb = ByteUtil.intToBcdsHL(fixedvalue, 5); -// data.append(fb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfvc.getDestinationId(), -// GBConstants.DATA_AFN_SETFIXEDVALUE, data.toBytes(), pw, -// sfvc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将修改终端密码命令对象转换为字节数组AFN=96H -// * -// * @param message -// * @return -// */ -// private byte[] setPasswordCommandToBytes(SetPasswordCommand spc) { -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] pb = ByteUtil.intToBcdsHL(spc.getNewPassword(), 2); -// data.append(pb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETPASSWORD, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时状态命令对象转换为字节数组AFN=5EH -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeStatusCommandToBytes(QueryRealTimeStatusCommand qrtsc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_QSS, qrtsc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMESTATUS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将自报响应消息转换为字节数组 自报消息通用响应 -// * -// * @param message -// * @return -// */ -// private byte[] freeMessageResponseToBytes(FreeMessageResponse fmr) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, fmr.getFcb(), -// fmr.getType(), fmr.getDestinationId(), -// fmr.getAfn(), new byte[] { 0x00 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能有效命令转换为字节数组AFN=30H -// * -// * @param message -// * @return -// */ -// private byte[] enableICCardCommandToBytes(EnableICCardCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEICCARD, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能无效命令转换为字节数组AFN=31H -// * -// * @param message -// * @return -// */ -// private byte[] disableICCardCommandToBytes(DisableICCardCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEICCARD, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制投入功能命令转换为字节数组AFN=32H -// * -// * @param message -// * @return -// */ -// private byte[] enableFixedValCommandToBytes(EnableFixedValCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEFIXEDVAL, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制退出功能命令转换为字节数组AFN=33H -// * -// * @param message -// * @return -// */ -// private byte[] disableFixedValCommandToBytes(DisableFixedValCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEFIXEDVAL, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控开启水泵/闸门命令转换为字节数组AFN=92H -// * -// * @param message -// * @return -// */ -// private byte[] remoteOpenPumpCommandToBytes(RemoteOpenPumpCommand ropc) { -// byte[] data = ByteUtil.hexStringToBytes(ropc.getPump() + ropc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, ropc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTEOPENPUMP, data, pw, ropc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控关闭水泵/闸门命令转换为字节数组AFN=93H -// * -// * @param message -// * @return -// */ -// private byte[] remoteClosePumpCommandToBytes(RemoteClosePumpCommand rcpc) { -// byte[] data = ByteUtil.hexStringToBytes(rcpc.getPump() + rcpc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rcpc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTECLOSEPUMP, data, pw, rcpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将复位终端参数命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] resetParamCommandToBytes(ResetParamCommand rpc) { -// byte[] data = ByteUtil.hexStringToBytes(rpc.getReset(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rpc.getDestinationId(), -// GBConstants.DATA_AFN_RESETPARAM, data, pw, rpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将清空历史数据单元命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] clearHistoryCommandToBytes(ClearHistoryCommand chc) { -// byte[] data = ByteUtil.hexStringToBytes(chc.getClear(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, chc.getDestinationId(), -// GBConstants.DATA_AFN_CLEARHISTORY, data, pw, chc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询水泵电机实时工作数据的命令转换为字节数组AFN=5FH -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryRealTimeMotoValueCommandToBytes( -// QueryRealTimeMotoValueCommand qrtmv) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrtmv.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEMOTOSS); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端事件记录的命令转换为字节数组5DH -// * -// * @param message -// * @return -// */ -// private byte[] queryEventRecordsCommandToBytes(QueryEventRecordsCommand qerc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEVENTREC); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询内存自报数据的命令转换为字节数组B2H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryMemeryValueCommandToBytes(QueryMemeryValueCommand qerc) { -// Calendar bclock = qerc.getBdate(); -// Calendar eclock = qerc.getEdate(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYMEMERYVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询固态存储数据的命令转换为字节数组B1H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryHDValueCommandToBytes(QueryHDValueCommand qhdc) { -// int type = qhdc.getType(); -// int no = qhdc.getNo(); -// Calendar sclock = qhdc.getSclock(); -// Calendar eclock = qhdc.getEclock(); -// -// int i = type * 16 + no; -// -// int control_fn = GBConstants.CTRL_DIR0_QACC; -// if (type == 0) //查询雨量参数 -// control_fn = GBConstants.CTRL_DIR0_QRF; -// else if (type == 1) //查询水位参数 -// control_fn = GBConstants.CTRL_DIR0_QWL; -// else if (type == 2) //查询水量参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 3) //查询流速参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 4) //查询闸位参数 -// control_fn = GBConstants.CTRL_DIR0_QBC; -// else if (type == 5) //查询功率参数 -// control_fn = GBConstants.CTRL_DIR0_QPW; -// else if (type == 6) //查询气压参数 -// control_fn = GBConstants.CTRL_DIR0_QAP; -// else if (type == 7) //查询风速参数 -// control_fn = GBConstants.CTRL_DIR0_QWS; -// else if (type == 8) //查询水温参数 -// control_fn = GBConstants.CTRL_DIR0_QWT; -// else if (type == 9) //查询水质参数 -// control_fn = GBConstants.CTRL_DIR0_QWQ; -// else if (type == 10) //查询土壤含水率参数 -// control_fn = GBConstants.CTRL_DIR0_QSA; -// else if (type == 11) //查询水压参数 -// control_fn = GBConstants.CTRL_DIR0_QHP; -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBins(i, 1)); -// -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.YEAR))); // 年 -// -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.YEAR))); // 年 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, qhdc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYHARDDISCVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// -// /** -// * 从重叠消息中提取规范消息 -// */ -// public List extractByteMessage(byte[] byteMessage) { -// List bytesList = new ArrayList(); -// -// try { -// int i = 0; -// while (i < byteMessage.length) { -// if ((byteMessage[i] == GBByteFrame.FRAME_HEAD) && (byteMessage[i + 2] == GBByteFrame.FRAME_HEAD)) { -// int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 1]}); -// if (i + length + 5 <= byteMessage.length && byteMessage[i + length + 4] == GBByteFrame.FRAME_END) { -// Bytes bytes = new Bytes(); -// bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]); -// for (int j = 0; j < length + 2; j++) { -// bytes.append(byteMessage[i + 3 + j]); -// } -// -// i = i + length + 5; -// bytesList.add(bytes.toBytes()); -// } else { -// i++; -// } -// } else { -// i++; -// } -// } -// } catch (Exception e) { -// bytesList.clear(); -// bytesList.add(byteMessage); -// return bytesList; -// } -// -// return bytesList; +// return finsFrame.toBytes(); // } + /** + * 将读取温湿度监测值命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSValueCommandToBytes(ReadWSValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + + /** + * 将读取温湿度报警状态命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSStatusCommandToBytes(ReadWSStatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + } diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java deleted file mode 100644 index 3570a07..0000000 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.szpg.task; - -import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; -import com.szpg.db.data.PgAcuRdcmd; -import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; - -public class ReadCH4ParamTask implements Runnable { - - private ACUClient client; - private AppCommand appCommand; - - public ReadCH4ParamTask(ACUClient client, AppCommand command) { - this.client = client; - this.appCommand = command; - } - - @Override - public void run() { - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(appCommand); - - // 发送读取甲烷参数内存命令 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - ReadCH4ParamCommand ch4Cmd = (ReadCH4ParamCommand) appCommand; - - // 发送完成之后将命令保存在数据库中 - PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(ch4Cmd.getCommandType()); - cmd.setDest(ch4Cmd.getDestinationId()); - cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); - cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); - cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCountWord()); - cmd.setCount_bit(ch4Cmd.getCountBit()); - - new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); - } - -} diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 196d7e3..11b33b4 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -41,6 +41,7 @@ cmd.setStart_mem_bit(ch4AlmCmd.getStartAddress().substring(4)); cmd.setCount_word(ch4AlmCmd.getCountWord()); cmd.setCount_bit(ch4AlmCmd.getCountBit()); + cmd.setCount_sensor(ch4AlmCmd.getCountSensor()); new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); } diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java new file mode 100644 index 0000000..73d957f --- /dev/null +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -0,0 +1,49 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadCH4ValueTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadCH4ValueTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取甲烷参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadCH4ValueCommand ch4Cmd = (ReadCH4ValueCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setId(ch4Cmd.getId()); + cmd.setTm(ch4Cmd.getTime().getTime()); + cmd.setCmd_type(ch4Cmd.getCommandType()); + cmd.setDest(ch4Cmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); + cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); + cmd.setCount_word(ch4Cmd.getCountWord()); + cmd.setCount_bit(ch4Cmd.getCountBit()); + cmd.setCount_sensor(ch4Cmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 12d1c18..736bc18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -13,11 +13,12 @@ import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.message.command.read.ReadCH4StatusCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -123,17 +124,25 @@ // 3根据参数类型调用相应的方法进行解析 switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - received = bytesToReadCH4ParamCommand(finsFrame); + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, readCmd); break; case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + received = bytesToReadCH4StatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, readCmd); break; } - // 4将有效的命令的是否有响应字段置1 - readCmdDao.updateCmdRecordResponsed(readCmd.getId()); + // 4将已响应的命令删除 + readCmdDao.deleteCmdRecord(readCmd.getId()); } } else if (commandCode.equalsIgnoreCase("0102")) { @@ -320,6 +329,7 @@ } + /** * 将握手响应字节数组转换为消息对象 * @@ -352,15 +362,15 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4ParamCommand(FINSByteFrame finsFrame) { - ReadCH4ParamCommandResponse rcpcr = new ReadCH4ParamCommandResponse(); + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadCH4ValueCommandResponse rcpcr = new ReadCH4ValueCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; rcpcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = data.length / (2 * 2 * 2); //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占2个字,每个字占2个字节 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 for (int i = 0; i < chct; i++) { byte[] valueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; byte[] thresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; @@ -383,7 +393,7 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; @@ -391,7 +401,7 @@ if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); @@ -401,3097 +411,92 @@ rcscr.getJwldbj().add(ldBit == '1' ? true : false); } } - + return rcscr; } -// -// /** -// * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryAddressResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryAddressCommandResponse qacr = new QueryAddressCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String addressRes = ByteUtil.bcdToString(new byte[] { data[0], data[1], data[2] }) + -// ByteUtil.binToHexString(new byte[] { data[4], data[3] }); -// if (addressRes.length() == 10) { -// qacr.setValid(true); -// qacr.setAddress(addressRes); -// } else { -// logger.error("查询终端地址响应消息解析错误"); -// qacr.setValid(false); -// } -// } else { -// logger.error("查询终端地址响应消息长度错误"); -// qacr.setValid(false); -// } -// -// return qacr; -// } -// -// /** -// * 将设置终端时钟响应消息字节数组解析为消息对象AFN=11H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetClockCommandResponse sccr = new SetClockCommandResponse(Calendar.getInstance(), address); -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// try { -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// sccr.setValid(false); -// return sccr; -// } catch (Exception re) { -// logger.error("时间字段解析异常"); -// sccr.setValid(false); -// return sccr; -// } -// -// sccr.setNewClock(clock); -// -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端时钟响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端时钟响应消息字节数组解析为消息对象AFN=51H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryClockCommandResponse qccr = new QueryClockCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// try { -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// qccr.setValid(false); -// return qccr; -// } -// -// qccr.setClock(clock); -// qccr.setValid(true); -// } else { -// logger.error("查询终端时钟响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端工作模式响应消息字节数组解析为消息对象AFN=12H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPatternCommandResponse spcr = new SetPatternCommandResponse(Calendar.getInstance(), address); -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setWorkPattern(patternRes); -// } else { -// logger.error("设置终端工作模式响应消息长度错误"); -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端工作模式响应消息字节数组解析为消息对象AFN=52H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryPatternCommandResponse qpcr = new QueryPatternCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// qpcr.setValid(true); -// qpcr.setWorkPattern(patternRes); -// } else { -// logger.error("查询终端工作模式响应消息长度错误"); -// qpcr.setValid(false); -// } -// -// return qpcr; -// } -// -// /** -// * 将设置终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=A1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetIntervalCommandResponse sicr = new SetIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// sicr.setValid(true); -// sicr.setIntervals(intervals); -// -// sicr.setValid(true); -// sicr.setSuccess(true); -// } else { -// logger.error("设置终端自报种类及时间间隔响应消息长度错误"); -// sicr.setValid(false); -// } -// -// return sicr; -// } -// -// /** -// * 将查询终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=53H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryIntervalCommandResponse qicr = new QueryIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// qicr.setValid(true); -// qicr.setIntervals(intervals); -// } else { -// logger.error("查询终端自报种类及时间间隔响应消息长度错误"); -// qicr.setValid(false); -// } -// -// return qicr; -// } -// -// /** -// * 将设置终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=A0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetRttypesCommandResponse srcr = new SetRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// srcr.setRttypes(rttypes); -// -// srcr.setValid(true); -// srcr.setSuccess(true); -// } else { -// logger.error("设置终端需查询的实时数据种类响应消息长度错误"); -// srcr.setValid(false); -// } -// -// return srcr; -// } -// -// /** -// * 将查询终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=54H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRttypesCommandResponse qrcr = new QueryRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// -// qrcr.setValid(true); -// qrcr.setRttypes(rttypes); -// } else { -// logger.error("查询终端需查询的实时数据种类响应消息长度错误"); -// qrcr.setValid(false); -// } -// -// return qrcr; -// } -// -// /** -// * 将设置终端充值量响应消息字节数组解析为消息对象AFN=15H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetChargingCommandResponse sccr = new SetChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// -// sccr.setCharging(Integer.parseInt(charging)); -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端充值量响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端充值量和剩余水量响应消息字节数组解析为消息对象AFN=55H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryChargingCommandResponse qccr = new QueryChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 9) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[8] & 0x7F), data[7], data[6], data[5], data[4] }); -// -// if (charging.equals("") == false && current.equals("") == false) { -// qccr.setValid(true); -// qccr.setCharging(Integer.parseInt(charging)); -// // 判断剩余水量正负符号 -// if ((data[8] & 0x80) == 0x80) { -// qccr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qccr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息解析错误"); -// qccr.setValid(false); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端剩余水量报警值响应消息字节数组解析为消息对象AFN=16H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWarningCommandResponse swcr = new SetWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 3) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (warning.equals("") == false) { -// swcr.setNewWarning(Integer.parseInt(warning)); -// } -// -// swcr.setValid(true); -// swcr.setSuccess(true); -// } else { -// logger.error("设置终端剩余水量报警值响应消息长度错误"); -// swcr.setValid(false); -// } -// -// return swcr; -// } -// -// /** -// * 将查询终端剩余水量报警值响应消息字节数组解析为消息对象AFN=56H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWarningCommandResponse qwcr = new QueryWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[7] & 0x7F), data[6], data[5], data[4], data[3] }); -// -// if (warning.equals("") == false && current.equals("") == false) { -// qwcr.setValid(true); -// qwcr.setWarning(Integer.parseInt(warning)); -// // 判断剩余水量正负符号 -// if ((data[7] & 0x80) == 0x80) { -// qwcr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qwcr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息解析错误"); -// qwcr.setValid(false); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息长度错误"); -// qwcr.setValid(false); -// } -// -// return qwcr; -// } -// -// /** -// * 将设置终端水位参数响应消息字节数组解析为消息对象AFN=17H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWlParamCommandResponse swpcr = new SetWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 7 == 0) { -// int n = data.length / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// swpcr.setWlParams(wlParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水位参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水位参数响应消息字节数组解析为消息对象AFN=57H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWlParamCommandResponse qwpcr = new QueryWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 9 && data.length % 7 == 2) { -// int n = (data.length - 2) / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWlParams(wlParams); -// qwpcr.setValid(true); -// -// } else { -// logger.error("查询水位参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=18H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWpParamCommandResponse swpcr = new SetWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 8 && data.length % 8 == 0) { -// int n = data.length / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// swpcr.setWpParams(wpParams); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水压参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数响应消息字节数组解析为消息对象AFN=58H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWpParamCommandResponse qwpcr = new QueryWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 10 && data.length % 8 == 2) { -// int n = (data.length - 2) / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWpParams(wpParams); -// qwpcr.setValid(true); -// } else { -// logger.error("查询水压参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=19H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqUpperParamCommandResponse swpcr = new SetWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=1AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqLowerParamCommandResponse swpcr = new SetWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数上限响应消息字节数组解析为消息对象AFN=59H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqUpperParamCommandResponse qwpcr = new QueryWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将查询终端水压参数下限响应消息字节数组解析为消息对象AFN=5AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqLowerParamCommandResponse qwpcr = new QueryWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端流量参数响应消息字节数组解析为消息对象AFN=1FH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWfParamCommandResponse swpcr = new SetWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// swpcr.setNewUppers(uppers); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端流量参数响应消息字节数组解析为消息对象AFN=64H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWfParamCommandResponse qwpcr = new QueryWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 5 == 2) { -// int n = (data.length - 2) / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setUppers(uppers); -// qwpcr.setValid(true); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水量表底值响应消息字节数组解析为消息对象AFN=1BH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFlowInitCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFlowInitCommandResponse sficr = new SetFlowInitCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5; //监测点个数 -// List inits = new ArrayList(n); -// -// // 解析多个监测点的值 -// for (int i = 0; i < n; i++) { -// String init = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4]), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// -// inits.add(Long.valueOf(init)); -// } -// sficr.setNewInits(inits); -// -// sficr.setValid(true); -// sficr.setSuccess(true); -// } else { -// sficr.setValid(false); -// } -// -// return sficr; -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔响应消息字节数组解析为消息对象AFN=20H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetThresholdCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetThresholdCommandResponse stcr = new SetThresholdCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 3) { -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// int inter = data[1]; -// double thresh = 0.0; -// -// stcr.setType(type); -// stcr.setNo(no); -// stcr.setInter(inter); -// -// switch (type) { -// case 0: //雨量参数 -// stcr.setThresh(ByteUtil.bcdToInt(data[2])/10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 1: //水位参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[5] & 0x0F), data[4], data[3], data[2]}); -// if ((data[5] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 2: //水量参数 -// if (data.length == 7) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[6] & 0x7F), data[5], data[4], data[3], data[2]}); -// if ((data[6] & 0x80) == 0x80) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 3: //流速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[4] & 0x0F), data[3], data[2]}); -// if ((data[4] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 4: //闸位参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 5: //功率参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 6: //气压参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 7: //风速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 8: //水温参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 10: //土壤含水率参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 11: //蒸发量参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 12: //水压参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[5], data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// default: -// stcr.setThresh(0.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// } -// } else { -// stcr.setValid(false); -// } -// -// return stcr; -// } -// -// /** -// * 将设置终端定值量响应消息字节数组解析为消息对象AFN=34H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFixedValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFixedValueCommandResponse sfvcr = new SetFixedValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String fixed = ByteUtil.bcdToString(new byte[] {(byte) (data[4]), data[3], data[2], data[1], data[0]}); -// -// sfvcr.setFixedValue(Long.parseLong(fixed)); -// -// sfvcr.setValid(true); -// sfvcr.setSuccess(true); -// } else { -// sfvcr.setValid(false); -// } -// -// return sfvcr; -// } -// -// /** -// * 将修改终端密码响应消息字节数组解析为消息对象AFN=96H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPasswordCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPasswordCommandResponse spcr = new SetPasswordCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setNewPassword((int) ByteUtil.bcdToLong(new byte[] {data[1], data[0]})); -// } else { -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端实时值命令响应消息字节数组解析为消息对象AFN=B0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeValueCommandResponse qrtvcr = new QueryRealTimeValueCommandResponse(Calendar.getInstance(), address); -// qrtvcr.setRttype(gbFrame.FRAME_CONTROL_FN); -// -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return qrtvcr; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } catch (Exception e) { -// results += "0"+ ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt))); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// qrtvcr.setResults(results); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[1] & 0x0F), data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 2 + 1], data[i * 2] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] {data[data.length - 3], data[data.length - 4] }); -// qrtvcr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] {data[data.length - 1], data[data.length - 2] }); -// qrtvcr.setStatus(status); -// -// qrtvcr.setValid(true); -// return qrtvcr; -// } -// -// /** -// * 将查询终端实时状态命令响应消息字节数组解析为消息对象AFN=5EH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeStatusCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeStatusCommandResponse qrtscr = new QueryRealTimeStatusCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// qrtscr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[3], data[2] }); -// qrtscr.setStatus(status); -// -// qrtscr.setValid(true); -// } else { -// qrtscr.setValid(false); -// } -// -// return qrtscr; -// } -// -// /** -// * 将定时自报消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToTimingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// TimingDataMessage tdm = new TimingDataMessage(Calendar.getInstance(), address); -// -// // 先处理时标 -// byte[] bt = new byte[4]; -// for (int i = 0; i < bt.length; i++) { -// bt[i] = gbFrame.FRAME_DATA_BODY[gbFrame.FRAME_DATA_BODY.length - 1 - bt.length + i]; -// } -// -// // TP中的秒分时日 -// int second = ByteUtil.bcdToInt(bt[bt.length - 4]); -// int minute = ByteUtil.bcdToInt(bt[bt.length - 3]); -// int hour = ByteUtil.bcdToInt(bt[bt.length - 2]); -// int date = ByteUtil.bcdToInt(bt[bt.length - 1]); -// -// Calendar tp = null; -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// -// if (date == tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期与当前日期相同 -// * 表示为最近的自报消息 -// * 判断是否超前 -// * 不超前即认为是正常自报或当日的补报 -// */ -// if (tp.getTimeInMillis() - tdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("定时自报消息时标超前"); // 超前半小时以上 -// logger.error("定时自报消息时标超前"); -// tdm.setValid(false); -// -// return tdm; -// } -// -// tdm.setTime(tp); -// } -// else if (date > tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期大于当前日期 -// * 表示可能为上月的补报自报消息 -// * 将月份减1 -// */ -// try { -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// else { -// /** -// * 日期小于当前日期 -// * 认为是当月的补报自报消息 -// * 月份不变 -// */ -// tdm.setTime(tp); -// } -// } catch (Exception re) { -// /** -// * 判断是否是日期为31导致的错误 -// * 将月份减1 -// */ -// try { -// tp = Calendar.getInstance(); -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// -// tdm.setTime(tp); -// tdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// tdm.setAfn(gbFrame.FRAME_DATA_AFN); -// tdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return tdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") ==false) { -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "-1" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true ) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } -// -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// tdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// tdm.setStatus(status); -// -// tdm.setValid(true); -// -// return tdm; -// } -// -// /** -// * 将随机报警消息字节数组解析为消息对象AFN=81H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToWarningMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// WarningMessage wm = new WarningMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("随机报警消息时标解析异常"); -// logger.error("随机报警消息时标解析异常"); -// wm.setValid(false); -// } -// if (tp.getTimeInMillis() - wm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("随机报警消息时标超前"); // 超前半小时以上 -// logger.error("随机报警消息时标超前"); -// wm.setValid(false); -// } else if (tpDelay != 0 -// && (wm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("随机报警消息超时"); -// logger.error("随机报警消息超时"); -// wm.setValid(false); -// } else { -// wm.setTime(tp); -// wm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// wm.setAfn(gbFrame.FRAME_DATA_AFN); -// wm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置报警状态 -// String warn = ""; -// warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// wm.setWarn(warn); -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return wm; -// case GBConstants.CTRL_DIR1_MWL:// 水位超限 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 5] & 0x0F), data[i * 4 + 4], data[i * 4 + 3], data[i * 4 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 5] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)超限 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 6] & 0x7F), data[i * 5 + 5], data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 6] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质超限 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[6], data[5], data[4], data[3], data[2] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 7; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("") == false) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// default: -// if (data.length == 4) -// break; -// else { -// wm.setValid(false); -// return wm; -// } -// } -// -// String status = ""; -// status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// wm.setStatus(status); -// wm.setValid(true); -// } -// -// return wm; -// } -// -// /** -// * 将人工置数消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSettingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// SettingDataMessage sdm = new SettingDataMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("人工置数消息时标解析异常"); -// logger.error("人工置数消息时标解析异常"); -// sdm.setValid(false); -// } -// if (tp.getTimeInMillis() - sdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("人工置数消息时标超前"); // 超前半小时以上 -// logger.error("人工置数消息时标超前"); -// sdm.setValid(false); -// } else if (tpDelay != 0 && (sdm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("人工置数消息超时"); -// logger.error("人工置数消息超时"); -// sdm.setValid(false); -// } else { -// sdm.setTime(tp); -// sdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// sdm.setAfn(gbFrame.FRAME_DATA_AFN); -// sdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return sdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 5; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("")) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// sdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// sdm.setStatus(status); -// -// sdm.setValid(true); -// } -// -// return sdm; -// } -// -// /** -// * 将设置终端IC卡有效功能命令响应消息字节数组解析为消息对象AFN=30H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableICCardCommandResponse eicccr = new EnableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// eicccr.setSuccess(true); -// } else { -// eicccr.setSuccess(false); -// } -// -// eicccr.setValid(true); -// } else { -// eicccr.setValid(false); -// } -// -// return eicccr; -// } -// -// /** -// * 将设置终端IC卡功能无效命令响应消息字节数组解析为消息对象AFN=31H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableICCardCommandResponse dicccr = new DisableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dicccr.setSuccess(true); -// } else { -// dicccr.setSuccess(false); -// } -// -// dicccr.setValid(true); -// } else { -// dicccr.setValid(false); -// } -// -// return dicccr; -// } -// -// /** -// * 将设置终端定值控制投入功能命令响应消息字节数组解析为消息对象AFN=32H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableFixedValCommandResponse efvcr = new EnableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// efvcr.setSuccess(true); -// } else { -// efvcr.setSuccess(false); -// } -// -// efvcr.setValid(true); -// } else { -// efvcr.setValid(false); -// } -// -// return efvcr; -// } -// -// /** -// * 将设置终端定值控制退出功能命令响应消息字节数组解析为消息对象AFN=33H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableFixedValCommandResponse dfvcr = new DisableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dfvcr.setSuccess(true); -// } else { -// dfvcr.setSuccess(false); -// } -// -// dfvcr.setValid(true); -// } else { -// dfvcr.setValid(false); -// } -// -// return dfvcr; -// } -// -// /** -// * 将遥控开启水泵/闸门命令响应消息字节数组解析为消息对象AFN=92H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteOpenPumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteOpenPumpCommandResponse ropcr = new RemoteOpenPumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// ropcr.setSuccess(true); -// } else { -// ropcr.setSuccess(false); -// } -// -// ropcr.setValid(true); -// } else { -// ropcr.setValid(false); -// } -// -// return ropcr; -// } -// -// /** -// * 将遥控关闭水泵/闸门命令响应消息字节数组解析为消息对象AFN=93H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteClosePumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteClosePumpCommandResponse rcpcr = new RemoteClosePumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// rcpcr.setSuccess(true); -// } else { -// rcpcr.setSuccess(false); -// } -// -// rcpcr.setValid(true); -// } else { -// rcpcr.setValid(false); -// } -// -// return rcpcr; -// } -// -// /** -// * 将复位终端参数命令响应消息字节数组解析为消息对象AFN=90H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToResetParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ResetParamCommandResponse rpcr = new ResetParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// rpcr.setSuccess(true); -// } else { -// rpcr.setSuccess(false); -// } -// -// rpcr.setValid(true); -// } else { -// rpcr.setValid(false); -// } -// -// return rpcr; -// } -// -// /** -// * 将清空终端历史数据单元命令响应消息字节数组解析为消息对象AFN=91H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToClearHistoryCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ClearHistoryCommandResponse chcr = new ClearHistoryCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x01 || data[0] == 0x02) { -// chcr.setSuccess(true); -// } else { -// chcr.setSuccess(false); -// } -// -// chcr.setValid(true); -// } else { -// chcr.setValid(false); -// } -// -// return chcr; -// } -// -// /** -// * 将查询水泵电机实时工作数据命令响应消息字节数解析为消息对象AFN=5FH -// * -// * @param message -// * @return -// */ -// private AppMessage bytesToQueryRealTimeMotoValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeMotoValueCommandResponse qrtmv = new QueryRealTimeMotoValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 12) { -// // 解析并设置A相电压 -// int vaInt = ByteUtil.binToInt(new byte[] { data[1], data[0] }); -// if (vaInt < 1000) -// qrtmv.setVoltageA(String.valueOf(vaInt)); -// else -// qrtmv.setVoltageA("0"); -// -// // 解析并设置B相电压 -// int vbInt = ByteUtil.binToInt(new byte[] { data[3], data[2] }); -// if (vbInt < 1000) -// qrtmv.setVoltageB(String.valueOf(vbInt)); -// else -// qrtmv.setVoltageB("0"); -// -// // 解析并设置C相电压 -// int vcInt = ByteUtil.binToInt(new byte[] { data[5], data[4] }); -// if (vcInt < 1000) -// qrtmv.setVoltageC(String.valueOf(vcInt)); -// else -// qrtmv.setVoltageC("0"); -// -// // 解析并设置A相电流 -// int eaInt = ByteUtil.binToInt(new byte[] { data[7], data[6] }); -// if (eaInt < 1000) -// qrtmv.setEcurrentA(String.valueOf(eaInt)); -// else -// qrtmv.setEcurrentA("0"); -// -// // 解析并设置B相电流 -// int ebInt = ByteUtil.binToInt(new byte[] { data[9], data[8] }); -// if (ebInt < 1000) -// qrtmv.setEcurrentB(String.valueOf(ebInt)); -// else -// qrtmv.setEcurrentB("0"); -// -// // 解析并设置C相电流 -// int ecInt = ByteUtil.binToInt(new byte[] { data[11], data[10] }); -// if (ecInt < 1000) -// qrtmv.setEcurrentC(String.valueOf(ecInt)); -// else -// qrtmv.setEcurrentC("0"); -// -// qrtmv.setValid(true); -// } else { -// qrtmv.setValid(false); -// } -// return qrtmv; -// } -// -// /** -// * 将查询终端事件记录命令响应消息字节数组解析为消息对象AFN=5DH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryEventRecordsCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryEventRecordsCommandResponse qprcr = new QueryEventRecordsCommandResponse(Calendar.getInstance(), address); -// Map ercs = new HashMap(); -// -// int temp = 0; -// -// // 解析并设置数据域 -// if (data.length == 64) { -// // int num = 1; -// // erc19-32备用 -// for (int j = 0; j < 19; j++) { -// temp = ByteUtil.binToInt(new byte[] { data[j * 2 + 1], data[2 * j] }); -// ercs.put("erc" + Integer.toString(j + 1), Integer.valueOf(temp)); -// // System.out.println(j+"==="+temp+"=="); -// } -// -// qprcr.setErcs(ercs); -// qprcr.setValid(true); -// -// } else { -// qprcr.setValid(false); -// } -// return qprcr; -// } -// -// /** -// * 将查询内存自报数据命令响应消息字节数组解析为消息对象AFH=B2H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryMemeryValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryMemeryValueCommandResponse qmvcr = new QueryMemeryValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// qmvcr.setValid(true); -// } else { -// qmvcr.setValid(false); -// } -// return qmvcr; -// } -// -// /** -// * 将查询终端固态存储数据命令响应消息字节数组解析为消息对象AFH=B1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryHDValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryHDValueCommandResponse qhdvcr = new QueryHDValueCommandResponse(Calendar.getInstance(), address); -// Map qhdm = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length > 9) { -// // 解析并设置参数及起止时间数据 -// String starttime = ByteUtil.bcdToString(new byte[] { data[4], data[3], data[2], data[1] }); -// String endtime = ByteUtil.bcdToString(new byte[] { data[8], data[7], data[6], data[5] }); -// if (starttime.equals("") == true || endtime.equals("") == true) { -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// Calendar start = Calendar.getInstance(); -// Calendar end = Calendar.getInstance(); -// start.set(2000 + Integer.parseInt(starttime.substring(0, 2)), -// Integer.parseInt(starttime.substring(2, 4)) - 1, -// Integer.parseInt(starttime.substring(4, 6)), -// Integer.parseInt(starttime.substring(6, 8)), 0, 0); -// end.set(2000 + Integer.parseInt(endtime.substring(0, 2)), -// Integer.parseInt(endtime.substring(2, 4)) - 1, -// Integer.parseInt(endtime.substring(4, 6)), -// Integer.parseInt(endtime.substring(6, 8)), 0, 0); -// long hour = (end.getTimeInMillis() - start.getTimeInMillis()) / (1000 * 3600); -// -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// qhdvcr.setType(type); -// qhdvcr.setNo(no); -// -// switch (type) { -// case 0: //雨量参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format((Integer.parseInt(realtime) / 10.0), "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 1: //水位参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 3] & 0x0F), data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 3] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 2: //水量参数 -// { -// int interval = (data.length - 9) / 5; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 5) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 4] & 0x7F), data[i + 3], data[i + 2], data[i + 1], data[i]}); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// // 判断剩余水量正负符号 -// Long realtimelong = Long.valueOf(0); -// if ((data[i + 4] & 0x80) == 0x80) -// realtimelong = Long.valueOf(Long.parseLong(realtime) * -1); -// else -// realtimelong = Long.valueOf(realtime); -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(realtimelong)); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 3: //流速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 2] & 0x0F), data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 2] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 4: //闸位参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 5: //功率参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 6: //气压参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 7: //风速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 8: //水温参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 10: //土壤含水率参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 11: //水压参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] { data[i + 3], data[i + 2 ], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// default://其它参数未实现 -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// qhdvcr.setValid(true); -// -// } else { -// qhdvcr.setValid(false); -// } -// return qhdvcr; -// } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //获取传感器数量 + + int offset = cmd.getOffset(); //获取湿度变量的内存地址偏移量 + offset = offset + wsct * 2 * 2 * 2; + + // 解析并存储温度值 + for (int i = 0; i < wsct; i++) { + byte[] tempValueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; + byte[] tempThresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; + + float tempValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempValueByte), 16)); //温度监测值 + float tempThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempThresholdByte), 16)); //温度报警阈值 + + rwvcr.getWd().add(tempValue); + rwvcr.getWdbjz().add(tempThreshold); + } + + // 解析并存储湿度值 + for (int i = 0; i < wsct; i++) { + byte[] humValueByte = new byte[] { data[i*8 + 2 + offset], data[i*8 + 3 + offset], data[i*8 + offset], data[i*8 + 1 + offset] }; + byte[] humThresholdByte = new byte[] { data[i*8 + 6 + offset], data[i*8 + 7 + offset], data[i*8 + 4 + offset], data[i*8 + 5 + offset] }; + + float humValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humValueByte), 16)); //湿度监测值 + float humThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humThresholdByte), 16)); //湿度报警阈值 + + rwvcr.getSd().add(humValue); + rwvcr.getSdbjz().add(humThreshold); + } + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //温湿度监测点的数量 + + // 处理温度状态 + String tempDataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 1); + char bjBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 2); + + rwsscr.getWdbj().add(bjBit == '1' ? true : false); + rwsscr.getWdldbj().add(ldBit == '1' ? true : false); + } + + // 处理湿度状态 + String humDataStr = ByteUtil.binToBinString(new byte[] { data[4], data[5] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = humDataStr.charAt(humDataStr.length() - 2 * i - 1); + char bjBit = humDataStr.charAt(humDataStr.length() - 2 * i - 2); + + rwsscr.getSdbj().add(bjBit == '1' ? true : false); + rwsscr.getSdldbj().add(ldBit == '1' ? true : false); + } + } + + return rwsscr; + } + /** * 将消息对象解析为字节数组 @@ -3507,18 +512,25 @@ frame = LinkCommandToBytes((LinkCommand) message); } - // 读取甲烷参数内存命令 - if (message instanceof ReadCH4ParamCommand) { - frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); - } else if (message instanceof ReadCH4StatusCommand) { - frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); - } - -// // 读内存命令 -// if (message instanceof FreeMessageResponse) { -// frame = freeMessageResponseToBytes((FreeMessageResponse) message); +// // 读取甲烷参数内存命令 +// if (message instanceof ReadCH4ValueCommand) { +// frame = ReadCH4ValueCommandToBytes((ReadCH4ValueCommand) message); +// } else if (message instanceof ReadCH4StatusCommand) { +// frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); // } // +// // 读取温湿度命令 +// else if (message instanceof ReadWSValueCommand) { +// frame = ReadWSValueCommandToBytes((ReadWSValueCommand) message); +// } else if (message instanceof ReadWSStatusCommand) { +// frame = ReadWSStatusCommandToBytes((ReadWSStatusCommand) message); +// } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } +// // // 写内存命令 // if (message instanceof QueryRealTimeValueCommand) { // frame = queryRealTimeValueCommandToBytes((QueryRealTimeValueCommand) message); @@ -3527,6 +539,8 @@ return frame; } + + /** * 将握手命令转换为字节数组 * @@ -3540,28 +554,12 @@ } /** - * 将读取甲烷监测值命令转换为字节数组 - * @param read - * @return - */ - private byte[] ReadCH4ParamCommandToBytes(ReadCH4ParamCommand read) { - byte[] start = ByteUtil.hexStringToBytes(read.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(read.getDestinationId(), - read.getMessageProducerId(), - read.getMemoryArea(), - start, - read.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将读取甲烷报警状态命令转换为字节数组 + * 将读取PLC内存命令转换为字节数组 + * * @param message * @return */ - private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), @@ -3569,1221 +567,78 @@ message.getMemoryArea(), start, message.getCountWord()); - + return finsFrame.toBytes(); } + /** + * 将读取甲烷监测值命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4ValueCommandToBytes(ReadCH4ValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } -// /** -// * 将退出登录命令对象转换为字节数组AFN=02H -// * -// * @param hmr -// * @return -// */ -// private byte[] logoutCommandToBytes(LogoutCommand lc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, lc.getDestinationId(), -// GBConstants.DATA_AFN_LOGIN, new byte[] { (byte) 0xF1 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置地址命令对象转换为字节数组AFN=10H -// * -// * @param message -// * @return -// */ -// private byte[] setAddressCommandToBytes(SetAddressCommand sac) { -// String address = sac.getNewAddress(); -// -// // 解析设置的新地址内容 -// byte[] add1 = ByteUtil.bcdStringToBytes(address.substring(0, 6)); -// byte[] add2 = ByteUtil.hexStringToBytes(address.substring(7, 10)); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(add1).append(add2[1]).append(add2[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sac.getDestinationId(), -// GBConstants.DATA_AFN_SETADDRESS, data.toBytes(), pw, -// sac.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询地址命令对象转换为字节数组AFN=50H -// * -// * @param message -// * @return -// */ -// private byte[] queryAddressCommandToBytes(QueryAddressCommand qac) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qac.getDestinationId(), -// GBConstants.DATA_AFN_QUERYADDRESS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置时钟命令对象转换为字节数组AFN=11H -// * -// * @param scc -// * @return -// */ -// private byte[] setClockCommandToBytes(SetClockCommand scc) { -// Calendar clock = scc.getClock(); -// -// // 解析设置的新时钟内容 -// int week = clock.get(Calendar.DAY_OF_WEEK); -// switch (week) { -// case Calendar.MONDAY: -// case Calendar.TUESDAY: -// case Calendar.WEDNESDAY: -// case Calendar.THURSDAY: -// case Calendar.FRIDAY: -// case Calendar.SATURDAY: -// week = week - 1; -// break; -// case Calendar.SUNDAY: -// week = week - 1 + 7; -// break; -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcd(clock.get(Calendar.SECOND))); // 秒 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append((byte) (ByteUtil.intToBcd(clock.get(Calendar.MONTH) + 1) | (ByteUtil -// .intToBcd(week) << 5))); // 月 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.YEAR) - 2000)); // 年 -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCLOCK, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询时钟命令对象转换为字节数组AFN=51H -// * -// * @param message -// * @return -// */ -// private byte[] queryClockCommandToBytes(QueryClockCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCLOCK); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置工作模式命令对象转换为字节数组AFN=12H -// * -// * @param message -// * @return -// */ -// private byte[] setPatternCommandToBytes(SetPatternCommand spc) { -// String newPattern = spc.getPattern(); -// if (newPattern.length() > 2) { -// newPattern = newPattern.substring(0, 2); -// } -// -// // 解析设置的新工作模式内容 -// byte[] pattern = ByteUtil.hexStringToBytes(newPattern); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(pattern); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETWORKPATTERN, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询工作模式命令对象转换为字节数组AFN=52H -// * -// * @param message -// * @return -// */ -// private byte[] queryPatternCommandToBytes(QueryPatternCommand qpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWORKPATTERN); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置自报种类及时间间隔命令对象转换为字节数组AFN=A1H -// * -// * @param message -// * @return -// */ -// private byte[] setIntervalCommandToBytes(SetIntervalCommand sic) { -// Map newIntervals = sic.getIntervals(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// Bytes di = new Bytes(); // 每种参数自报的时间间隔 -// for (int i = 0; i < SetIntervalCommand.index.length; i++) { -// String key = SetIntervalCommand.index[i]; -// if (newIntervals.containsKey(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// int val = ((Integer) newIntervals.get(key)).intValue(); -// int low = val % 100; -// int high = val / 100; -// di.append(ByteUtil.intToBcd(low)).append(ByteUtil.intToBcd(high)); -// } else { -// di.append(new byte[] { 0x00, 0x00 }); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]).append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sic.getDestinationId(), -// GBConstants.DATA_AFN_SETINTERVAL, data.toBytes(), pw, -// sic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询自报种类及时间间隔命令对象转换为字节数组AFN=53H -// * -// * @param message -// * @return -// */ -// private byte[] queryIntervalCommandToBytes(QueryIntervalCommand qic) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qic.getDestinationId(), -// GBConstants.DATA_AFN_QUERYINTERVAL); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端需查询的实时数据种类命令对象转换为字节数组AFN=A0H -// * -// * @param message -// * @return -// */ -// private byte[] setRttypesCommandToBytes(SetRttypesCommand src) { -// Set newRttypes = src.getRttypes(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// for (int i = 0; i < SetRttypesCommand.index.length; i++) { -// String key = SetRttypesCommand.index[i]; -// if (newRttypes.contains(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, src.getDestinationId(), -// GBConstants.DATA_AFN_SETRTTYPES, data.toBytes(), pw, -// src.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端需查询的实时数据种类命令对象转换为字节数组AFN=54H -// * -// * @param message -// * @return -// */ -// private byte[] queryRttypesCommandToBytes(QueryRttypesCommand qrc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYRTTYPES); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端充值量命令对象转换为字节数组AFN=15H -// * -// * @param message -// * @return -// */ -// private byte[] setChargingCommandToBytes(SetChargingCommand scc) { -// String charging = scc.getNewCharging(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(charging), 4)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCHARGING, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端充值量命令对象转换为字节数组AFN=55H -// * -// * @param message -// * @return -// */ -// private byte[] queryChargingCommandToBytes(QueryChargingCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCHARGING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端剩余水量报警值命令对象转换为字节数组AFN=16H -// * -// * @param message -// * @return -// */ -// private byte[] setWarningCommandToBytes(SetWarningCommand swc) { -// String warning = swc.getNewWarning(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(warning), 3)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swc.getDestinationId(), -// GBConstants.DATA_AFN_SETWARNING, data.toBytes(), pw, -// swc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端剩余水量报警值命令对象转换为字节数组AFN=56H -// * -// * @param message -// * @return -// */ -// private byte[] queryWarningCommandToBytes(QueryWarningCommand qwc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWARNING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水位参数命令对象转换为字节数组AFN=17H -// * -// * @param message -// * @return -// */ -// private byte[] setWlParamCommandToBytes(SetWlParamCommand swpc) { -// List> wlParams = swpc.getWlParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wlParams.size(); i++) { -// List wlp = (List) wlParams.get(i); -// -// int benchmark = (int) (((Double) wlp.get(0)).doubleValue() * 100); -// int upper = (int) (((Double) wlp.get(1)).doubleValue() * 100); -// int lower = (int) (((Double) wlp.get(2)).doubleValue() * 100); -// -// byte[] bb = ByteUtil.intToBcdsHL(Math.abs(benchmark), 3); -// if (benchmark < 0) { -// bb[2] = (byte) (bb[2] + 0x80); -// } -// byte[] ub = ByteUtil.intToBcdsHL(upper, 2); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 2); -// data.append(bb).append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERLEVELPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水位参数命令对象转换为字节数组AFN=57H -// * -// * @param message -// * @return -// */ -// private byte[] queryWlParamCommandToBytes(QueryWlParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERLEVELPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水压参数命令对象转换为字节数组AFN=18H -// * -// * @param message -// * @return -// */ -// private byte[] setWpParamCommandToBytes(SetWpParamCommand swpc) { -// List> wpParams = swpc.getWpParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wpParams.size(); i++) { -// List wpp = (List) wpParams.get(i); -// -// int upper = (int) (((Double) wpp.get(0)).doubleValue() * 100); -// int lower = (int) (((Double) wpp.get(1)).doubleValue() * 100); -// -// byte[] ub = ByteUtil.intToBcdsHL(upper, 4); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 4); -// data.append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERPRESSUREPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水压参数命令对象转换为字节数组AFN=58H -// * -// * @param message -// * @return -// */ -// private byte[] queryWpParamCommandToBytes(QueryWpParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERPRESSUREPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数上限命令对象转换为字节数组AFN=19H -// * -// * @param message -// * @return -// */ -// private byte[] setWqUpperParamCommandToBytes(SetWqUpperParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqUpperParamCommand.index.length; i++) { -// String key = SetWqUpperParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqUpperParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYUPPERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数下限命令对象转换为字节数组AFN=1AH -// * -// * @param message -// * @return -// */ -// private byte[] setWqLowerParamCommandToBytes(SetWqLowerParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqLowerParamCommand.index.length; i++) { -// String key = SetWqLowerParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqLowerParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYLOWERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数上限命令对象转换为字节数组AFN=59H -// * -// * @param message -// * @return -// */ -// private byte[] queryWqUpperParamCommandToBytes(QueryWqUpperParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数下限命令对象转换为字节数组AFN=5AH -// * -// * @param message -// * @return -// */ -// private byte[] queryWqLowerParamCommandToBytes(QueryWqLowerParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYLOWERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端流量参数命令对象转换为字节数组AFN=1FH -// * -// * @param message -// * @return -// */ -// private byte[] setWfParamCommandToBytes(SetWfParamCommand swpc) { -// List newUppers = swpc.getNewUppers(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < newUppers.size(); i++) { -// double value = ((Double) newUppers.get(i)).doubleValue(); -// int upper = (int) (Math.abs(value) * 1000); -// byte[] ub = ByteUtil.intToBcdsHL(upper, 5); -// if (value < 0) { -// ub[4] = (byte) (ub[4] + 0xF0); -// } -// data.append(ub); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERFLOWUPPERPARAM, data.toBytes(), -// pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端流量参数命令对象转换为字节数组AFN=64H -// * -// * @param message -// * @return -// */ -// private byte[] queryWfParamCommandToBytes(QueryWfParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERFLOWUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时值命令对象转换为字节数组AFN=B0H -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeValueCommandToBytes(QueryRealTimeValueCommand qrtvc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// qrtvc.getRttype(), qrtvc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMEVALUE); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水量表底值命令对象转换为字节数组AFN=1BH -// * -// * @param message -// * @return -// */ -// private byte[] setFlowInitCommandToBytes(SetFlowInitCommand sfic) { -// List inits = sfic.getNewInits(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < inits.size(); i++) { -// long init = ((Long) inits.get(i)).longValue(); -// byte[] ib = ByteUtil.intToBcdsHL(init, 5); -// data.append(ib); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfic.getDestinationId(), -// GBConstants.DATA_AFN_SETFLOWINIT, data.toBytes(), pw, -// sfic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔命令对象转换为字节数组AFN=20H -// * -// * @param message -// * @return -// */ -// private byte[] setThresholdCommandToBytes(SetThresholdCommand stc) { -// int type = stc.getType(); -// int no = stc.getNo(); -// int inter = stc.getInter(); -// double thresh = stc.getThresh(); + /** + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); // -// String noHex = ByteUtil.binToHexString(ByteUtil.intToBins(no, 1)); -// noHex = noHex.substring(noHex.length() - 1); -// String typeHex = ByteUtil.binToHexString(ByteUtil.intToBins(type, 1)); -// typeHex = typeHex.substring(typeHex.length() - 1); +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); // -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.hexStringToBytes(typeHex + noHex)); -// data.append(ByteUtil.intToBins(inter, 1)); -// byte[] threshBytes = null; -// -// // 控制域FN -// int control_fn = 0; -// -// // 判断设置检测参数的类型 -// switch (type) { -// case 0: //雨量参数 -// data.append(ByteUtil.intToBcd((int) (thresh * 10))); -// control_fn = 1; -// break; -// -// case 1: //水位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 4); -// if (thresh < 0) { -// threshBytes[3] = (byte) (threshBytes[3] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 2; -// break; -// -// case 2: //水量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh)), 5); -// if (thresh < 0) { -// threshBytes[4] = (byte) (threshBytes[4] | 0x80); -// } -// data.append(threshBytes); -// -// control_fn = 3; -// break; -// -// case 3: //流速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 3); -// if (thresh < 0) { -// threshBytes[2] = (byte) (threshBytes[2] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 4; -// break; -// -// case 4: //闸位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 5; -// break; -// -// case 5: //功率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 6; -// break; -// -// case 6: //气压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 7; -// break; -// -// case 7: //风速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 8; -// break; -// -// case 8: //水温参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 9; -// break; -// -// case 10: //土壤含水率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 11; -// break; -// -// case 11: //蒸发量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 3); -// data.append(threshBytes); -// -// control_fn = 12; -// break; -// -// case 12: //水压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 4); -// data.append(threshBytes); -// -// control_fn = 15; -// break; -// -// default: -// thresh = 0.0; -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, stc.getDestinationId(), -// GBConstants.DATA_AFN_SETTHRESHOLD, data.toBytes(), pw, -// stc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端定值量命令对象转换为字节数组AFN=34H -// * -// * @param message -// * @return -// */ -// private byte[] setFixedValueCommandToBytes(SetFixedValueCommand sfvc) { -// long fixedvalue = sfvc.getNewFixedValue(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] fb = ByteUtil.intToBcdsHL(fixedvalue, 5); -// data.append(fb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfvc.getDestinationId(), -// GBConstants.DATA_AFN_SETFIXEDVALUE, data.toBytes(), pw, -// sfvc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将修改终端密码命令对象转换为字节数组AFN=96H -// * -// * @param message -// * @return -// */ -// private byte[] setPasswordCommandToBytes(SetPasswordCommand spc) { -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] pb = ByteUtil.intToBcdsHL(spc.getNewPassword(), 2); -// data.append(pb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETPASSWORD, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时状态命令对象转换为字节数组AFN=5EH -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeStatusCommandToBytes(QueryRealTimeStatusCommand qrtsc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_QSS, qrtsc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMESTATUS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将自报响应消息转换为字节数组 自报消息通用响应 -// * -// * @param message -// * @return -// */ -// private byte[] freeMessageResponseToBytes(FreeMessageResponse fmr) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, fmr.getFcb(), -// fmr.getType(), fmr.getDestinationId(), -// fmr.getAfn(), new byte[] { 0x00 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能有效命令转换为字节数组AFN=30H -// * -// * @param message -// * @return -// */ -// private byte[] enableICCardCommandToBytes(EnableICCardCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEICCARD, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能无效命令转换为字节数组AFN=31H -// * -// * @param message -// * @return -// */ -// private byte[] disableICCardCommandToBytes(DisableICCardCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEICCARD, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制投入功能命令转换为字节数组AFN=32H -// * -// * @param message -// * @return -// */ -// private byte[] enableFixedValCommandToBytes(EnableFixedValCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEFIXEDVAL, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制退出功能命令转换为字节数组AFN=33H -// * -// * @param message -// * @return -// */ -// private byte[] disableFixedValCommandToBytes(DisableFixedValCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEFIXEDVAL, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控开启水泵/闸门命令转换为字节数组AFN=92H -// * -// * @param message -// * @return -// */ -// private byte[] remoteOpenPumpCommandToBytes(RemoteOpenPumpCommand ropc) { -// byte[] data = ByteUtil.hexStringToBytes(ropc.getPump() + ropc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, ropc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTEOPENPUMP, data, pw, ropc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控关闭水泵/闸门命令转换为字节数组AFN=93H -// * -// * @param message -// * @return -// */ -// private byte[] remoteClosePumpCommandToBytes(RemoteClosePumpCommand rcpc) { -// byte[] data = ByteUtil.hexStringToBytes(rcpc.getPump() + rcpc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rcpc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTECLOSEPUMP, data, pw, rcpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将复位终端参数命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] resetParamCommandToBytes(ResetParamCommand rpc) { -// byte[] data = ByteUtil.hexStringToBytes(rpc.getReset(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rpc.getDestinationId(), -// GBConstants.DATA_AFN_RESETPARAM, data, pw, rpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将清空历史数据单元命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] clearHistoryCommandToBytes(ClearHistoryCommand chc) { -// byte[] data = ByteUtil.hexStringToBytes(chc.getClear(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, chc.getDestinationId(), -// GBConstants.DATA_AFN_CLEARHISTORY, data, pw, chc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询水泵电机实时工作数据的命令转换为字节数组AFN=5FH -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryRealTimeMotoValueCommandToBytes( -// QueryRealTimeMotoValueCommand qrtmv) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrtmv.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEMOTOSS); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端事件记录的命令转换为字节数组5DH -// * -// * @param message -// * @return -// */ -// private byte[] queryEventRecordsCommandToBytes(QueryEventRecordsCommand qerc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEVENTREC); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询内存自报数据的命令转换为字节数组B2H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryMemeryValueCommandToBytes(QueryMemeryValueCommand qerc) { -// Calendar bclock = qerc.getBdate(); -// Calendar eclock = qerc.getEdate(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYMEMERYVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询固态存储数据的命令转换为字节数组B1H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryHDValueCommandToBytes(QueryHDValueCommand qhdc) { -// int type = qhdc.getType(); -// int no = qhdc.getNo(); -// Calendar sclock = qhdc.getSclock(); -// Calendar eclock = qhdc.getEclock(); -// -// int i = type * 16 + no; -// -// int control_fn = GBConstants.CTRL_DIR0_QACC; -// if (type == 0) //查询雨量参数 -// control_fn = GBConstants.CTRL_DIR0_QRF; -// else if (type == 1) //查询水位参数 -// control_fn = GBConstants.CTRL_DIR0_QWL; -// else if (type == 2) //查询水量参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 3) //查询流速参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 4) //查询闸位参数 -// control_fn = GBConstants.CTRL_DIR0_QBC; -// else if (type == 5) //查询功率参数 -// control_fn = GBConstants.CTRL_DIR0_QPW; -// else if (type == 6) //查询气压参数 -// control_fn = GBConstants.CTRL_DIR0_QAP; -// else if (type == 7) //查询风速参数 -// control_fn = GBConstants.CTRL_DIR0_QWS; -// else if (type == 8) //查询水温参数 -// control_fn = GBConstants.CTRL_DIR0_QWT; -// else if (type == 9) //查询水质参数 -// control_fn = GBConstants.CTRL_DIR0_QWQ; -// else if (type == 10) //查询土壤含水率参数 -// control_fn = GBConstants.CTRL_DIR0_QSA; -// else if (type == 11) //查询水压参数 -// control_fn = GBConstants.CTRL_DIR0_QHP; -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBins(i, 1)); -// -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.YEAR))); // 年 -// -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.YEAR))); // 年 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, qhdc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYHARDDISCVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// -// /** -// * 从重叠消息中提取规范消息 -// */ -// public List extractByteMessage(byte[] byteMessage) { -// List bytesList = new ArrayList(); -// -// try { -// int i = 0; -// while (i < byteMessage.length) { -// if ((byteMessage[i] == GBByteFrame.FRAME_HEAD) && (byteMessage[i + 2] == GBByteFrame.FRAME_HEAD)) { -// int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 1]}); -// if (i + length + 5 <= byteMessage.length && byteMessage[i + length + 4] == GBByteFrame.FRAME_END) { -// Bytes bytes = new Bytes(); -// bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]); -// for (int j = 0; j < length + 2; j++) { -// bytes.append(byteMessage[i + 3 + j]); -// } -// -// i = i + length + 5; -// bytesList.add(bytes.toBytes()); -// } else { -// i++; -// } -// } else { -// i++; -// } -// } -// } catch (Exception e) { -// bytesList.clear(); -// bytesList.add(byteMessage); -// return bytesList; -// } -// -// return bytesList; +// return finsFrame.toBytes(); // } + /** + * 将读取温湿度监测值命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSValueCommandToBytes(ReadWSValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + + /** + * 将读取温湿度报警状态命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSStatusCommandToBytes(ReadWSStatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + } diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java deleted file mode 100644 index 3570a07..0000000 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.szpg.task; - -import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; -import com.szpg.db.data.PgAcuRdcmd; -import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; - -public class ReadCH4ParamTask implements Runnable { - - private ACUClient client; - private AppCommand appCommand; - - public ReadCH4ParamTask(ACUClient client, AppCommand command) { - this.client = client; - this.appCommand = command; - } - - @Override - public void run() { - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(appCommand); - - // 发送读取甲烷参数内存命令 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - ReadCH4ParamCommand ch4Cmd = (ReadCH4ParamCommand) appCommand; - - // 发送完成之后将命令保存在数据库中 - PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(ch4Cmd.getCommandType()); - cmd.setDest(ch4Cmd.getDestinationId()); - cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); - cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); - cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCountWord()); - cmd.setCount_bit(ch4Cmd.getCountBit()); - - new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); - } - -} diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 196d7e3..11b33b4 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -41,6 +41,7 @@ cmd.setStart_mem_bit(ch4AlmCmd.getStartAddress().substring(4)); cmd.setCount_word(ch4AlmCmd.getCountWord()); cmd.setCount_bit(ch4AlmCmd.getCountBit()); + cmd.setCount_sensor(ch4AlmCmd.getCountSensor()); new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); } diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java new file mode 100644 index 0000000..73d957f --- /dev/null +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -0,0 +1,49 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadCH4ValueTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadCH4ValueTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取甲烷参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadCH4ValueCommand ch4Cmd = (ReadCH4ValueCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setId(ch4Cmd.getId()); + cmd.setTm(ch4Cmd.getTime().getTime()); + cmd.setCmd_type(ch4Cmd.getCommandType()); + cmd.setDest(ch4Cmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); + cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); + cmd.setCount_word(ch4Cmd.getCountWord()); + cmd.setCount_bit(ch4Cmd.getCountBit()); + cmd.setCount_sensor(ch4Cmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadWSStatusTask.java b/src/com/szpg/task/ReadWSStatusTask.java new file mode 100644 index 0000000..94506d4 --- /dev/null +++ b/src/com/szpg/task/ReadWSStatusTask.java @@ -0,0 +1,49 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadWSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadWSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取温湿度参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadWSStatusCommand wsAlmCmd = (ReadWSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setId(wsAlmCmd.getId()); + cmd.setTm(wsAlmCmd.getTime().getTime()); + cmd.setCmd_type(wsAlmCmd.getCommandType()); + cmd.setDest(wsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(wsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(wsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(wsAlmCmd.getCountWord()); + cmd.setCount_bit(wsAlmCmd.getCountBit()); + cmd.setCount_sensor(wsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index 12a50a2..d938543 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -17,7 +17,8 @@ #\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf YXL.ACU001.WS.COUNT = 6 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 -YXL.ACU001.WS.START = 0400 +YXL.ACU001.WD.START = 0400 +YXL.ACU001.SD.OFFSET = 52 #\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 YXL.ACU001.WS.WORDCOUNT = 74 #\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 46e331c..de29fb8 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -13,7 +13,9 @@ import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; -import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4ValueTask; +import com.szpg.task.ReadWSStatusTask; +import com.szpg.task.ReadWSValueTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -38,9 +40,13 @@ // dsc.testSendCH4Command(client); // 测试发送查询甲烷报警状态命令 - dsc.testSendCH4StatsuCommand(client); +// dsc.testSendCH4StatsuCommand(client); -// System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); + // 测试发送查询温湿度监测值命令 +// dsc.testSendWSCommand(client); + + // 测试发送查询温湿度报警状态命令 + dsc.testSendWSStatusCommand(client); } /** @@ -49,7 +55,7 @@ * @param client */ public void testSendCH4Command(ACUClient client) { - ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4VALUE); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -64,9 +70,10 @@ ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); ch4.setCountBit(0); //读取监测值时位数量无效 + ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } @@ -74,7 +81,7 @@ * 发送查询甲烷报警状态命令 * @param client */ - public void testSendCH4StatsuCommand(ACUClient client) { + public void testSendCH4StatusCommand(ACUClient client) { ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + @@ -90,9 +97,66 @@ ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } + + /** + * 发送查询温湿度监测值命令 + * + * @param client + */ + public void testSendWSCommand(ACUClient client) { + ReadMemoryCommand ws = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSVALUE); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ws.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ws.setDestinationId(dest); + + ws.setMemoryArea(FINSConstants.MEMORY_DM_AREA); + + ws.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WD.START")), 2)) + "00"); + ws.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.WORDCOUNT"))); + ws.setCountBit(0); //读取监测值时位数量无效 + ws.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询温湿度报警状态命令 + * @param client + */ + public void testSendWSStatusCommand(ACUClient client) { + ReadMemoryCommand wsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READWSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + wsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + wsalm.setDestinationId(dest); + + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); + wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); + wsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.BITCOUNT"))); + wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index d99c991..70fb6dc 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -13,4 +13,5 @@ public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); + public int deleteCmdRecord(String cmdId); } diff --git a/src/com/szpg/db/dao/PgDeviceDao.java b/src/com/szpg/db/dao/PgDeviceDao.java index 0e98558..5eb42b5 100644 --- a/src/com/szpg/db/dao/PgDeviceDao.java +++ b/src/com/szpg/db/dao/PgDeviceDao.java @@ -5,4 +5,5 @@ public interface PgDeviceDao { public List findCH4DeviceIdByDest(String dest); + public List findWSDeviceIdByDest(String dest); } diff --git a/src/com/szpg/db/dao/PgWsDao.java b/src/com/szpg/db/dao/PgWsDao.java new file mode 100644 index 0000000..b7b93e2 --- /dev/null +++ b/src/com/szpg/db/dao/PgWsDao.java @@ -0,0 +1,35 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; + +/** + * 温湿度相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgWsDao { + + /******** 温湿度监测值 ********/ + public List findAllWsdz(); + public PgTemphum findWsdzById(Integer id); + + public List findWsdzByDevice(Integer deviceid); + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdzRecord(PgTemphum wsdz); + public int addWsdzRecord(float temp, float hum, String tm, int deviceid); + + + /******** 温湿度报警状态 ********/ + public List findAllWsdbj(); + public PgTemphumAlm findWsdbjById(Integer id); + + public List findWsdbjByDevice(Integer deviceid); + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end); + + public int addWsdbjRecord(PgTemphumAlm wsalm); + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index 3c7e9e3..b693939 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[9]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, COUNT_SENSOR, OFFSET, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[11]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -132,6 +132,8 @@ params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); params[8] = cmd.getCount_bit(); + params[9] = cmd.getCount_sensor(); + params[10] = null == cmd.getOffset() ? 0 : cmd.getOffset(); try { conn = ConnectionManager.getConnectionFromC3P0(); @@ -191,4 +193,37 @@ return 0; } + @Override + public int deleteCmdRecord(String cmdId) { + Connection conn = null; + + String updateStr = "DELETE FROM PG_ACU_RDCMD WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = cmdId; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, updateStr, param); + + if (count > 0) + logger.debug("删除读取命令成功" + cmdId); + else + logger.error("删除读取命令失败!"); + + return count; + } catch (Exception ex) { + logger.error("删除读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + } diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 34be80b..5bffb41 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -21,7 +21,45 @@ public List findCH4DeviceIdByDest(String dest) { Connection conn = null; - String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? ORDER BY D.ID"; + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%甲烷%' ORDER BY D.ID"; + Object[] param = new Object[1]; + param[0] = dest; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ColumnListHandler(), param); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据ACU的目的地址查询甲烷设备ID成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + list.add(((Number) tempList.get(i)).intValue()); + } + + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ACU的目的地址查询甲烷设备ID异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWSDeviceIdByDest(String dest) { + Connection conn = null; + + String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '%温湿度%' ORDER BY D.ID"; Object[] param = new Object[1]; param[0] = dest; try { diff --git a/src/com/szpg/db/dao/impl/PgWsDaoImpl.java b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java new file mode 100644 index 0000000..c3f2d12 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgWsDaoImpl.java @@ -0,0 +1,512 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.data.PgTemphum; +import com.szpg.db.data.PgTemphumAlm; +import com.szpg.db.util.ConnectionManager; +import com.szpg.util.NumberFormat; + +public class PgWsDaoImpl implements PgWsDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllWsdz() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphum findWsdzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(0); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度监测值成功" + ws + "]"); + + return ws; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMP, HUM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度监测值成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphum ws = new PgTemphum(); + Object[] item = tempList.get(i); + + ws.setId(((Number) item[0]).intValue()); + ws.setTemp(Float.parseFloat((String) item[1])); + ws.setHum(Float.parseFloat((String) item[2])); + ws.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ws.setLogtime(cal.getTime()); + ws.setUptime(cal.getTime()); + + list.add(ws); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdzRecord(PgTemphum ws) { + return addWsdzRecord(ws.getTemp(), ws.getHum(), ws.getTmStr(), ws.getPgdeviceid()); + } + + @Override + public int addWsdzRecord(float temp, float hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM " + + "(TEMP, HUM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = NumberFormat.format(temp, "0.00"); + params[1] = NumberFormat.format(hum, "0.00"); + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度监测值成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度监测值失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度监测值异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + + @Override + public List findAllWsdbj() { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgTemphumAlm findWsdbjById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(0); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询温湿度报警状态成功" + wsalm + "]"); + + return wsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findWsdbjByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, TEMPALM, HUMALM, LOGTIME, PGDEVICEID FROM PG_TEMPHUM_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询温湿度报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgTemphumAlm wsalm = new PgTemphumAlm(); + Object[] item = tempList.get(i); + + wsalm.setId(((Number) item[0]).intValue()); + wsalm.setTempalm(Boolean.parseBoolean((String) item[1])); + wsalm.setHumalm(Boolean.parseBoolean((String) item[2])); + wsalm.setPgdeviceid(((Number) item[4]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[3]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + wsalm.setLogtime(cal.getTime()); + wsalm.setUptime(cal.getTime()); + + list.add(wsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addWsdbjRecord(PgTemphumAlm wsalm) { + return addWsdbjRecord(wsalm.getTempalm(), wsalm.getHumalm(), wsalm.getTmStr(), wsalm.getPgdeviceid()); + } + + @Override + public int addWsdbjRecord(boolean temp, boolean hum, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_TEMPHUM_ALM " + + "(TEMPALM, HUMALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, ?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[5]; + params[0] = temp; + params[1] = hum; + params[2] = tm; + params[3] = tm; + params[4] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入温湿度报警状态成功[tm=" + tm + ", temp=" + temp + ", hum=" + hum + ", deviceid=" + deviceid + "]"); + else + logger.error("插入温湿度报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入温湿度报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index 095bbb8..f4ecfe5 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -15,7 +15,7 @@ /** * */ - private static final long serialVersionUID = -605179003596292814L; + private static final long serialVersionUID = -5939933737665384417L; private String id; // ID private Date tm; // 命令发送时间 @@ -26,6 +26,8 @@ private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 private Integer count_bit; //读取的位数量 + private Integer count_sensor; //传感器数量 + private Integer offset; //变量之间的偏移量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -101,6 +103,22 @@ this.count_bit = count_bit; } + public Integer getCount_sensor() { + return count_sensor; + } + + public void setCount_sensor(Integer count_sensor) { + this.count_sensor = count_sensor; + } + + public Integer getOffset() { + return offset; + } + + public void setOffset(Integer offset) { + this.offset = offset; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4.java b/src/com/szpg/db/data/PgCh4.java index d271acd..a13f5b6 100644 --- a/src/com/szpg/db/data/PgCh4.java +++ b/src/com/szpg/db/data/PgCh4.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4 + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java index 392a567..6c3302c 100644 --- a/src/com/szpg/db/data/PgCh4Alm.java +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -55,6 +55,14 @@ this.uptime = uptime; } + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + public void setTm(Date tm) { this.logtime = tm; this.uptime = tm; @@ -76,14 +84,6 @@ } } - public Integer getPgdeviceid() { - return pgdeviceid; - } - - public void setPgdeviceid(Integer pgdeviceid) { - this.pgdeviceid = pgdeviceid; - } - @Override public String toString() { return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; diff --git a/src/com/szpg/db/data/PgTemphum.java b/src/com/szpg/db/data/PgTemphum.java new file mode 100644 index 0000000..21045b6 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphum.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphum implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -7715056787429107538L; + + private Integer id; + private Float hum; + private Float temp; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Float getHum() { + return hum; + } + + public void setHum(Float hum) { + this.hum = hum; + } + + public Float getTemp() { + return temp; + } + + public void setTemp(Float temp) { + this.temp = temp; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + hum + ", temp=" + temp + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgTemphumAlm.java b/src/com/szpg/db/data/PgTemphumAlm.java new file mode 100644 index 0000000..5f230f2 --- /dev/null +++ b/src/com/szpg/db/data/PgTemphumAlm.java @@ -0,0 +1,95 @@ +package com.szpg.db.data; + +import java.io.Serializable; +import java.util.Date; + +import com.szpg.util.TimeFormat; + +public class PgTemphumAlm implements Serializable { + + /** + * + */ + private static final long serialVersionUID = 3941256870587343705L; + + private Integer id; + private Boolean tempalm; + private Boolean humalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getTempalm() { + return tempalm; + } + + public void setTempalm(Boolean tempalm) { + this.tempalm = tempalm; + } + + public Boolean getHumalm() { + return humalm; + } + + public void setHumalm(Boolean humalm) { + this.humalm = humalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgTemphum[hum=" + humalm + ", temp=" + tempalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 8422d1b..a98abdb 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -47,12 +47,12 @@ assertEquals(1, dao.addCmdRecord(cmd)); } - @Test +// @Test public void testFindAll() { assertEquals(1, dao.findAll().size()); } - @Test +// @Test public void testFindByDestAndCount() { assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } @@ -61,4 +61,9 @@ public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } + + @Test + public void testDelete() { + assertEquals(1, dao.deleteCmdRecord("2bf5c26175814b17bb043b1f86515892")); + } } diff --git a/src/com/szpg/db/test/PgWSDaoTest.java b/src/com/szpg/db/test/PgWSDaoTest.java new file mode 100644 index 0000000..9b92b1a --- /dev/null +++ b/src/com/szpg/db/test/PgWSDaoTest.java @@ -0,0 +1,54 @@ +package com.szpg.db.test; + +import static org.junit.Assert.assertEquals; + +import java.util.Calendar; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.util.TimeFormat; + +public class PgWSDaoTest { + + private PgWsDao dao; + + @Before + public void setUp() throws Exception { + dao = new PgWsDaoImpl(); + } + +// @Test + public void testAddParamRecord() { + assertEquals(1, dao.addWsdzRecord((float) 35.5, (float) 63.3, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllParam() { + assertEquals("20180116163234", dao.findAllWsdz().get(0).getTmStrGB()); + } + + @Test + public void testFindParamById() { + Assert.assertEquals(dao.findWsdzById(2).getTmStrGB(), "20180116163234"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(1, dao.addWsdbjRecord(false, false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 7)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180116163233", dao.findAllWsdbj().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findWsdbjById(2).getTmStrGB(), "20180116163233"); + } + +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index e0dee1d..21c33d7 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -3,6 +3,8 @@ public class AppMessageConstants { /******** 命令类型 ********/ - public final static String CMD_TYPE_READCH4PARAM = "11"; + public final static String CMD_TYPE_READCH4VALUE = "11"; public final static String CMD_TYPE_READCH4STATUS = "12"; + public final static String CMD_TYPE_READWSVALUE = "13"; + public final static String CMD_TYPE_READWSSTATUS = "14"; } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 15ccc72..36e94c9 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -2,7 +2,9 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -16,6 +18,8 @@ private String startAddress; //起始地址 private int countWord; //读取的字数量/1WORD=2BYTE private int countBit; //读取的位数量 + private int countSensor; //传感器数量 + private int offset; //变量内存地址之间的偏移量 public byte getMemoryArea() { return memoryArea; @@ -49,13 +53,33 @@ this.countBit = countBit; } + public int getCountSensor() { + return countSensor; + } + + public void setCountSensor(int countSensor) { + this.countSensor = countSensor; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + public static ReadMemoryCommand getInstance(String type) { switch (type) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - return new ReadCH4ParamCommand(); - + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + return new ReadCH4ValueCommand(); case AppMessageConstants.CMD_TYPE_READCH4STATUS: return new ReadCH4StatusCommand(); + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + return new ReadWSValueCommand(); + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + return new ReadWSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java deleted file mode 100644 index 5b573f5..0000000 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.szpg.plc.message.command.read; - -import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.ReadMemoryCommand; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; - -public class ReadCH4ParamCommand extends ReadMemoryCommand { - - /** - * - */ - private static final long serialVersionUID = -4042536900405234254L; - - @Override - public Class getResponseClass() { - return ReadCH4ParamCommandResponse.class; - } - - @Override - public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; - } - - @Override - public String getCommandType() { - return AppMessageConstants.CMD_TYPE_READCH4PARAM; - } - -} diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java new file mode 100644 index 0000000..79fb9cb --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4ValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; + +public class ReadCH4ValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -4042536900405234254L; + + @Override + public Class getResponseClass() { + return ReadCH4ValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4VALUE; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java new file mode 100644 index 0000000..2f114d6 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; + +public class ReadWSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 7832108805685215529L; + + @Override + public Class getResponseClass() { + return ReadWSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java new file mode 100644 index 0000000..beacfa5 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadWSValueCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; + +public class ReadWSValueCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 3051868021937132489L; + + @Override + public Class getResponseClass() { + return ReadWSValueCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询温湿度监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READWSVALUE; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java deleted file mode 100644 index 3288409..0000000 --- a/src/com/szpg/plc/message/response/read/ReadCH4ParamCommandResponse.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.szpg.plc.message.response.read; - -import java.util.ArrayList; -import java.util.List; - -import com.szpg.db.dao.PgCh4Dao; -import com.szpg.db.dao.PgDeviceDao; -import com.szpg.db.dao.impl.PgCh4DaoImpl; -import com.szpg.db.dao.impl.PgDeviceDaoImpl; -import com.szpg.plc.message.response.ReadMemoryCommandResponse; -import com.szpg.util.TimeFormat; - -public class ReadCH4ParamCommandResponse extends ReadMemoryCommandResponse { - - /** - * - */ - private static final long serialVersionUID = 6615138314462518854L; - - private List jwnd; //甲烷浓度值 - private List jwldbjz; //甲烷联动报警值 - - public ReadCH4ParamCommandResponse() { - jwnd = new ArrayList(); - jwldbjz = new ArrayList(); - } - - public List getJwnd() { - return jwnd; - } - - public void setJwnd(List jwnd) { - this.jwnd = jwnd; - } - - public List getJwldbjz() { - return jwldbjz; - } - - public void setJwldbjz(List jwldbjz) { - this.jwldbjz = jwldbjz; - } - - @Override - public void afterAction() { - // 1将甲烷浓度数据存入数据库 - PgCh4Dao ch4Dao = new PgCh4DaoImpl(); - PgDeviceDao deviceDao = new PgDeviceDaoImpl(); - - List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); - - for (int i = 0; i < jwnd.size(); i++) { - if (i < ids.size()) { - ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); - } - } - } - -} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java new file mode 100644 index 0000000..b92912b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4ValueCommandResponse.java @@ -0,0 +1,59 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4ValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 6615138314462518854L; + + private List jwnd; //甲烷浓度值 + private List jwldbjz; //甲烷联动报警值 + + public ReadCH4ValueCommandResponse() { + jwnd = new ArrayList(); + jwldbjz = new ArrayList(); + } + + public List getJwnd() { + return jwnd; + } + + public void setJwnd(List jwnd) { + this.jwnd = jwnd; + } + + public List getJwldbjz() { + return jwldbjz; + } + + public void setJwldbjz(List jwldbjz) { + this.jwldbjz = jwldbjz; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwnd.size(); i++) { + if (i < ids.size()) { + ch4Dao.addPblzRecord(jwnd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java new file mode 100644 index 0000000..99c4f57 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSStatusCommandResponse.java @@ -0,0 +1,96 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 2256619329720969351L; + + private List wdbj; // 温度报警状态 + private List sdbj; // 湿度报警状态 + private List wdldbj; // 温度是否联动报警 + private List sdldbj; // 湿度是否联动报警 + + public ReadWSStatusCommandResponse() { + wdbj = new ArrayList(); + sdbj = new ArrayList(); + wdldbj = new ArrayList(); + sdldbj = new ArrayList(); + } + + public List getWdbj() { + return wdbj; + } + + public void setWdbj(List wdbj) { + this.wdbj = wdbj; + } + + public List getSdbj() { + return sdbj; + } + + public void setSdbj(List sdbj) { + this.sdbj = sdbj; + } + + public List getWdldbj() { + return wdldbj; + } + + public void setWdldbj(List wdldbj) { + this.wdldbj = wdldbj; + } + + public List getSdldbj() { + return sdldbj; + } + + public void setSdldbj(List sdldbj) { + this.sdldbj = sdldbj; + } + + @Override + public void afterAction() { + // 1将温湿度报警状态存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wdbj.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (wdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + + if (sdbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java new file mode 100644 index 0000000..ffdb6d1 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -0,0 +1,79 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.PgWsDao; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.db.dao.impl.PgWsDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadWSValueCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 1427194192669696325L; + + private List wd; //温度监测值 + private List sd; //湿度监测值 + private List wdbjz; //温度报警阈值 + private List sdbjz; //湿度报警阈值 + + public ReadWSValueCommandResponse() { + wd = new ArrayList(); + sd = new ArrayList(); + wdbjz = new ArrayList(); + sdbjz = new ArrayList(); + } + + public List getWd() { + return wd; + } + + public void setWd(List wd) { + this.wd = wd; + } + + public List getSd() { + return sd; + } + + public void setSd(List sd) { + this.sd = sd; + } + + public List getWdbjz() { + return wdbjz; + } + + public void setWdbjz(List wdbjz) { + this.wdbjz = wdbjz; + } + + public List getSdbjz() { + return sdbjz; + } + + public void setSdbjz(List sdbjz) { + this.sdbjz = sdbjz; + } + + @Override + public void afterAction() { + // 1将温湿度监测值数据存入数据库 + PgWsDao wsDao = new PgWsDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findWSDeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < wd.size(); i++) { + if (i < ids.size()) { + wsDao.addWsdzRecord(wd.get(i), sd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 12d1c18..736bc18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -13,11 +13,12 @@ import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.message.command.read.ReadCH4StatusCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.response.LinkCommandResponse; -import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; +import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; +import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -123,17 +124,25 @@ // 3根据参数类型调用相应的方法进行解析 switch(commandType) { - case AppMessageConstants.CMD_TYPE_READCH4PARAM: - received = bytesToReadCH4ParamCommand(finsFrame); + case AppMessageConstants.CMD_TYPE_READCH4VALUE: + received = bytesToReadCH4ValueCommandResponse(finsFrame, readCmd); break; case AppMessageConstants.CMD_TYPE_READCH4STATUS: - received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + received = bytesToReadCH4StatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSVALUE: + received = bytesToReadWSValueCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READWSSTATUS: + received = bytesToReadWSStatusCommandResponse(finsFrame, readCmd); break; } - // 4将有效的命令的是否有响应字段置1 - readCmdDao.updateCmdRecordResponsed(readCmd.getId()); + // 4将已响应的命令删除 + readCmdDao.deleteCmdRecord(readCmd.getId()); } } else if (commandCode.equalsIgnoreCase("0102")) { @@ -320,6 +329,7 @@ } + /** * 将握手响应字节数组转换为消息对象 * @@ -352,15 +362,15 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4ParamCommand(FINSByteFrame finsFrame) { - ReadCH4ParamCommandResponse rcpcr = new ReadCH4ParamCommandResponse(); + private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadCH4ValueCommandResponse rcpcr = new ReadCH4ValueCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; rcpcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = data.length / (2 * 2 * 2); //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占2个字,每个字占2个字节 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 for (int i = 0; i < chct; i++) { byte[] valueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; byte[] thresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; @@ -383,7 +393,7 @@ * @param byteMessage * @return */ - private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); byte[] body = finsFrame.TEXT_DATA_BODY; @@ -391,7 +401,7 @@ if (body[2] == 0x00 && body[3] == 0x00) { // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 - int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + int chct = cmd.getCount_sensor(); //甲烷监测点的数量 String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); @@ -401,3097 +411,92 @@ rcscr.getJwldbj().add(ldBit == '1' ? true : false); } } - + return rcscr; } -// -// /** -// * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryAddressResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryAddressCommandResponse qacr = new QueryAddressCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String addressRes = ByteUtil.bcdToString(new byte[] { data[0], data[1], data[2] }) + -// ByteUtil.binToHexString(new byte[] { data[4], data[3] }); -// if (addressRes.length() == 10) { -// qacr.setValid(true); -// qacr.setAddress(addressRes); -// } else { -// logger.error("查询终端地址响应消息解析错误"); -// qacr.setValid(false); -// } -// } else { -// logger.error("查询终端地址响应消息长度错误"); -// qacr.setValid(false); -// } -// -// return qacr; -// } -// -// /** -// * 将设置终端时钟响应消息字节数组解析为消息对象AFN=11H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetClockCommandResponse sccr = new SetClockCommandResponse(Calendar.getInstance(), address); -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// try { -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// sccr.setValid(false); -// return sccr; -// } catch (Exception re) { -// logger.error("时间字段解析异常"); -// sccr.setValid(false); -// return sccr; -// } -// -// sccr.setNewClock(clock); -// -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端时钟响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端时钟响应消息字节数组解析为消息对象AFN=51H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryClockCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryClockCommandResponse qccr = new QueryClockCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 6) { -// Calendar clock = Calendar.getInstance(); -// -// clock.setLenient(false); -// -// clock.set(Calendar.SECOND, ByteUtil.bcdToInt(data[0])); -// clock.set(Calendar.MINUTE, ByteUtil.bcdToInt(data[1])); -// clock.set(Calendar.HOUR_OF_DAY, ByteUtil.bcdToInt(data[2])); -// clock.set(Calendar.DAY_OF_MONTH, ByteUtil.bcdToInt(data[3])); -// clock.set(Calendar.MONTH, ByteUtil.bcdToInt((byte) (data[4] & 0x1F)) - 1); -// clock.set(Calendar.YEAR, ByteUtil.bcdToInt(data[5]) + 2000); -// -// try { -// clock.getTime(); -// } catch (IllegalArgumentException ex) { -// logger.error("时间字段超出范围"); -// qccr.setValid(false); -// return qccr; -// } -// -// qccr.setClock(clock); -// qccr.setValid(true); -// } else { -// logger.error("查询终端时钟响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端工作模式响应消息字节数组解析为消息对象AFN=12H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPatternCommandResponse spcr = new SetPatternCommandResponse(Calendar.getInstance(), address); -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setWorkPattern(patternRes); -// } else { -// logger.error("设置终端工作模式响应消息长度错误"); -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端工作模式响应消息字节数组解析为消息对象AFN=52H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryPatternCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryPatternCommandResponse qpcr = new QueryPatternCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// String patternRes = ByteUtil.binToHexString(data); -// -// qpcr.setValid(true); -// qpcr.setWorkPattern(patternRes); -// } else { -// logger.error("查询终端工作模式响应消息长度错误"); -// qpcr.setValid(false); -// } -// -// return qpcr; -// } -// -// /** -// * 将设置终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=A1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetIntervalCommandResponse sicr = new SetIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// sicr.setValid(true); -// sicr.setIntervals(intervals); -// -// sicr.setValid(true); -// sicr.setSuccess(true); -// } else { -// logger.error("设置终端自报种类及时间间隔响应消息长度错误"); -// sicr.setValid(false); -// } -// -// return sicr; -// } -// -// /** -// * 将查询终端自报种类及时间间隔响应消息字节数组解析为消息对象AFN=53H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryIntervalCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryIntervalCommandResponse qicr = new QueryIntervalCommandResponse(Calendar.getInstance(), address); -// Map intervals = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length == 30) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(2); // D15D14备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// intervals.put(QueryIntervalCommandResponse.index[i], Integer.valueOf((int) ByteUtil.bcdToLong(new byte[] { data[2 * (i + 1) + 1], data[2 * (i + 1)] }))); -// } -// } -// -// qicr.setValid(true); -// qicr.setIntervals(intervals); -// } else { -// logger.error("查询终端自报种类及时间间隔响应消息长度错误"); -// qicr.setValid(false); -// } -// -// return qicr; -// } -// -// /** -// * 将设置终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=A0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetRttypesCommandResponse srcr = new SetRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// srcr.setRttypes(rttypes); -// -// srcr.setValid(true); -// srcr.setSuccess(true); -// } else { -// logger.error("设置终端需查询的实时数据种类响应消息长度错误"); -// srcr.setValid(false); -// } -// -// return srcr; -// } -// -// /** -// * 将查询终端需查询的实时数据种类响应消息字节数组解析为消息对象AFN=54H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRttypesCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRttypesCommandResponse qrcr = new QueryRttypesCommandResponse(Calendar.getInstance(), address); -// Set rttypes = new HashSet(); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// String bin = ByteUtil.binToBinString(new byte[] { data[1], data[0] }).substring(1); // D15备用 -// int len = bin.length(); -// for (int i = 0; i < len; i++) { -// if (bin.substring(len - 1 - i, len - i).equals("1")) { -// rttypes.add(QueryRttypesCommandResponse.index[i]); -// } -// } -// -// qrcr.setValid(true); -// qrcr.setRttypes(rttypes); -// } else { -// logger.error("查询终端需查询的实时数据种类响应消息长度错误"); -// qrcr.setValid(false); -// } -// -// return qrcr; -// } -// -// /** -// * 将设置终端充值量响应消息字节数组解析为消息对象AFN=15H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetChargingCommandResponse sccr = new SetChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// -// sccr.setCharging(Integer.parseInt(charging)); -// sccr.setValid(true); -// sccr.setSuccess(true); -// } else { -// logger.error("设置终端充值量响应消息长度错误"); -// sccr.setValid(false); -// } -// -// return sccr; -// } -// -// /** -// * 将查询终端充值量和剩余水量响应消息字节数组解析为消息对象AFN=55H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryChargingCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryChargingCommandResponse qccr = new QueryChargingCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 9) { -// String charging = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[8] & 0x7F), data[7], data[6], data[5], data[4] }); -// -// if (charging.equals("") == false && current.equals("") == false) { -// qccr.setValid(true); -// qccr.setCharging(Integer.parseInt(charging)); -// // 判断剩余水量正负符号 -// if ((data[8] & 0x80) == 0x80) { -// qccr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qccr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息解析错误"); -// qccr.setValid(false); -// } -// } else { -// logger.error("查询终端充值量和剩余水量响应消息长度错误"); -// qccr.setValid(false); -// } -// -// return qccr; -// } -// -// /** -// * 将设置终端剩余水量报警值响应消息字节数组解析为消息对象AFN=16H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWarningCommandResponse swcr = new SetWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 3) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (warning.equals("") == false) { -// swcr.setNewWarning(Integer.parseInt(warning)); -// } -// -// swcr.setValid(true); -// swcr.setSuccess(true); -// } else { -// logger.error("设置终端剩余水量报警值响应消息长度错误"); -// swcr.setValid(false); -// } -// -// return swcr; -// } -// -// /** -// * 将查询终端剩余水量报警值响应消息字节数组解析为消息对象AFN=56H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWarningCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWarningCommandResponse qwcr = new QueryWarningCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// String warning = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// String current = ByteUtil.bcdToString(new byte[] { (byte) (data[7] & 0x7F), data[6], data[5], data[4], data[3] }); -// -// if (warning.equals("") == false && current.equals("") == false) { -// qwcr.setValid(true); -// qwcr.setWarning(Integer.parseInt(warning)); -// // 判断剩余水量正负符号 -// if ((data[7] & 0x80) == 0x80) { -// qwcr.setCurrent(Long.parseLong(current) * -1); -// } else { -// qwcr.setCurrent(Long.parseLong(current)); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息解析错误"); -// qwcr.setValid(false); -// } -// } else { -// logger.error("查询终端剩余水量报警值响应消息长度错误"); -// qwcr.setValid(false); -// } -// -// return qwcr; -// } -// -// /** -// * 将设置终端水位参数响应消息字节数组解析为消息对象AFN=17H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWlParamCommandResponse swpcr = new SetWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 7 == 0) { -// int n = data.length / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// swpcr.setWlParams(wlParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水位参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水位参数响应消息字节数组解析为消息对象AFN=57H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWlParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWlParamCommandResponse qwpcr = new QueryWlParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 9 && data.length % 7 == 2) { -// int n = (data.length - 2) / 7; // n表示水位点个数 -// List> wlParams = new ArrayList>(n); -// -// // 解析多个水位点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String benchmark = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 7 + 2] & 0x7F), data[i * 7 + 1], data[i * 7 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 7 + 4], data[i * 7 + 3] }); -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 7 + 6], data[i * 7 + 5] }); -// -// if (benchmark.equals("") == false && lower.equals("") == false && upper.equals("") == false) { -// // 判断剩余水量正负符号 -// if ((data[i * 7 + 2] & 0x80) == 0x80) { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * -0.01)); -// } else { -// item.add(0, Double.valueOf(Integer.parseInt(benchmark) * 0.01)); -// } -// item.add(1, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(2, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wlParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWlParams(wlParams); -// qwpcr.setValid(true); -// -// } else { -// logger.error("查询水位参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=18H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWpParamCommandResponse swpcr = new SetWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 8 && data.length % 8 == 0) { -// int n = data.length / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// swpcr.setWpParams(wpParams); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// logger.error("设置水压参数命令响应数据域长度错误"); -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数响应消息字节数组解析为消息对象AFN=58H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWpParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWpParamCommandResponse qwpcr = new QueryWpParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 10 && data.length % 8 == 2) { -// int n = (data.length - 2) / 8; // n表示水压点个数 -// List> wpParams = new ArrayList>(n); -// -// // 解析多个水压点的值 -// for (int i = 0; i < n; i++) { -// List item = new ArrayList(); -// -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 8 + 3], data[i * 8 + 2], data[i * 8 + 1], data[i * 8 + 0] }); -// String lower = ByteUtil.bcdToString(new byte[] { data[i * 8 + 7], data[i * 8 + 6], data[i * 8 + 5], data[i * 8 + 4] }); -// -// if (lower.equals("") == false && upper.equals("") == false) { -// item.add(0, Double.valueOf(Integer.parseInt(upper) * 0.01)); -// item.add(1, Double.valueOf(Integer.parseInt(lower) * 0.01)); -// -// wpParams.add(item); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setWpParams(wpParams); -// qwpcr.setValid(true); -// } else { -// logger.error("查询水压参数命令响应数据域长度错误"); -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=19H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqUpperParamCommandResponse swpcr = new SetWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将设置终端水压参数响应消息字节数组解析为消息对象AFN=1AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWqLowerParamCommandResponse swpcr = new SetWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqNewParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqNewParams.put(key, valueStr); -// } -// } -// swpcr.setWqNewParams(wqNewParams); -// -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端水压参数上限响应消息字节数组解析为消息对象AFN=59H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqUpperParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqUpperParamCommandResponse qwpcr = new QueryWqUpperParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将查询终端水压参数下限响应消息字节数组解析为消息对象AFN=5AH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWqLowerParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWqLowerParamCommandResponse qwpcr = new QueryWqLowerParamCommandResponse(Calendar.getInstance(), address); -// Map wqParams = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// int len = indexBin.length(); -// int j = 5; // data[j] -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// -// String key = "D" + i; -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// -// // 添加解析结果 -// wqParams.put(key, valueStr); -// } -// } -// -// qwpcr.setValid(true); -// qwpcr.setWqParams(wqParams); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端流量参数响应消息字节数组解析为消息对象AFN=1FH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = GBByteFrameTool.getDataWithoutPwTp(gbFrame); // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetWfParamCommandResponse swpcr = new SetWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// swpcr.setNewUppers(uppers); -// swpcr.setValid(true); -// swpcr.setSuccess(true); -// } else { -// swpcr.setValid(false); -// } -// -// return swpcr; -// } -// -// /** -// * 将查询终端流量参数响应消息字节数组解析为消息对象AFN=64H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryWfParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryWfParamCommandResponse qwpcr = new QueryWfParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 7 && data.length % 5 == 2) { -// int n = (data.length - 2) / 5;// 流量点个数 -// List uppers = new ArrayList(n); -// -// // 解析多个流量点的值 -// for (int i = 0; i < n; i++) { -// String upper = ByteUtil.bcdToString(new byte[] { data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (upper.equals("") == false) { -// if ((data[i * 5 + 4] & 0xF0) == 0xF0)// 判断正负 -// uppers.add(Double.valueOf(Integer.parseInt(upper) * -0.001)); -// else -// uppers.add(Double.valueOf(Integer.parseInt(upper) * 0.001)); -// } -// } -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// qwpcr.setStatus(status); -// qwpcr.setUppers(uppers); -// qwpcr.setValid(true); -// } else { -// qwpcr.setValid(false); -// } -// -// return qwpcr; -// } -// -// /** -// * 将设置终端水量表底值响应消息字节数组解析为消息对象AFN=1BH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFlowInitCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFlowInitCommandResponse sficr = new SetFlowInitCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length % 5 == 0) { -// int n = data.length / 5; //监测点个数 -// List inits = new ArrayList(n); -// -// // 解析多个监测点的值 -// for (int i = 0; i < n; i++) { -// String init = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4]), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// -// inits.add(Long.valueOf(init)); -// } -// sficr.setNewInits(inits); -// -// sficr.setValid(true); -// sficr.setSuccess(true); -// } else { -// sficr.setValid(false); -// } -// -// return sficr; -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔响应消息字节数组解析为消息对象AFN=20H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetThresholdCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetThresholdCommandResponse stcr = new SetThresholdCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length >= 3) { -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// int inter = data[1]; -// double thresh = 0.0; -// -// stcr.setType(type); -// stcr.setNo(no); -// stcr.setInter(inter); -// -// switch (type) { -// case 0: //雨量参数 -// stcr.setThresh(ByteUtil.bcdToInt(data[2])/10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 1: //水位参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[5] & 0x0F), data[4], data[3], data[2]}); -// if ((data[5] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 2: //水量参数 -// if (data.length == 7) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[6] & 0x7F), data[5], data[4], data[3], data[2]}); -// if ((data[6] & 0x80) == 0x80) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 3: //流速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {(byte) (data[4] & 0x0F), data[3], data[2]}); -// if ((data[4] & 0xF0) == 0xF0) -// thresh = thresh * -1; -// } -// stcr.setThresh(thresh / 1000.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 4: //闸位参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 5: //功率参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 6: //气压参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 7: //风速参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 8: //水温参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 10: //土壤含水率参数 -// if (data.length == 4) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 11: //蒸发量参数 -// if (data.length == 5) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 10.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// case 12: //水压参数 -// if (data.length == 6) { -// thresh = ByteUtil.bcdToLong(new byte[] {data[5], data[4], data[3], data[2]}); -// } -// stcr.setThresh(thresh / 100.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// break; -// -// default: -// stcr.setThresh(0.0); -// stcr.setValid(true); -// stcr.setSuccess(true); -// } -// } else { -// stcr.setValid(false); -// } -// -// return stcr; -// } -// -// /** -// * 将设置终端定值量响应消息字节数组解析为消息对象AFN=34H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetFixedValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetFixedValueCommandResponse sfvcr = new SetFixedValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 5) { -// String fixed = ByteUtil.bcdToString(new byte[] {(byte) (data[4]), data[3], data[2], data[1], data[0]}); -// -// sfvcr.setFixedValue(Long.parseLong(fixed)); -// -// sfvcr.setValid(true); -// sfvcr.setSuccess(true); -// } else { -// sfvcr.setValid(false); -// } -// -// return sfvcr; -// } -// -// /** -// * 将修改终端密码响应消息字节数组解析为消息对象AFN=96H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSetPasswordCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// SetPasswordCommandResponse spcr = new SetPasswordCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 2) { -// spcr.setValid(true); -// spcr.setSuccess(true); -// spcr.setNewPassword((int) ByteUtil.bcdToLong(new byte[] {data[1], data[0]})); -// } else { -// spcr.setValid(false); -// } -// -// return spcr; -// } -// -// /** -// * 将查询终端实时值命令响应消息字节数组解析为消息对象AFN=B0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeValueCommandResponse qrtvcr = new QueryRealTimeValueCommandResponse(Calendar.getInstance(), address); -// qrtvcr.setRttype(gbFrame.FRAME_CONTROL_FN); -// -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return qrtvcr; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } catch (Exception e) { -// results += "0"+ ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt))); -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[2] & 0x0F), data[1], data[0] }); -// try { // 判断如果有超大数字则置0 -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// qrtvcr.setResults(results); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[1] & 0x0F), data[0] }); -// try { // 判断如果有超大数字则置0 -// qrtvcr.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } catch (Exception e) { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 2 + 1], data[i * 2] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// try { // 判断如果有超大数字则置0 -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } catch (Exception e) { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// qrtvcr.setResults(results); -// break; -// } else { -// qrtvcr.setValid(false); -// return qrtvcr; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] {data[data.length - 3], data[data.length - 4] }); -// qrtvcr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] {data[data.length - 1], data[data.length - 2] }); -// qrtvcr.setStatus(status); -// -// qrtvcr.setValid(true); -// return qrtvcr; -// } -// -// /** -// * 将查询终端实时状态命令响应消息字节数组解析为消息对象AFN=5EH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryRealTimeStatusCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeStatusCommandResponse qrtscr = new QueryRealTimeStatusCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 4) { -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// qrtscr.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[3], data[2] }); -// qrtscr.setStatus(status); -// -// qrtscr.setValid(true); -// } else { -// qrtscr.setValid(false); -// } -// -// return qrtscr; -// } -// -// /** -// * 将定时自报消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToTimingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// TimingDataMessage tdm = new TimingDataMessage(Calendar.getInstance(), address); -// -// // 先处理时标 -// byte[] bt = new byte[4]; -// for (int i = 0; i < bt.length; i++) { -// bt[i] = gbFrame.FRAME_DATA_BODY[gbFrame.FRAME_DATA_BODY.length - 1 - bt.length + i]; -// } -// -// // TP中的秒分时日 -// int second = ByteUtil.bcdToInt(bt[bt.length - 4]); -// int minute = ByteUtil.bcdToInt(bt[bt.length - 3]); -// int hour = ByteUtil.bcdToInt(bt[bt.length - 2]); -// int date = ByteUtil.bcdToInt(bt[bt.length - 1]); -// -// Calendar tp = null; -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// -// if (date == tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期与当前日期相同 -// * 表示为最近的自报消息 -// * 判断是否超前 -// * 不超前即认为是正常自报或当日的补报 -// */ -// if (tp.getTimeInMillis() - tdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("定时自报消息时标超前"); // 超前半小时以上 -// logger.error("定时自报消息时标超前"); -// tdm.setValid(false); -// -// return tdm; -// } -// -// tdm.setTime(tp); -// } -// else if (date > tdm.getTime().get(Calendar.DAY_OF_MONTH)) { -// /** -// * 日期大于当前日期 -// * 表示可能为上月的补报自报消息 -// * 将月份减1 -// */ -// try { -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// else { -// /** -// * 日期小于当前日期 -// * 认为是当月的补报自报消息 -// * 月份不变 -// */ -// tdm.setTime(tp); -// } -// } catch (Exception re) { -// /** -// * 判断是否是日期为31导致的错误 -// * 将月份减1 -// */ -// try { -// tp = Calendar.getInstance(); -// tp.setLenient(false); -// -// tp.add(Calendar.MONTH, -1); -// tp.set(Calendar.DAY_OF_MONTH, date); -// tp.set(Calendar.HOUR_OF_DAY, hour); -// tp.set(Calendar.MINUTE, minute); -// tp.set(Calendar.SECOND, second); -// -// tp.getTimeInMillis(); -// -// tdm.setTime(tp); -// } catch (Exception e) { -// System.out.println("定时自报消息时标解析异常"); -// logger.error("定时自报消息时标解析异常"); -// tdm.setValid(false); -// -// return tdm; -// } -// } -// -// tdm.setTime(tp); -// tdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// tdm.setAfn(gbFrame.FRAME_DATA_AFN); -// tdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return tdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") ==false) { -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] {(byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "-1" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("")) { -// results += "-1" + ","; -// continue; -// } -// -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true ) { -// tdm.setValid(false); -// return tdm; -// } -// tdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// break; -// -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// tdm.setValid(false); -// return tdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// tdm.setResults(results); -// break; -// } else { -// tdm.setValid(false); -// return tdm; -// } -// } -// -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// tdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// tdm.setStatus(status); -// -// tdm.setValid(true); -// -// return tdm; -// } -// -// /** -// * 将随机报警消息字节数组解析为消息对象AFN=81H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToWarningMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// WarningMessage wm = new WarningMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("随机报警消息时标解析异常"); -// logger.error("随机报警消息时标解析异常"); -// wm.setValid(false); -// } -// if (tp.getTimeInMillis() - wm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("随机报警消息时标超前"); // 超前半小时以上 -// logger.error("随机报警消息时标超前"); -// wm.setValid(false); -// } else if (tpDelay != 0 -// && (wm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("随机报警消息超时"); -// logger.error("随机报警消息超时"); -// wm.setValid(false); -// } else { -// wm.setTime(tp); -// wm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// wm.setAfn(gbFrame.FRAME_DATA_AFN); -// wm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置报警状态 -// String warn = ""; -// warn = ByteUtil.binToBinString(new byte[] { data[1], data[0] }); -// wm.setWarn(warn); -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return wm; -// case GBConstants.CTRL_DIR1_MWL:// 水位超限 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 5] & 0x0F), data[i * 4 + 4], data[i * 4 + 3], data[i * 4 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 5] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)超限 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 6] & 0x7F), data[i * 5 + 5], data[i * 5 + 4], data[i * 5 + 3], data[i * 5 + 2] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 6] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质超限 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[6], data[5], data[4], data[3], data[2] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 7; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("") == false) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// wm.setResults(results); -// break; -// } else { -// wm.setValid(false); -// return wm; -// } -// default: -// if (data.length == 4) -// break; -// else { -// wm.setValid(false); -// return wm; -// } -// } -// -// String status = ""; -// status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// wm.setStatus(status); -// wm.setValid(true); -// } -// -// return wm; -// } -// -// /** -// * 将人工置数消息字节数组解析为消息对象AFN=C0H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToSettingDataMessage(GBByteFrame gbFrame) { -// String address = gbFrame.address; // 获取地址域 -// -// SettingDataMessage sdm = new SettingDataMessage(Calendar.getInstance(), address); -// -// // 计算时间延迟是否超过许可时间 -// Calendar tp = null; -// int tpDelay = GBByteFrameTool.getTpDelay(gbFrame); -// try { -// tp = GBByteFrameTool.getTp(gbFrame); -// } catch (Exception re) { -// System.out.println("人工置数消息时标解析异常"); -// logger.error("人工置数消息时标解析异常"); -// sdm.setValid(false); -// } -// if (tp.getTimeInMillis() - sdm.getTime().getTimeInMillis() > 1000 * 60 * 30) { -// System.out.println("人工置数消息时标超前"); // 超前半小时以上 -// logger.error("人工置数消息时标超前"); -// sdm.setValid(false); -// } else if (tpDelay != 0 && (sdm.getTime().getTimeInMillis() - tp.getTimeInMillis()) > tpDelay * 60 * 1000) { -// System.out.println("人工置数消息超时"); -// logger.error("人工置数消息超时"); -// sdm.setValid(false); -// } else { -// sdm.setTime(tp); -// sdm.setFcb(gbFrame.FRAME_CONTROL_FCB); -// sdm.setAfn(gbFrame.FRAME_DATA_AFN); -// sdm.setType(gbFrame.FRAME_CONTROL_FN); -// -// byte[] data = GBByteFrameTool.getDataWithoutAfnTp(gbFrame); // 获取数据域 -// // 解析并设置数据域 -// switch (gbFrame.FRAME_CONTROL_FN) { -// case GBConstants.CTRL_DIR1_RESP: -// return sdm; -// case GBConstants.CTRL_DIR1_MRF:// 雨量参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { data[2], data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWL:// 水位参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 4 + 3] & 0x0F), data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 4 + 3] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MACC:// 流量(水量)参数 -// if (data.length >= 9 && data.length % 5 == 4) { -// int n = (data.length - 4) / 5;// 水量仪表数 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 5 + 4] & 0x7F), data[i * 5 + 3], data[i * 5 + 2], data[i * 5 + 1], data[i * 5] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 5 + 4] & 0x80) == 0x80) -// results += String.valueOf(Long.parseLong(rt) * -1) + ","; -// else -// results += String.valueOf(Long.parseLong(rt)) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MFV:// 流速参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 流速仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) { -// // 判断正负 -// if ((data[i * 3 + 2] & 0xf0) == 0xf0) -// results += String.valueOf(Integer.parseInt(rt) / -1000.0) + ","; -// else -// results += String.valueOf(Integer.parseInt(rt) / 1000.0) + ","; -// } else { -// results += "0" + ","; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MBC:// 闸位参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 闸位仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MPW:// 功率参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 功率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 3 + 2], data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt)) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MAP:// 气压参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt))); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWS:// 风速参数 -// if (data.length == 7) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[2] & 0x0F), data[1], data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// String results = ""; -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// results += String.valueOf(Integer.parseInt(ByteUtil.bcdToString(new byte[] { (byte) ((data[2] & 0xF0) >> 4) }))); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWT:// 水温参数 -// if (data.length == 6) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[1] & 0x0F), data[0] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// sdm.setResults(String.valueOf(Integer.parseInt(rt) / 10.0)); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MWQ:// 水质参数 -// if (data.length >= 5) { -// String indexBin = ByteUtil.binToBinString(new byte[] { data[4], data[3], data[2], data[1], data[0] }).substring(5); // D35-D39备用 -// String results = ""; -// int len = indexBin.length(); -// int j = 5; -// for (int i = 0; i < len; i++) { -// if (indexBin.substring(len - 1 - i, len - i).equals("1")) { -// String[] format = Configure.getProperty("FD" + i, "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// String valueStr = ""; -// if (dt <= 8) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 4; -// } else if (dt == 10) { -// valueStr = ByteUtil.bcdToString(new byte[] { data[j + 4], data[j + 3], data[j + 2], data[j + 1], data[j] }); -// j = j + 5; -// } -// String key = "D" + i; -// if (valueStr.equals("")) { -// double value = Integer.parseInt(valueStr) * Math.pow(0.1, dd); -// // 输出格式 -// String pattern = ""; -// if (dd == 0) { -// pattern = "0"; -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// } -// valueStr = NumberFormat.format(value, pattern); -// } else { -// valueStr = "0.0"; -// } -// results += key + "," + valueStr + ";"; -// } -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSA:// 土壤含水率参数 -// if (data.length >= 6 && (data.length - 4) % 2 == 0) { -// int n = (data.length - 4) / 2;// 土壤含水率仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 2 + 1], data[i * 2] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MVQ:// 蒸发量参数 -// if (data.length >= 7 && (data.length - 4) % 3 == 0) { -// int n = (data.length - 4) / 3;// 蒸发量仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { (byte) (data[i * 3 + 2] & 0x0F), data[i * 3 + 1], data[i * 3] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 10.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MSS:// 报警或状态参数 -// if (data.length == 4) -// break; -// else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHRF:// 统计雨量 -// if (data.length == 8) { -// String results = ""; -// if (((data[0] & 0xC0) >> 6) == 0) -// results += "00,";// 步长5分钟 -// else if (((data[0] & 0xC0) >> 6) == 1) -// results += "01,";// 步长1小时 -// else if (((data[0] & 0xC0) >> 6) == 2) -// results += "10,";// 步长1天 -// else -// results += "11,";// 测试数据 -// results += (data[0] & 0x3F) + ",";// 时段长度 -// String rt = ByteUtil.bcdToString(new byte[] { data[3], data[2], data[1] }); -// if (rt.equals("") == true) { -// sdm.setValid(false); -// return sdm; -// } -// results += String.valueOf(Integer.parseInt(rt) / 10.0); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// case GBConstants.CTRL_DIR1_MHP:// 水压参数 -// if (data.length >= 8 && data.length % 4 == 0) { -// int n = (data.length - 4) / 4;// 水压仪表数量 -// String results = ""; -// for (int i = 0; i < n; i++) { -// String rt = ByteUtil.bcdToString(new byte[] { data[i * 4 + 3], data[i * 4 + 2], data[i * 4 + 1], data[i * 4] }); -// if (rt.equals("") == false) -// results += String.valueOf(Integer.parseInt(rt) / 100.0) + ","; -// else -// results += "0" + ","; -// } -// results = results.substring(0, results.length() - 1); -// sdm.setResults(results); -// break; -// } else { -// sdm.setValid(false); -// return sdm; -// } -// } -// // 解析并设置终端报警数据 -// String warn = ByteUtil.binToBinString(new byte[] { data[data.length - 3], data[data.length - 4] }); -// sdm.setWarn(warn); -// -// // 解析并设置终端状态 -// String status = ByteUtil.binToBinString(new byte[] { data[data.length - 1], data[data.length - 2] }); -// sdm.setStatus(status); -// -// sdm.setValid(true); -// } -// -// return sdm; -// } -// -// /** -// * 将设置终端IC卡有效功能命令响应消息字节数组解析为消息对象AFN=30H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableICCardCommandResponse eicccr = new EnableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// eicccr.setSuccess(true); -// } else { -// eicccr.setSuccess(false); -// } -// -// eicccr.setValid(true); -// } else { -// eicccr.setValid(false); -// } -// -// return eicccr; -// } -// -// /** -// * 将设置终端IC卡功能无效命令响应消息字节数组解析为消息对象AFN=31H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableICCardCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableICCardCommandResponse dicccr = new DisableICCardCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dicccr.setSuccess(true); -// } else { -// dicccr.setSuccess(false); -// } -// -// dicccr.setValid(true); -// } else { -// dicccr.setValid(false); -// } -// -// return dicccr; -// } -// -// /** -// * 将设置终端定值控制投入功能命令响应消息字节数组解析为消息对象AFN=32H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToEnableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// EnableFixedValCommandResponse efvcr = new EnableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// efvcr.setSuccess(true); -// } else { -// efvcr.setSuccess(false); -// } -// -// efvcr.setValid(true); -// } else { -// efvcr.setValid(false); -// } -// -// return efvcr; -// } -// -// /** -// * 将设置终端定值控制退出功能命令响应消息字节数组解析为消息对象AFN=33H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToDisableFixedValCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// DisableFixedValCommandResponse dfvcr = new DisableFixedValCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// dfvcr.setSuccess(true); -// } else { -// dfvcr.setSuccess(false); -// } -// -// dfvcr.setValid(true); -// } else { -// dfvcr.setValid(false); -// } -// -// return dfvcr; -// } -// -// /** -// * 将遥控开启水泵/闸门命令响应消息字节数组解析为消息对象AFN=92H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteOpenPumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteOpenPumpCommandResponse ropcr = new RemoteOpenPumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// ropcr.setSuccess(true); -// } else { -// ropcr.setSuccess(false); -// } -// -// ropcr.setValid(true); -// } else { -// ropcr.setValid(false); -// } -// -// return ropcr; -// } -// -// /** -// * 将遥控关闭水泵/闸门命令响应消息字节数组解析为消息对象AFN=93H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToRemoteClosePumpCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// RemoteClosePumpCommandResponse rcpcr = new RemoteClosePumpCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if ((data[0] & 0xF0) == 0xA0) { -// rcpcr.setSuccess(true); -// } else { -// rcpcr.setSuccess(false); -// } -// -// rcpcr.setValid(true); -// } else { -// rcpcr.setValid(false); -// } -// -// return rcpcr; -// } -// -// /** -// * 将复位终端参数命令响应消息字节数组解析为消息对象AFN=90H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToResetParamCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ResetParamCommandResponse rpcr = new ResetParamCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x5A) { -// rpcr.setSuccess(true); -// } else { -// rpcr.setSuccess(false); -// } -// -// rpcr.setValid(true); -// } else { -// rpcr.setValid(false); -// } -// -// return rpcr; -// } -// -// /** -// * 将清空终端历史数据单元命令响应消息字节数组解析为消息对象AFN=91H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToClearHistoryCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// ClearHistoryCommandResponse chcr = new ClearHistoryCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 1) { -// if (data[0] == 0x01 || data[0] == 0x02) { -// chcr.setSuccess(true); -// } else { -// chcr.setSuccess(false); -// } -// -// chcr.setValid(true); -// } else { -// chcr.setValid(false); -// } -// -// return chcr; -// } -// -// /** -// * 将查询水泵电机实时工作数据命令响应消息字节数解析为消息对象AFN=5FH -// * -// * @param message -// * @return -// */ -// private AppMessage bytesToQueryRealTimeMotoValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryRealTimeMotoValueCommandResponse qrtmv = new QueryRealTimeMotoValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 12) { -// // 解析并设置A相电压 -// int vaInt = ByteUtil.binToInt(new byte[] { data[1], data[0] }); -// if (vaInt < 1000) -// qrtmv.setVoltageA(String.valueOf(vaInt)); -// else -// qrtmv.setVoltageA("0"); -// -// // 解析并设置B相电压 -// int vbInt = ByteUtil.binToInt(new byte[] { data[3], data[2] }); -// if (vbInt < 1000) -// qrtmv.setVoltageB(String.valueOf(vbInt)); -// else -// qrtmv.setVoltageB("0"); -// -// // 解析并设置C相电压 -// int vcInt = ByteUtil.binToInt(new byte[] { data[5], data[4] }); -// if (vcInt < 1000) -// qrtmv.setVoltageC(String.valueOf(vcInt)); -// else -// qrtmv.setVoltageC("0"); -// -// // 解析并设置A相电流 -// int eaInt = ByteUtil.binToInt(new byte[] { data[7], data[6] }); -// if (eaInt < 1000) -// qrtmv.setEcurrentA(String.valueOf(eaInt)); -// else -// qrtmv.setEcurrentA("0"); -// -// // 解析并设置B相电流 -// int ebInt = ByteUtil.binToInt(new byte[] { data[9], data[8] }); -// if (ebInt < 1000) -// qrtmv.setEcurrentB(String.valueOf(ebInt)); -// else -// qrtmv.setEcurrentB("0"); -// -// // 解析并设置C相电流 -// int ecInt = ByteUtil.binToInt(new byte[] { data[11], data[10] }); -// if (ecInt < 1000) -// qrtmv.setEcurrentC(String.valueOf(ecInt)); -// else -// qrtmv.setEcurrentC("0"); -// -// qrtmv.setValid(true); -// } else { -// qrtmv.setValid(false); -// } -// return qrtmv; -// } -// -// /** -// * 将查询终端事件记录命令响应消息字节数组解析为消息对象AFN=5DH -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryEventRecordsCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryEventRecordsCommandResponse qprcr = new QueryEventRecordsCommandResponse(Calendar.getInstance(), address); -// Map ercs = new HashMap(); -// -// int temp = 0; -// -// // 解析并设置数据域 -// if (data.length == 64) { -// // int num = 1; -// // erc19-32备用 -// for (int j = 0; j < 19; j++) { -// temp = ByteUtil.binToInt(new byte[] { data[j * 2 + 1], data[2 * j] }); -// ercs.put("erc" + Integer.toString(j + 1), Integer.valueOf(temp)); -// // System.out.println(j+"==="+temp+"=="); -// } -// -// qprcr.setErcs(ercs); -// qprcr.setValid(true); -// -// } else { -// qprcr.setValid(false); -// } -// return qprcr; -// } -// -// /** -// * 将查询内存自报数据命令响应消息字节数组解析为消息对象AFH=B2H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryMemeryValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryMemeryValueCommandResponse qmvcr = new QueryMemeryValueCommandResponse(Calendar.getInstance(), address); -// -// // 解析并设置数据域 -// if (data.length == 8) { -// qmvcr.setValid(true); -// } else { -// qmvcr.setValid(false); -// } -// return qmvcr; -// } -// -// /** -// * 将查询终端固态存储数据命令响应消息字节数组解析为消息对象AFH=B1H -// * -// * @param byteMessage -// * @return -// */ -// private AppMessage bytesToQueryHDValueCommandResponse(GBByteFrame gbFrame) { -// byte[] data = gbFrame.FRAME_DATA_BODY; // 获取数据域 -// String address = gbFrame.address; // 获取地址域 -// -// QueryHDValueCommandResponse qhdvcr = new QueryHDValueCommandResponse(Calendar.getInstance(), address); -// Map qhdm = new HashMap(); -// -// // 解析并设置数据域 -// if (data.length > 9) { -// // 解析并设置参数及起止时间数据 -// String starttime = ByteUtil.bcdToString(new byte[] { data[4], data[3], data[2], data[1] }); -// String endtime = ByteUtil.bcdToString(new byte[] { data[8], data[7], data[6], data[5] }); -// if (starttime.equals("") == true || endtime.equals("") == true) { -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// Calendar start = Calendar.getInstance(); -// Calendar end = Calendar.getInstance(); -// start.set(2000 + Integer.parseInt(starttime.substring(0, 2)), -// Integer.parseInt(starttime.substring(2, 4)) - 1, -// Integer.parseInt(starttime.substring(4, 6)), -// Integer.parseInt(starttime.substring(6, 8)), 0, 0); -// end.set(2000 + Integer.parseInt(endtime.substring(0, 2)), -// Integer.parseInt(endtime.substring(2, 4)) - 1, -// Integer.parseInt(endtime.substring(4, 6)), -// Integer.parseInt(endtime.substring(6, 8)), 0, 0); -// long hour = (end.getTimeInMillis() - start.getTimeInMillis()) / (1000 * 3600); -// -// int type = ByteUtil.binToInt(data[0], 7, 4); -// int no = ByteUtil.binToInt(data[0], 3, 0); -// qhdvcr.setType(type); -// qhdvcr.setNo(no); -// -// switch (type) { -// case 0: //雨量参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format((Integer.parseInt(realtime) / 10.0), "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 1: //水位参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 3] & 0x0F), data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 3] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 2: //水量参数 -// { -// int interval = (data.length - 9) / 5; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 5) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 4] & 0x7F), data[i + 3], data[i + 2], data[i + 1], data[i]}); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// // 判断剩余水量正负符号 -// Long realtimelong = Long.valueOf(0); -// if ((data[i + 4] & 0x80) == 0x80) -// realtimelong = Long.valueOf(Long.parseLong(realtime) * -1); -// else -// realtimelong = Long.valueOf(realtime); -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(realtimelong)); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 3: //流速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {(byte) (data[i + 2] & 0x0F), data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// // 判断正负 -// if ((data[i + 2] & 0xf0) == 0xf0) -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / -1000.0, "0.000")); -// else -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 1000.0, "0.000")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 4: //闸位参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 5: //功率参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 6: //气压参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], String.valueOf(Integer.parseInt(realtime))); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 7: //风速参数 -// { -// int interval = (data.length - 9) / 3; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 3) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 2], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 8: //水温参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 10: //土壤含水率参数 -// { -// int interval = (data.length - 9) / 2; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 2) { -// String realtime = ByteUtil.bcdToString(new byte[] {data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 10.0, "0.0")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// case 11: //水压参数 -// { -// int interval = (data.length - 9) / 4; //有几个返回的数值 -// String[] times = new String[interval]; //有几个返回的值就有几个时间,从起始时间开始,不包括结束时间 -// int minitue = 0; -// Calendar step = Calendar.getInstance(); -// step.setTimeInMillis(start.getTimeInMillis()); -// if (interval > 0) { -// minitue = (int) (hour * 60 / interval); -// } -// -// int count = 0; -// for (int i = 9; i < data.length; i = i + 4) { -// String realtime = ByteUtil.bcdToString(new byte[] { data[i + 3], data[i + 2 ], data[i + 1], data[i] }); -// if (realtime.equals("") == true) -// realtime = "0"; -// -// String timeStr = TimeFormat.format(step.getTime(), "yyyy-MM-dd HH:mm"); -// times[count] = timeStr; -// -// qhdm.put(times[count], NumberFormat.format(Integer.parseInt(realtime) / 100.0, "0.00")); -// -// step.add(Calendar.MINUTE, minitue); -// count++; -// } -// qhdvcr.setTimes(times); -// qhdvcr.setResultMap(qhdm); -// break; -// } -// default://其它参数未实现 -// qhdvcr.setValid(false); -// return qhdvcr; -// } -// -// qhdvcr.setValid(true); -// -// } else { -// qhdvcr.setValid(false); -// } -// return qhdvcr; -// } + + /** + * 将读取温湿度监测值响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToReadWSValueCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSValueCommandResponse rwvcr = new ReadWSValueCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwvcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //获取传感器数量 + + int offset = cmd.getOffset(); //获取湿度变量的内存地址偏移量 + offset = offset + wsct * 2 * 2 * 2; + + // 解析并存储温度值 + for (int i = 0; i < wsct; i++) { + byte[] tempValueByte = new byte[] { data[i*8 + 2], data[i*8 + 3], data[i*8], data[i*8 + 1] }; + byte[] tempThresholdByte = new byte[] { data[i*8 + 6], data[i*8 + 7], data[i*8 + 4], data[i*8 + 5] }; + + float tempValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempValueByte), 16)); //温度监测值 + float tempThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(tempThresholdByte), 16)); //温度报警阈值 + + rwvcr.getWd().add(tempValue); + rwvcr.getWdbjz().add(tempThreshold); + } + + // 解析并存储湿度值 + for (int i = 0; i < wsct; i++) { + byte[] humValueByte = new byte[] { data[i*8 + 2 + offset], data[i*8 + 3 + offset], data[i*8 + offset], data[i*8 + 1 + offset] }; + byte[] humThresholdByte = new byte[] { data[i*8 + 6 + offset], data[i*8 + 7 + offset], data[i*8 + 4 + offset], data[i*8 + 5 + offset] }; + + float humValue = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humValueByte), 16)); //湿度监测值 + float humThreshold = Float.intBitsToFloat(Integer.parseInt(ByteUtil.binToHexString(humThresholdByte), 16)); //湿度报警阈值 + + rwvcr.getSd().add(humValue); + rwvcr.getSdbjz().add(humThreshold); + } + } + + return rwvcr; + } + + + private AppMessage bytesToReadWSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadWSStatusCommandResponse rwsscr = new ReadWSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rwsscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int wsct = cmd.getCount_sensor(); //温湿度监测点的数量 + + // 处理温度状态 + String tempDataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 1); + char bjBit = tempDataStr.charAt(tempDataStr.length() - 2 * i - 2); + + rwsscr.getWdbj().add(bjBit == '1' ? true : false); + rwsscr.getWdldbj().add(ldBit == '1' ? true : false); + } + + // 处理湿度状态 + String humDataStr = ByteUtil.binToBinString(new byte[] { data[4], data[5] }); //D15-D0顺序 + for (int i = 0; i < wsct; i++) { + char ldBit = humDataStr.charAt(humDataStr.length() - 2 * i - 1); + char bjBit = humDataStr.charAt(humDataStr.length() - 2 * i - 2); + + rwsscr.getSdbj().add(bjBit == '1' ? true : false); + rwsscr.getSdldbj().add(ldBit == '1' ? true : false); + } + } + + return rwsscr; + } + /** * 将消息对象解析为字节数组 @@ -3507,18 +512,25 @@ frame = LinkCommandToBytes((LinkCommand) message); } - // 读取甲烷参数内存命令 - if (message instanceof ReadCH4ParamCommand) { - frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); - } else if (message instanceof ReadCH4StatusCommand) { - frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); - } - -// // 读内存命令 -// if (message instanceof FreeMessageResponse) { -// frame = freeMessageResponseToBytes((FreeMessageResponse) message); +// // 读取甲烷参数内存命令 +// if (message instanceof ReadCH4ValueCommand) { +// frame = ReadCH4ValueCommandToBytes((ReadCH4ValueCommand) message); +// } else if (message instanceof ReadCH4StatusCommand) { +// frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); // } // +// // 读取温湿度命令 +// else if (message instanceof ReadWSValueCommand) { +// frame = ReadWSValueCommandToBytes((ReadWSValueCommand) message); +// } else if (message instanceof ReadWSStatusCommand) { +// frame = ReadWSStatusCommandToBytes((ReadWSStatusCommand) message); +// } + + // 读内存命令 + if (message instanceof ReadMemoryCommand) { + frame = readMemoryCommandToBytes((ReadMemoryCommand) message); + } +// // // 写内存命令 // if (message instanceof QueryRealTimeValueCommand) { // frame = queryRealTimeValueCommandToBytes((QueryRealTimeValueCommand) message); @@ -3527,6 +539,8 @@ return frame; } + + /** * 将握手命令转换为字节数组 * @@ -3540,28 +554,12 @@ } /** - * 将读取甲烷监测值命令转换为字节数组 - * @param read - * @return - */ - private byte[] ReadCH4ParamCommandToBytes(ReadCH4ParamCommand read) { - byte[] start = ByteUtil.hexStringToBytes(read.getStartAddress(), 3); - - FINSByteFrame finsFrame = new FINSByteFrame(read.getDestinationId(), - read.getMessageProducerId(), - read.getMemoryArea(), - start, - read.getCountWord()); - - return finsFrame.toBytes(); - } - - /** - * 将读取甲烷报警状态命令转换为字节数组 + * 将读取PLC内存命令转换为字节数组 + * * @param message * @return */ - private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + private byte[] readMemoryCommandToBytes(ReadMemoryCommand message) { byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), @@ -3569,1221 +567,78 @@ message.getMemoryArea(), start, message.getCountWord()); - + return finsFrame.toBytes(); } + /** + * 将读取甲烷监测值命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4ValueCommandToBytes(ReadCH4ValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } -// /** -// * 将退出登录命令对象转换为字节数组AFN=02H -// * -// * @param hmr -// * @return -// */ -// private byte[] logoutCommandToBytes(LogoutCommand lc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, lc.getDestinationId(), -// GBConstants.DATA_AFN_LOGIN, new byte[] { (byte) 0xF1 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置地址命令对象转换为字节数组AFN=10H -// * -// * @param message -// * @return -// */ -// private byte[] setAddressCommandToBytes(SetAddressCommand sac) { -// String address = sac.getNewAddress(); -// -// // 解析设置的新地址内容 -// byte[] add1 = ByteUtil.bcdStringToBytes(address.substring(0, 6)); -// byte[] add2 = ByteUtil.hexStringToBytes(address.substring(7, 10)); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(add1).append(add2[1]).append(add2[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sac.getDestinationId(), -// GBConstants.DATA_AFN_SETADDRESS, data.toBytes(), pw, -// sac.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询地址命令对象转换为字节数组AFN=50H -// * -// * @param message -// * @return -// */ -// private byte[] queryAddressCommandToBytes(QueryAddressCommand qac) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qac.getDestinationId(), -// GBConstants.DATA_AFN_QUERYADDRESS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置时钟命令对象转换为字节数组AFN=11H -// * -// * @param scc -// * @return -// */ -// private byte[] setClockCommandToBytes(SetClockCommand scc) { -// Calendar clock = scc.getClock(); -// -// // 解析设置的新时钟内容 -// int week = clock.get(Calendar.DAY_OF_WEEK); -// switch (week) { -// case Calendar.MONDAY: -// case Calendar.TUESDAY: -// case Calendar.WEDNESDAY: -// case Calendar.THURSDAY: -// case Calendar.FRIDAY: -// case Calendar.SATURDAY: -// week = week - 1; -// break; -// case Calendar.SUNDAY: -// week = week - 1 + 7; -// break; -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcd(clock.get(Calendar.SECOND))); // 秒 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append((byte) (ByteUtil.intToBcd(clock.get(Calendar.MONTH) + 1) | (ByteUtil -// .intToBcd(week) << 5))); // 月 -// data.append(ByteUtil.intToBcd(clock.get(Calendar.YEAR) - 2000)); // 年 -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCLOCK, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询时钟命令对象转换为字节数组AFN=51H -// * -// * @param message -// * @return -// */ -// private byte[] queryClockCommandToBytes(QueryClockCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCLOCK); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置工作模式命令对象转换为字节数组AFN=12H -// * -// * @param message -// * @return -// */ -// private byte[] setPatternCommandToBytes(SetPatternCommand spc) { -// String newPattern = spc.getPattern(); -// if (newPattern.length() > 2) { -// newPattern = newPattern.substring(0, 2); -// } -// -// // 解析设置的新工作模式内容 -// byte[] pattern = ByteUtil.hexStringToBytes(newPattern); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(pattern); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETWORKPATTERN, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询工作模式命令对象转换为字节数组AFN=52H -// * -// * @param message -// * @return -// */ -// private byte[] queryPatternCommandToBytes(QueryPatternCommand qpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWORKPATTERN); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置自报种类及时间间隔命令对象转换为字节数组AFN=A1H -// * -// * @param message -// * @return -// */ -// private byte[] setIntervalCommandToBytes(SetIntervalCommand sic) { -// Map newIntervals = sic.getIntervals(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// Bytes di = new Bytes(); // 每种参数自报的时间间隔 -// for (int i = 0; i < SetIntervalCommand.index.length; i++) { -// String key = SetIntervalCommand.index[i]; -// if (newIntervals.containsKey(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// int val = ((Integer) newIntervals.get(key)).intValue(); -// int low = val % 100; -// int high = val / 100; -// di.append(ByteUtil.intToBcd(low)).append(ByteUtil.intToBcd(high)); -// } else { -// di.append(new byte[] { 0x00, 0x00 }); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]).append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sic.getDestinationId(), -// GBConstants.DATA_AFN_SETINTERVAL, data.toBytes(), pw, -// sic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询自报种类及时间间隔命令对象转换为字节数组AFN=53H -// * -// * @param message -// * @return -// */ -// private byte[] queryIntervalCommandToBytes(QueryIntervalCommand qic) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qic.getDestinationId(), -// GBConstants.DATA_AFN_QUERYINTERVAL); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端需查询的实时数据种类命令对象转换为字节数组AFN=A0H -// * -// * @param message -// * @return -// */ -// private byte[] setRttypesCommandToBytes(SetRttypesCommand src) { -// Set newRttypes = src.getRttypes(); -// -// // 解析设置的新工作模式内容 -// int bin = 0; // 自报种类 -// for (int i = 0; i < SetRttypesCommand.index.length; i++) { -// String key = SetRttypesCommand.index[i]; -// if (newRttypes.contains(key)) { -// bin = (int) (bin + Math.pow(2, i)); -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(bin, 2); -// data.append(db[1]).append(db[0]); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, src.getDestinationId(), -// GBConstants.DATA_AFN_SETRTTYPES, data.toBytes(), pw, -// src.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端需查询的实时数据种类命令对象转换为字节数组AFN=54H -// * -// * @param message -// * @return -// */ -// private byte[] queryRttypesCommandToBytes(QueryRttypesCommand qrc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYRTTYPES); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端充值量命令对象转换为字节数组AFN=15H -// * -// * @param message -// * @return -// */ -// private byte[] setChargingCommandToBytes(SetChargingCommand scc) { -// String charging = scc.getNewCharging(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(charging), 4)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, scc.getDestinationId(), -// GBConstants.DATA_AFN_SETCHARGING, data.toBytes(), pw, -// scc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端充值量命令对象转换为字节数组AFN=55H -// * -// * @param message -// * @return -// */ -// private byte[] queryChargingCommandToBytes(QueryChargingCommand qcc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qcc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYCHARGING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端剩余水量报警值命令对象转换为字节数组AFN=16H -// * -// * @param message -// * @return -// */ -// private byte[] setWarningCommandToBytes(SetWarningCommand swc) { -// String warning = swc.getNewWarning(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBcdsHL(Long.parseLong(warning), 3)); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swc.getDestinationId(), -// GBConstants.DATA_AFN_SETWARNING, data.toBytes(), pw, -// swc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端剩余水量报警值命令对象转换为字节数组AFN=56H -// * -// * @param message -// * @return -// */ -// private byte[] queryWarningCommandToBytes(QueryWarningCommand qwc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWARNING); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水位参数命令对象转换为字节数组AFN=17H -// * -// * @param message -// * @return -// */ -// private byte[] setWlParamCommandToBytes(SetWlParamCommand swpc) { -// List> wlParams = swpc.getWlParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wlParams.size(); i++) { -// List wlp = (List) wlParams.get(i); -// -// int benchmark = (int) (((Double) wlp.get(0)).doubleValue() * 100); -// int upper = (int) (((Double) wlp.get(1)).doubleValue() * 100); -// int lower = (int) (((Double) wlp.get(2)).doubleValue() * 100); -// -// byte[] bb = ByteUtil.intToBcdsHL(Math.abs(benchmark), 3); -// if (benchmark < 0) { -// bb[2] = (byte) (bb[2] + 0x80); -// } -// byte[] ub = ByteUtil.intToBcdsHL(upper, 2); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 2); -// data.append(bb).append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERLEVELPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水位参数命令对象转换为字节数组AFN=57H -// * -// * @param message -// * @return -// */ -// private byte[] queryWlParamCommandToBytes(QueryWlParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERLEVELPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水压参数命令对象转换为字节数组AFN=18H -// * -// * @param message -// * @return -// */ -// private byte[] setWpParamCommandToBytes(SetWpParamCommand swpc) { -// List> wpParams = swpc.getWpParams(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < wpParams.size(); i++) { -// List wpp = (List) wpParams.get(i); -// -// int upper = (int) (((Double) wpp.get(0)).doubleValue() * 100); -// int lower = (int) (((Double) wpp.get(1)).doubleValue() * 100); -// -// byte[] ub = ByteUtil.intToBcdsHL(upper, 4); -// byte[] lb = ByteUtil.intToBcdsHL(lower, 4); -// data.append(ub).append(lb); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERPRESSUREPARAM, data.toBytes(), pw, -// swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水压参数命令对象转换为字节数组AFN=58H -// * -// * @param message -// * @return -// */ -// private byte[] queryWpParamCommandToBytes(QueryWpParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERPRESSUREPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数上限命令对象转换为字节数组AFN=19H -// * -// * @param message -// * @return -// */ -// private byte[] setWqUpperParamCommandToBytes(SetWqUpperParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqUpperParamCommand.index.length; i++) { -// String key = SetWqUpperParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqUpperParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYUPPERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水质参数下限命令对象转换为字节数组AFN=1AH -// * -// * @param message -// * @return -// */ -// private byte[] setWqLowerParamCommandToBytes(SetWqLowerParamCommand swpc) { -// Map newWqParams = swpc.getWqParams(); -// -// // 解析设置的新水质参数内容 -// int indexBin = 0; // 参数种类 -// Bytes di = new Bytes(); -// for (int i = 0; i < SetWqLowerParamCommand.index.length; i++) { -// String key = SetWqLowerParamCommand.index[i]; -// if (newWqParams.containsKey(key)) { -// indexBin = (int) (indexBin + Math.pow(2, i)); -// String valStr = (String) newWqParams.get(key); -// String[] format = Configure.getProperty("F" + SetWqLowerParamCommand.index[i], "").split(","); -// int dt = Integer.parseInt(format[0]); // 数据的总位数 -// int dd = Integer.parseInt(format[1]); // 数据的小数位 -// -// int val = 0; -// String pattern = "0"; -// try { -// if (dd == 0) { -// val = NumberFormat.parseInt(valStr, pattern); -// } else { -// pattern = "0."; -// for (int z = 0; z < dd; z++) { -// pattern = pattern + "0"; -// } -// val = (int) (NumberFormat.parseDouble(valStr, pattern) * Math.pow(10, dd)); -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } -// String valIntStr = NumberFormat.format(val, "0"); // 转换后的整数 -// if (dt <= 8) { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 4); -// di.append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } else { -// byte[] vb = ByteUtil.bcdStringToBytes(valIntStr, 5); -// di.append(vb[4]).append(vb[3]).append(vb[2]).append(vb[1]).append(vb[0]); -// } -// } -// } -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] db = ByteUtil.intToBins(indexBin, 5); -// data.append(db[4]).append(db[3]).append(db[2]).append(db[1]).append(db[0]); -// data.append(di.toBytes()); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERQUALITYLOWERPARAM, -// data.toBytes(), pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数上限命令对象转换为字节数组AFN=59H -// * -// * @param message -// * @return -// */ -// private byte[] queryWqUpperParamCommandToBytes(QueryWqUpperParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端水质参数下限命令对象转换为字节数组AFN=5AH -// * -// * @param message -// * @return -// */ -// private byte[] queryWqLowerParamCommandToBytes(QueryWqLowerParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERQUALITYLOWERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端流量参数命令对象转换为字节数组AFN=1FH -// * -// * @param message -// * @return -// */ -// private byte[] setWfParamCommandToBytes(SetWfParamCommand swpc) { -// List newUppers = swpc.getNewUppers(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < newUppers.size(); i++) { -// double value = ((Double) newUppers.get(i)).doubleValue(); -// int upper = (int) (Math.abs(value) * 1000); -// byte[] ub = ByteUtil.intToBcdsHL(upper, 5); -// if (value < 0) { -// ub[4] = (byte) (ub[4] + 0xF0); -// } -// data.append(ub); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, swpc.getDestinationId(), -// GBConstants.DATA_AFN_SETWATERFLOWUPPERPARAM, data.toBytes(), -// pw, swpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端流量参数命令对象转换为字节数组AFN=64H -// * -// * @param message -// * @return -// */ -// private byte[] queryWfParamCommandToBytes(QueryWfParamCommand qwpc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qwpc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYWATERFLOWUPPERPARAM); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时值命令对象转换为字节数组AFN=B0H -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeValueCommandToBytes(QueryRealTimeValueCommand qrtvc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// qrtvc.getRttype(), qrtvc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMEVALUE); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端水量表底值命令对象转换为字节数组AFN=1BH -// * -// * @param message -// * @return -// */ -// private byte[] setFlowInitCommandToBytes(SetFlowInitCommand sfic) { -// List inits = sfic.getNewInits(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// for (int i = 0; i < inits.size(); i++) { -// long init = ((Long) inits.get(i)).longValue(); -// byte[] ib = ByteUtil.intToBcdsHL(init, 5); -// data.append(ib); -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfic.getDestinationId(), -// GBConstants.DATA_AFN_SETFLOWINIT, data.toBytes(), pw, -// sfic.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端启报阈值及存储时间段间隔命令对象转换为字节数组AFN=20H -// * -// * @param message -// * @return -// */ -// private byte[] setThresholdCommandToBytes(SetThresholdCommand stc) { -// int type = stc.getType(); -// int no = stc.getNo(); -// int inter = stc.getInter(); -// double thresh = stc.getThresh(); + /** + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return + */ +// private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); // -// String noHex = ByteUtil.binToHexString(ByteUtil.intToBins(no, 1)); -// noHex = noHex.substring(noHex.length() - 1); -// String typeHex = ByteUtil.binToHexString(ByteUtil.intToBins(type, 1)); -// typeHex = typeHex.substring(typeHex.length() - 1); +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); // -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.hexStringToBytes(typeHex + noHex)); -// data.append(ByteUtil.intToBins(inter, 1)); -// byte[] threshBytes = null; -// -// // 控制域FN -// int control_fn = 0; -// -// // 判断设置检测参数的类型 -// switch (type) { -// case 0: //雨量参数 -// data.append(ByteUtil.intToBcd((int) (thresh * 10))); -// control_fn = 1; -// break; -// -// case 1: //水位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 4); -// if (thresh < 0) { -// threshBytes[3] = (byte) (threshBytes[3] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 2; -// break; -// -// case 2: //水量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh)), 5); -// if (thresh < 0) { -// threshBytes[4] = (byte) (threshBytes[4] | 0x80); -// } -// data.append(threshBytes); -// -// control_fn = 3; -// break; -// -// case 3: //流速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (Math.abs(thresh) * 1000), 3); -// if (thresh < 0) { -// threshBytes[2] = (byte) (threshBytes[2] | 0xF0); -// } -// data.append(threshBytes); -// -// control_fn = 4; -// break; -// -// case 4: //闸位参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 5; -// break; -// -// case 5: //功率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 6; -// break; -// -// case 6: //气压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) thresh, 3); -// data.append(threshBytes); -// -// control_fn = 7; -// break; -// -// case 7: //风速参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 100), 3); -// data.append(threshBytes); -// -// control_fn = 8; -// break; -// -// case 8: //水温参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 9; -// break; -// -// case 10: //土壤含水率参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 2); -// data.append(threshBytes); -// -// control_fn = 11; -// break; -// -// case 11: //蒸发量参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 3); -// data.append(threshBytes); -// -// control_fn = 12; -// break; -// -// case 12: //水压参数 -// threshBytes = ByteUtil.intToBcdsHL((long) (thresh * 10), 4); -// data.append(threshBytes); -// -// control_fn = 15; -// break; -// -// default: -// thresh = 0.0; -// } -// -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, stc.getDestinationId(), -// GBConstants.DATA_AFN_SETTHRESHOLD, data.toBytes(), pw, -// stc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将设置终端定值量命令对象转换为字节数组AFN=34H -// * -// * @param message -// * @return -// */ -// private byte[] setFixedValueCommandToBytes(SetFixedValueCommand sfvc) { -// long fixedvalue = sfvc.getNewFixedValue(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] fb = ByteUtil.intToBcdsHL(fixedvalue, 5); -// data.append(fb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, sfvc.getDestinationId(), -// GBConstants.DATA_AFN_SETFIXEDVALUE, data.toBytes(), pw, -// sfvc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将修改终端密码命令对象转换为字节数组AFN=96H -// * -// * @param message -// * @return -// */ -// private byte[] setPasswordCommandToBytes(SetPasswordCommand spc) { -// // 设置数据域 -// Bytes data = new Bytes(); -// byte[] pb = ByteUtil.intToBcdsHL(spc.getNewPassword(), 2); -// data.append(pb); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// // 构建帧 -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, spc.getDestinationId(), -// GBConstants.DATA_AFN_SETPASSWORD, data.toBytes(), pw, -// spc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端实时状态命令对象转换为字节数组AFN=5EH -// * -// * @param message -// * @return -// */ -// private byte[] queryRealTimeStatusCommandToBytes(QueryRealTimeStatusCommand qrtsc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_QSS, qrtsc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYREALTIMESTATUS); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将自报响应消息转换为字节数组 自报消息通用响应 -// * -// * @param message -// * @return -// */ -// private byte[] freeMessageResponseToBytes(FreeMessageResponse fmr) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, fmr.getFcb(), -// fmr.getType(), fmr.getDestinationId(), -// fmr.getAfn(), new byte[] { 0x00 }); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能有效命令转换为字节数组AFN=30H -// * -// * @param message -// * @return -// */ -// private byte[] enableICCardCommandToBytes(EnableICCardCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEICCARD, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端IC卡功能无效命令转换为字节数组AFN=31H -// * -// * @param message -// * @return -// */ -// private byte[] disableICCardCommandToBytes(DisableICCardCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEICCARD, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制投入功能命令转换为字节数组AFN=32H -// * -// * @param message -// * @return -// */ -// private byte[] enableFixedValCommandToBytes(EnableFixedValCommand eiccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, eiccc.getDestinationId(), -// GBConstants.DATA_AFN_ENABLEFIXEDVAL, pw, eiccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将置终端定值控制退出功能命令转换为字节数组AFN=33H -// * -// * @param message -// * @return -// */ -// private byte[] disableFixedValCommandToBytes(DisableFixedValCommand diccc) { -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, diccc.getDestinationId(), -// GBConstants.DATA_AFN_DISABLEFIXEDVAL, pw, diccc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控开启水泵/闸门命令转换为字节数组AFN=92H -// * -// * @param message -// * @return -// */ -// private byte[] remoteOpenPumpCommandToBytes(RemoteOpenPumpCommand ropc) { -// byte[] data = ByteUtil.hexStringToBytes(ropc.getPump() + ropc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, ropc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTEOPENPUMP, data, pw, ropc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将遥控关闭水泵/闸门命令转换为字节数组AFN=93H -// * -// * @param message -// * @return -// */ -// private byte[] remoteClosePumpCommandToBytes(RemoteClosePumpCommand rcpc) { -// byte[] data = ByteUtil.hexStringToBytes(rcpc.getPump() + rcpc.getNo(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rcpc.getDestinationId(), -// GBConstants.DATA_AFN_REMOTECLOSEPUMP, data, pw, rcpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将复位终端参数命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] resetParamCommandToBytes(ResetParamCommand rpc) { -// byte[] data = ByteUtil.hexStringToBytes(rpc.getReset(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, rpc.getDestinationId(), -// GBConstants.DATA_AFN_RESETPARAM, data, pw, rpc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将清空历史数据单元命令转换为字节数组AFN=90H -// * -// * @param message -// * @return -// */ -// private byte[] clearHistoryCommandToBytes(ClearHistoryCommand chc) { -// byte[] data = ByteUtil.hexStringToBytes(chc.getClear(), 1); -// byte[] pw = new byte[] { 0x00, 0x00 }; -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, chc.getDestinationId(), -// GBConstants.DATA_AFN_CLEARHISTORY, data, pw, chc.getTime(), 10); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询水泵电机实时工作数据的命令转换为字节数组AFN=5FH -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryRealTimeMotoValueCommandToBytes( -// QueryRealTimeMotoValueCommand qrtmv) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qrtmv.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEMOTOSS); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询终端事件记录的命令转换为字节数组5DH -// * -// * @param message -// * @return -// */ -// private byte[] queryEventRecordsCommandToBytes(QueryEventRecordsCommand qerc) { -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYEVENTREC); -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询内存自报数据的命令转换为字节数组B2H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryMemeryValueCommandToBytes(QueryMemeryValueCommand qerc) { -// Calendar bclock = qerc.getBdate(); -// Calendar eclock = qerc.getEdate(); -// -// // 设置数据域 -// Bytes data = new Bytes(); -// -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(bclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MINUTE))); // 分 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// GBConstants.CTRL_DIR0_COMM, qerc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYMEMERYVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// /** -// * 将查询固态存储数据的命令转换为字节数组B1H -// * -// * @param message -// * @return -// */ -// private byte[] queryQueryHDValueCommandToBytes(QueryHDValueCommand qhdc) { -// int type = qhdc.getType(); -// int no = qhdc.getNo(); -// Calendar sclock = qhdc.getSclock(); -// Calendar eclock = qhdc.getEclock(); -// -// int i = type * 16 + no; -// -// int control_fn = GBConstants.CTRL_DIR0_QACC; -// if (type == 0) //查询雨量参数 -// control_fn = GBConstants.CTRL_DIR0_QRF; -// else if (type == 1) //查询水位参数 -// control_fn = GBConstants.CTRL_DIR0_QWL; -// else if (type == 2) //查询水量参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 3) //查询流速参数 -// control_fn = GBConstants.CTRL_DIR0_QACC; -// else if (type == 4) //查询闸位参数 -// control_fn = GBConstants.CTRL_DIR0_QBC; -// else if (type == 5) //查询功率参数 -// control_fn = GBConstants.CTRL_DIR0_QPW; -// else if (type == 6) //查询气压参数 -// control_fn = GBConstants.CTRL_DIR0_QAP; -// else if (type == 7) //查询风速参数 -// control_fn = GBConstants.CTRL_DIR0_QWS; -// else if (type == 8) //查询水温参数 -// control_fn = GBConstants.CTRL_DIR0_QWT; -// else if (type == 9) //查询水质参数 -// control_fn = GBConstants.CTRL_DIR0_QWQ; -// else if (type == 10) //查询土壤含水率参数 -// control_fn = GBConstants.CTRL_DIR0_QSA; -// else if (type == 11) //查询水压参数 -// control_fn = GBConstants.CTRL_DIR0_QHP; -// -// // 设置数据域 -// Bytes data = new Bytes(); -// data.append(ByteUtil.intToBins(i, 1)); -// -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(sclock.get(Calendar.YEAR))); // 年 -// -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.HOUR_OF_DAY))); // 时 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.DAY_OF_MONTH))); // 日 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.MONTH) + 1)); // 月 -// data.append(ByteUtil.intToBcd(eclock.get(Calendar.YEAR))); // 年 -// -// GBByteFrame gbFrame = new GBByteFrame(GBConstants.CTRL_DIR_DOWN, -// GBConstants.CTRL_DIV_FALSE, GBConstants.CTRL_MAX_FCB, -// control_fn, qhdc.getDestinationId(), -// GBConstants.DATA_AFN_QUERYHARDDISCVALUE, data.toBytes()); -// -// return gbFrame.toBytes(); -// } -// -// -// /** -// * 从重叠消息中提取规范消息 -// */ -// public List extractByteMessage(byte[] byteMessage) { -// List bytesList = new ArrayList(); -// -// try { -// int i = 0; -// while (i < byteMessage.length) { -// if ((byteMessage[i] == GBByteFrame.FRAME_HEAD) && (byteMessage[i + 2] == GBByteFrame.FRAME_HEAD)) { -// int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 1]}); -// if (i + length + 5 <= byteMessage.length && byteMessage[i + length + 4] == GBByteFrame.FRAME_END) { -// Bytes bytes = new Bytes(); -// bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]); -// for (int j = 0; j < length + 2; j++) { -// bytes.append(byteMessage[i + 3 + j]); -// } -// -// i = i + length + 5; -// bytesList.add(bytes.toBytes()); -// } else { -// i++; -// } -// } else { -// i++; -// } -// } -// } catch (Exception e) { -// bytesList.clear(); -// bytesList.add(byteMessage); -// return bytesList; -// } -// -// return bytesList; +// return finsFrame.toBytes(); // } + /** + * 将读取温湿度监测值命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSValueCommandToBytes(ReadWSValueCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + + /** + * 将读取温湿度报警状态命令转换为字节数组 + * + * @param message + * @return + */ +// private byte[] ReadWSStatusCommandToBytes(ReadWSStatusCommand message) { +// byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); +// +// FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), +// message.getMessageProducerId(), +// message.getMemoryArea(), +// start, +// message.getCountWord()); +// +// return finsFrame.toBytes(); +// } + } diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java deleted file mode 100644 index 3570a07..0000000 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.szpg.task; - -import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; -import com.szpg.db.data.PgAcuRdcmd; -import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; -import com.szpg.plc.protocol.DTProtocolInterface; -import com.szpg.plc.protocol.ProtocolFactory; -import com.szpg.plc.server.ACUClient; -import com.szpg.plc.server.ACUClientUtil; -import com.szpg.plc.util.ByteUtil; - -public class ReadCH4ParamTask implements Runnable { - - private ACUClient client; - private AppCommand appCommand; - - public ReadCH4ParamTask(ACUClient client, AppCommand command) { - this.client = client; - this.appCommand = command; - } - - @Override - public void run() { - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - byte[] content = finspi.messageToBytes(appCommand); - - // 发送读取甲烷参数内存命令 - ACUClientUtil.getInstance().sendACUCommand(client, content); - - ReadCH4ParamCommand ch4Cmd = (ReadCH4ParamCommand) appCommand; - - // 发送完成之后将命令保存在数据库中 - PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(ch4Cmd.getCommandType()); - cmd.setDest(ch4Cmd.getDestinationId()); - cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); - cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); - cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCountWord()); - cmd.setCount_bit(ch4Cmd.getCountBit()); - - new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); - } - -} diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 196d7e3..11b33b4 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -41,6 +41,7 @@ cmd.setStart_mem_bit(ch4AlmCmd.getStartAddress().substring(4)); cmd.setCount_word(ch4AlmCmd.getCountWord()); cmd.setCount_bit(ch4AlmCmd.getCountBit()); + cmd.setCount_sensor(ch4AlmCmd.getCountSensor()); new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); } diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java new file mode 100644 index 0000000..73d957f --- /dev/null +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -0,0 +1,49 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadCH4ValueCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadCH4ValueTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadCH4ValueTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取甲烷参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadCH4ValueCommand ch4Cmd = (ReadCH4ValueCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setId(ch4Cmd.getId()); + cmd.setTm(ch4Cmd.getTime().getTime()); + cmd.setCmd_type(ch4Cmd.getCommandType()); + cmd.setDest(ch4Cmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); + cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); + cmd.setCount_word(ch4Cmd.getCountWord()); + cmd.setCount_bit(ch4Cmd.getCountBit()); + cmd.setCount_sensor(ch4Cmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadWSStatusTask.java b/src/com/szpg/task/ReadWSStatusTask.java new file mode 100644 index 0000000..94506d4 --- /dev/null +++ b/src/com/szpg/task/ReadWSStatusTask.java @@ -0,0 +1,49 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadWSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadWSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadWSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取温湿度参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadWSStatusCommand wsAlmCmd = (ReadWSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setId(wsAlmCmd.getId()); + cmd.setTm(wsAlmCmd.getTime().getTime()); + cmd.setCmd_type(wsAlmCmd.getCommandType()); + cmd.setDest(wsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(wsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(wsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(wsAlmCmd.getCountWord()); + cmd.setCount_bit(wsAlmCmd.getCountBit()); + cmd.setCount_sensor(wsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java new file mode 100644 index 0000000..1dbe5ad --- /dev/null +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -0,0 +1,50 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadWSValueTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadWSValueTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取甲烷参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadWSValueCommand wsCmd = (ReadWSValueCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setId(wsCmd.getId()); + cmd.setTm(wsCmd.getTime().getTime()); + cmd.setCmd_type(wsCmd.getCommandType()); + cmd.setDest(wsCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsCmd.getMemoryArea() })); + cmd.setStart_mem_word(wsCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(wsCmd.getStartAddress().substring(4)); + cmd.setCount_word(wsCmd.getCountWord()); + cmd.setCount_bit(wsCmd.getCountBit()); + cmd.setCount_sensor(wsCmd.getCountSensor()); + cmd.setOffset(wsCmd.getOffset()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +}