package com.surfbird.util.convert; import java.io.IOException; import java.io.OutputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang.StringUtils; import com.surfbird.business.bean.HeatAnalyze; import com.surfbird.business.bean.Instrucation; import com.surfbird.common.util.JdbcInstance; import com.surfbird.socket.server.bean.Client; import com.surfbird.util.CRC16Util; import com.surfbird.util.Global; public class DataHandle { /** * 字符串转换为16进制字符串 . * @param str * @return **/ public static byte[] toStringByte(String str) { int m = 0, n = 0; int byteLength = str.length() / 2; // 每两个字符描述一个字节 byte[] byteArray = new byte[byteLength]; for (int i = 0; i < byteLength; i++) { m = i * 2 + 1; n = m + 1; int intVal = Integer.decode("0x" + str.substring(i * 2, m) + str.substring(m, n)); byteArray[i] = Byte.valueOf((byte) intVal); } return byteArray; } /** * 16进制字符串转换为字符串. * @param byteArray * @param size * @return **/ public static String toHexString(byte[] byteArray, int size) { StringBuilder hexString = new StringBuilder(); for (int i = 0; i < size; i++) { if ((byteArray[i] & 0xff) < 0x10) {// 0~F前面不零 hexString.append("0"); } hexString.append(Integer.toHexString(0xFF & byteArray[i])); } return hexString.toString().toLowerCase(); } /** * 解析RTU回传的数据信息. * @param writer:通信流对象. * @param receive:接收到的数据. * @param analysis:解码后的数据. * @param size:接收到的数据长度. **/ public static void toParseData(OutputStream writer, Client client, String receive, String analysis, int size) { StringBuffer buffer = new StringBuffer(); if(size == 1) {//心跳包处理. DataHandle.toHandleHeartbeat(writer, receive); } else if(size == 26) {//注册包处理. DataHandle.toHandleRegister(client, receive); buffer.append("握手协议:连接地址:").append(client.getAddress()); buffer.append(";连接端口:").append(client.getPort()); buffer.append(";设备代码:").append(client.getCode()); buffer.append(";设备卡号:").append(client.getMobile()); buffer.append(";数据内容:").append(receive).append("."); DataHandle.toInstrucation(buffer.toString(), "数据采集-数据解析"); } else if(size == 31) {//数据包处理. DataHandle.toHandleData4212(client, analysis); buffer.append("数据采集:连接地址:").append(client.getAddress()); buffer.append(";连接端口:").append(client.getPort()); buffer.append(";设备代码:").append(client.getCode()); buffer.append(";设备卡号:").append(client.getMobile()); buffer.append(";数据内容:").append(analysis).append("."); DataHandle.toInstrucation(buffer.toString(), "数据采集-数据解析"); } else if(size == 73) { DataHandle.toHandleData4202(client, analysis); buffer.append("数据采集:连接地址:").append(client.getAddress()); buffer.append(";连接端口:").append(client.getPort()); buffer.append(";设备代码:").append(client.getCode()); buffer.append(";设备卡号:").append(client.getMobile()); buffer.append(";数据内容:").append(analysis).append("."); DataHandle.toInstrucation(buffer.toString(), "数据采集-数据解析"); } else {//异常数据处理. buffer.append("异常数据:连接地址:").append(client.getAddress()); buffer.append(";连接端口:").append(client.getPort()); buffer.append(";设备代码:").append(StringUtils.isBlank(client.getCode()) ? "无" : client.getCode()); buffer.append(";设备卡号:").append(StringUtils.isBlank(client.getMobile()) ? "无" : client.getMobile()); buffer.append(";数据长度:").append(size); buffer.append(";解析内容:").append(analysis); buffer.append(";数据内容:").append(receive).append("."); DataHandle.toInstrucation(buffer.toString(), "数据采集-数据解析"); } } /** * 接收设备心跳包处理函数. * @param writer:通信流对象. * @param data:解析后的数据. **/ private static void toHandleHeartbeat(OutputStream writer, String data) { try { if(StringUtils.isNotBlank(data) && data.equals("$")) writer.write("%".getBytes()); } catch (IOException e) { e.printStackTrace(); } } /** * 接收设备注册包处理函数. * @param client:通信客户端对象. * @param data:解析后的数据. **/ private static void toHandleRegister(Client client, String data) { if(StringUtils.isNotBlank(data) && data.toUpperCase().startsWith("XMYN")) { String info = data.toUpperCase(); info = info.replace("\r", "").replace("\n", "").replace("XMYN", ""); client.setCode(info.substring(0, 9)); client.setMobile(info.substring(9, info.length())); //临时更换动态RTU指令,为了配合牟立公司。 //client.setOrder(Integer.parseInt(client.getMobile().substring(0, 1)) == 1 ? Global.XMYN_RTU_4202 : Global.XMYN_RTU_4212); //后续需要更新优化RTU指令 if(Integer.parseInt(client.getMobile().substring(0, 1)) == 1) { client.setOrder(Global.XMYN_RTU_4202); } else if(Integer.parseInt(client.getMobile().substring(0, 1)) == 3) { //获取设备地址码. int index = Integer.parseInt(client.getMobile().substring(8, client.getMobile().length())); //获得数据召回指令. String instruct = CRC16Util.toHexFormat(index).concat(Global.XMYN_RTU_RECALL); //设置CRC16数据召回指令. client.setOrder(instruct.concat(CRC16Util.toModbus(instruct))); } else { client.setOrder(Global.XMYN_RTU_4212); } } } /** * 存储解析后的数据信息. * @param client:客户端对象. * @param data1:第一路模拟量. * @param data2:第二路模拟量. * @param data3:第三路模拟量. * @param data4:第四路模拟量. * @param data5:第五路模拟量. * @param data6:第六路模拟量. * @param data7:第七路模拟量. * @param data8:第八路模拟量. **/ private static void toHandleData(Client client, String data1, String data2, String data3, String data4, String data5, String data6, String data7, String data8 ) { try { HeatAnalyze heatAnalyze = new HeatAnalyze(); heatAnalyze.setCode(client.getCode()); heatAnalyze.setSim(client.getMobile()); heatAnalyze.setDatatime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); heatAnalyze.setView005(data1); heatAnalyze.setView006(data2); heatAnalyze.setView007(data3); heatAnalyze.setView008(data4); heatAnalyze.setView009(data5); heatAnalyze.setView010(data6); heatAnalyze.setView011(data7); heatAnalyze.setView012(data8); JdbcInstance.save("com.surfbird.business.dao.HeatAnalyzeDao.save", heatAnalyze); } catch (Exception e) { e.printStackTrace(); } } /** * 处理RTU上报的数据信息(老款). * @param client:通信客户端对象. * @param data:解析后的数据. **/ private static void toHandleData4202(Client client, String data) { try { data = data.substring(14, data.length()); String data1 = data.substring(0, 4); String data2 = data.substring(8, 12); String data3 = data.substring(16, 20); String data4 = data.substring(24, 28); String data5 = data.substring(32, 36); String data6 = data.substring(40, 44); String data7 = data.substring(48, 52); String data8 = data.substring(56, 60); DecimalFormat format = new DecimalFormat("#####0.##"); data1 = format.format(Integer.parseInt(data1, 16)/100.0); data2 = format.format(Integer.parseInt(data2, 16)/100.0); data3 = format.format(Integer.parseInt(data3, 16)/100.0); data4 = format.format(Integer.parseInt(data4, 16)/100.0); data5 = format.format(Integer.parseInt(data5, 16)/100.0); data6 = format.format(Integer.parseInt(data6, 16)/100.0); data7 = format.format(Integer.parseInt(data7, 16)/100.0); data8 = format.format(Integer.parseInt(data8, 16)/100.0); DataHandle.toHandleData(client, data1, data2, data3, data4, data5, data6, data7, data8); } catch (Exception e) { e.printStackTrace(); } } /** * 处理RTU上报的数据信息(新款). * @param client:通信客户端对象. * @param data:解析后的数据. **/ private static void toHandleData4212(Client client, String data) { try { data = data.substring(22, data.length()); String data1 = data.substring(0, 4); String data2 = data.substring(4, 8); String data3 = data.substring(8, 12); String data4 = data.substring(12, 16); String data5 = data.substring(16, 20); String data6 = data.substring(20, 24); String data7 = data.substring(24, 28); String data8 = data.substring(28, 32); DataHandle.toHandleData(client, DataFormula.toSmallerHundred(data1), DataFormula.toSmallerHundred(data2), DataFormula.toSmallerHundred(data3), DataFormula.toSmallerHundred(data4), DataFormula.toSmallerHundred(data5), DataFormula.toSmallerHundred(data6), DataFormula.toSmallerHundred(data7), DataFormula.toSmallerHundred(data8)); } catch (Exception e) { e.printStackTrace(); } } /** * 记录数据采集日志. * @param content:日志内容. * @param label:日志说明. **/ private static void toInstrucation(String content, String label) { try { //日志对象. Instrucation insObject = new Instrucation(); //设置日志内容. insObject.setContent(content); //设置日志描述. insObject.setInstrucation(label); //插入日志信息. JdbcInstance.save("com.surfbird.business.dao.InstrucationDao.save", insObject); } catch (Exception e) { e.printStackTrace(); } } }