250 lines
9.0 KiB
Plaintext
250 lines
9.0 KiB
Plaintext
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();
|
||
}
|
||
}
|
||
}
|