grgw_wdcj_java/wsdjc/.svn/pristine/ab/ab48c7a62f1841a844f170eb725...

250 lines
9.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}