在前言中,我是java新手(所以请接受我的建议,lol),但以下是我要做的:
我有一个gps冰球,我正在通过usb读取。gps冰球使用一些用户界面,但我正在尝试捕获数据,以便用于我自己的应用程序。我正在从串行缓冲区读取数据包,并试图将其拆分为有效负载,并将字段分解为哈希Map(不确定这是否是正确的应用程序)。
我想补充一点,在这种情况下,我关心效率的原因是,由于gps圆盘不断获取sat数据(大约每200/300ms),因此数据处理速度将相当快,因此,如果可能,我会尽量避免任何瓶颈。
这是我抛出的代码,我知道在代码中缓冲区没有读取任何内容,只是为了删除冗余代码,只要假设注解中写入的数据是我们在sys.out中所说的。
/*
Assume this is serial data received from GPS serial packet:
B5 62 01 02 1C AA AA AA AA 01 02 03 04 0A 0B 0C 0D B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4 E1 E2 E3 E4 01 02;
| | / | / |
| \ len \ / CRC
/ | \ /
/ | \ PAYLOAD /
Header | \ /
class & id \ /
* /
HashMap<String, String> payloadDict = new HashMap<String, String> (); // HashMap to write to
Bytes[] buffer; // serial buffer
String byteToHex = DataTypeConverter.parseHexBinary(buffer); // converts byte data to string in Hex
// Since the first few fields in the packet are static (header, class & id, and len),
// I strip the HEX string to only contain the payload
int payloadStartIndex = byteToHex.indexOf("C") + 1;
String payload = byteToHex.substring(payloadStartIndex, payloadStartIndex + 29);
/*
Assume this is the payload string after we parse:
AA AA AA AA 01 02 03 04 0A 0B 0C 0D B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4 E1 E2 E3 E4
**added seperation every 2 hex values for readability,
but assume it's just one giant string
* /
// write to HashMap
payloadDict = NAV_POSLLH(payload);
/*
so to visualize what I would imagine being saved to the HashMap:
iTOW: AA AA AA AA
lon: 01 02 03 04
lat: 0A 0B 0C 0D
height: B1 B2 B3 B4
hMSL: C1 C2 C3 C4
hAcc: D1 D2 D3 D4
vAcc: E1 E2 E3 E4
* /
public Map<String, String> NAV_POSLLH(String dataArr) {
// Temp HashMap
HashMap<String, String> dict = new HashMap<String, String> ();
/*
this is the payload format.
payloadStructure are the names of the all the fields I want to parse
and hexOffset are the beginning of each field.
*/
String[] payloadStructure = new String[6] {"iTOW", "lon", "lat", "height", "hMSL", "hAcc", "vAcc"};
int[] hexOffset = new int[6] {0, 7, 11, 15, 20, 24};
// loop through each field
for(int i = 0; i < byteOffset.length; i++) {
String parse = "";
// I am not sure if this is the best way to handle out of index errors
// in java, but this is what I thought would work
if(byteOffset[i] == 24) {
parse = dataArr.substring(hexOffset[i]);
map.put(payloadStructure[i], parse);
return dict;
}
// parse the substring from the beginning of each hex offset
// to the next index -1
parse = dataArr.substring(byteOffset[i], hexOffset[i+1] -1);
map.put(payloadStructure[i], parse);
// finally return HashMap
return dict;
}
}
我不确定这些评论是否能很好地解释数据包的结构,或者它是否令人困惑(因为格式很简陋),所以我附上了我制作的数据包布局的截图。
所以我想问的是:基于我所要完成的,这是一种有效的甚至是正确的实现方式吗?我不确定我是否有什么明显的遗漏。
我现在无法编译或测试任何代码,所以我只是试图将输出可视化,哈哈。非常感谢任何人的意见!
1条答案
按热度按时间5jdjgkvh1#
我会做一个
Packet
类并使用ByteBuffer
. 该类有很好的解析方法,包括各种原语大小的批量get方法。你可以考虑使用ByteBuffer
对于该类的有效负载成员