我试图对血糖仪的串行接口进行逆向工程..本质上是试图从java程序而不是从仪表本身上传数据(允许我从不同来源上传数据)。数据发送有一些形式的校验和,到目前为止,我无法创建重新创建所用校验和数字(或数字)的代码。
我有从仪表到目标程序的上传的完整通讯跟踪
我用来检查我的工作的两个传输如下:
日期: 06 02 30 36 31 34 31 30 30 31 36 42 04 06
...转换为[ACK] [STX] 061410016B [EOT] [ACK]
此传输的相关部分是字符串" 141001" ..代表年份= 14(2014),月= 10(10月),日= 01(第1)。
我并不赞成" 06"在字符串的乞讨是。 " B"最后,我认为是校验和," 6"就在它可能是校验和的一部分之前......但是尽管传输了日期,但似乎保持不变。
时间: 06 02 30 36 30 38 33 31 30 39 36 44 04 06
...转换为[ACK] [STX] 060831096D [EOT] [ACK]
此传输的相关部分是083109,代表上午8:31:09 .... < br />
再一次,弦乐从06开始,以6结束......但是这个以一个&#39; D&#39;结尾。这可能是校验和。
<小时/> 我已经用各种形式的字符串尽我所能地尝试了许多算法 没有ACK,没有ACK和STX,没有ACK,STX和06,没有ACK&#39; 6&#39;以及所有这些排列。
我认为前导字符可以指代相关数字的数量..在日期/时间中每个都有6个相关数字。
其他变速器似乎也是如此
06 02 30 34 30 39 31 30 36 36 04 06 [ACK] [STX] 04091066 [EOT] [ACK]
(以04 ..开头有4位数字,然后是2位尾随数字)
06 02 30 38 31 34 38 39 34 34 39 35 36 36 04 06 [ACK] [STX] 081489449566 [EOT] [ACK](以08开头,有8位数字,带2个尾随数字)
但其他人后来不一定排队。
02 31 32 30 31 33 32 31 31 33 37 32 35 30 39 31 34 30 30 30 30 36 31 03 [STX] 1201321137250914000061 [ETX]
我知道此字符串的部分内容是
132:阅读
1137:11:37 AM
250914:2014年9月25日
所以这里没有12位数或120位......所以这是一个谜。
我已经没有想法尝试了......任何对支票数字有更多经验的人都有猜测吗?可能是某种CRC?如有必要,我可以提供更多的例子
更新:当我发送接受原始堆栈跟踪中发送时间的时间时,字符的顺序似乎并不重要:[ACK] [STX] 060831096D [ EOT] [ACK]但它也接受[ACK] [STX] 060931086D [EOT] [ACK] IE,我可以切换秒和分钟而不会明显影响校验和..我认为这个规则CRC以及其他一些校验和标准......
更改此字符不会对校验和产生影响,因为将其更改为7不会被另一方拒绝。 [ACK] [STX] 0的 6 0831096D [EOT] [ACK]
更改此字符确实导致另一方拒绝记录..因此它在校验和中使用或者是校验和的一部分。但是在我看到的300-400条记录中,所有这些记录都是6条记录。 [ACK] [STX] 06083109的 6 d [EOT] [ACK]
答案 0 :(得分:0)
看起来它只是字符串中有意义部分的XOR。感谢@EJP让我指出了正确的方向。
对于日期,我将粗体部分发送到函数[ACK] [STX] 06 141001 6B [EOT] [ACK]
getChecksum函数返回&#34; B&#34;
该功能如下所示
private static String getChecksum(String s){
int i = 14;
byte xorChecksum = (byte)i;
byte[] ba = s.getBytes();
for(int j = 0; j < ba.length; j++){
xorChecksum ^= ba[j];
}
Byte b = new Byte(xorChecksum);
System.out.println("i: "+i+" - "+b.intValue());
return toHex(b.intValue());
}
答案 1 :(得分:0)
([数字之和]%256)%16只是(数字之和)&amp; 0xF。你是对的,它不能成为CRC。它必须是数字的总和或XOR。尝试使用除零以外的起始值的XOR。我认为它是在STX和EOT之间的整个消息上计算的,两者都是独占的,但是尝试它排除和包括长度。
好奇它正在使用EOT而不是ETX。