数据采集核心思想实现
1数据连接
也就socket常连接,由于netty在socket连接的出色性能,用netty做socket的连接框架
2数据传输
16进制方式进行传输
3数据解析
对于数据解析是重中之重,有没有好的方法对数据进行管理呢?对于一行数据,谁该处理他呢?该框架的核心思想就在于次。参考spring的核心思想,配置+数据bean。
数据解析之配置封装
比如现在有一台设备,可以上传一个人血压信息,血糖信息。为了传输这三个信息,要设置两条指令,
血压数据
开始码(两位) 指令码(两位) 机器编号 (九位)高压(三位)低压(三位)心率(三位)上传时间(十二位)
10进制 &123456789140080060201606011002@
& (开始码)(指令码16进制02,字符无法打印)123456789(机器编号)140(高压) 080(低压) 060(心率) 201606011002 (上传时间) @(结束码)
16进制 26 02 31 32 33 34 35 36 37 38 39 31 34 30 30 38 30 30 36 30 32 30 31 36 30 36 30 31 31 30 30 32 40
血糖数据
开始码(两位) 指令码(两位) 机器编号 (九位)血糖值(四位,前两位整数位,后两位小数位)上传时间(十二位)
10进制 &1234567891001201606011002@
& (开始码)(指令码16进制02,字符无法打印)123456789(机器编号)1001(血糖值,表示为10.01)
201606011002 (上传时间) @(结束码)
16进制 26 03 31 32 33 34 35 36 37 38 39 31 30 30 31 32 30 31 36 30 36 30 31 31 30 30 32
需求摆着,那怎么配置呢
第一需要配置指令表,也就是多少个指令,供指令的路由分发
配置文件routeBaseMapper.properties
内容 baseMapper=02,pressure;03,blood 意思,02指令路由到血压。03指令理由到血糖
第二需要配置指令解析,对应着每条指令的解析
driverMapper=code,0,2; 解除解析,就是把每条数据的指令码拿到
prssure=driverNumber,2,11;up,11,14;down,14,17;bp,17,20;upTime,20,32; 血压对应配置
blood=driverNumber,2,11;blood,11,15;upTime,15,27; 血糖对应配置
配置有了,也就很轻松的把每条数解析成对应的数据bean了
接下来就是如何处理把数据通过配置解析成数据bean
数据解析之如何把数据解析成功bean
RouterKeyDefination 对应每一条数据指令的配置
package com.glufine.common;
import java.util.ArrayList;
import java.util.List;
public class RouterKeyDefination {
/**
* 路由表达key结果集
*/
private List<RouterSplitDefination> keyDefinations = new ArrayList<RouterSplitDefination>();
/**
* 当前分发器所属类别
*/
private String keyName;
public RouterKeyDefination(String keyName) {
super();
this.keyName = keyName;
}
public String getKeyName() {
return keyName;
}
public void putKey(RouterSplitDefination value){
keyDefinations.add(value);
}
public void removeKey(RouterSplitDefination value){
keyDefinations.remove(keyDefinations.indexOf(value));
}
public List<RouterSplitDefination> getKeyDefinations(){
return keyDefinations;
}
public RouterSplitDefination getFirstSplitDefination(){
return keyDefinations.get(0);
}
public RouterSplitDefination getSplitDefinationByindex(int index){
return keyDefinations.get(index);
}
}
RouterSplitDefination对于一条指令中每个数据分割单位的定义 比如高压
package com.glufine.common;
public class RouterSplitDefination implements Cloneable{
private String spiltKey;
private String splitValue;
private int start;
private int end;
public RouterSplitDefination(String spiltKey, int start, int end) {
super();
this.spiltKey = spiltKey;
this.start = start;
this.end = end;
}
public RouterSplitDefination() {
super();
}
/**
* 大于0正向截取,小于0,逆向截取
* @param sourceValue
*/
public void genarateSplitVale(String sourceValue){
if(end<0 || start<0){
end = sourceValue.length()+end;
start = sourceValue.length()+start;
}
splitValue = sourceValue.substring(start, end);
}
public String getSplitValue() {
return splitValue;
}
public void setSplitValue(String splitValue) {
this.splitValue = splitValue;
}
public String getSpiltKey() {
return spiltKey;
}
public void setSpiltKey(String spiltKey) {
this.spiltKey = spiltKey;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public RouterSplitDefination clone() {
RouterSplitDefination o = null;
try {
o = (RouterSplitDefination) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}
}