接触一个知识就得记录下来,经验之谈很重要,隔一段时间就只记得自己干过这事,却不记得具体是啥事了。
1、磁有正反两级,接触强磁可以改变附着材料的极性。这就是写磁道。
2、磁头通电,信号在经过放大,磁卡刷过时会得到如下的模拟信号。
蓝色-磁头输入信号放大后的波形
黄色-峰值检测电路后二值化的波形
开始刷卡时的波形(包含干扰信号和前导0)
开始有数据了
一句话概括:一个bit周期内有电平翻转,记作1,无电平翻转记作0.
那如何知道bit周期呢?所以就需要前导0,没注意到规范里要多少个前导0,建议10个以上。
每个bit-0占用一个bit周期,当找到足够多基本相同周期的脉宽,就标记为前导0,其周期就为bit周期。
有了上面的规范及理论支持,就来解一解数据
磁道3的起始字符为 ' ; ' ,bit存储由低位在前,拉开为 11010,从上就找到了起始信号。之后依次解析两个数据 00001=> 0 , 00001=> 0
一直找到结束字符 '?'为止,字符'?'后一个为LRC校验,用于校验整个磁道数据的正确性。
实际的三轨道数据如下,这么多数据当然要交给代码。
人眼可见,能直观看出脉宽长短,可见bit(0),bit(1).但是机器实现起来就有点不简单了。
如何分析出脉宽是0还是1。对机器而言得有规则。
在ISO/IEC 7811-2: 2001(E)中有做规定,有条件可以自行查看
规则中限定 0,85 Bin ≤ Bin+1 ≤ 1,15 Bin,0,70 Bin/2 ≤ Sin+1 ≤ 1,30 Bin/2,
上表允许脉宽实际和理论有15%的偏差。但实际受刷卡速度以及其他外界的干扰,并非如此理想。
刷卡速度不是稳定的,bit周期会变。所以我实际使用的规则如下:
解算磁道bit时会最多使用新的4个脉宽时间作为对比,四个脉宽时间记作d_0,d_1,d_2,d_3,2个bit周期记作Preiod
定义:
sum0_1 = d_0 +d_1
sum0_2 = sum0_1 + d_2
sum0_3 = sum0_2 +d_3
sum1_2 = d_1 +d_2
规则1、(d_0 > sum1_2 * 3 / 4) 时, d_0 记作 bit(0)
规则2、(d_2 > sum0_1 * 3 / 4) 时,d_0,d_1记作 bit(1) d_2 记作bit(0) ,更新Preiod = sum0_2
规则3、(d_0 > d_2 * 2 * 3 / 4 && d_1 > d_2 * 2 * 3 / 4 && d_2 < d_3 * 5 / 4 && d_2 > track-> d_3 * 3 / 4) 时,d_0记作bit(0),d_1记作bit(0),d_2、d_3记作bit(1) Preiod = sum0_3 * 2 / 3;
前三个规则都是采用前后脉宽的比列关系做一次筛选。后面用bit周期做筛选标准。
规则4、 Preiod <= sum0_1 时,d_0记作bit(0),d_1记作bit(0) ,更新Preiod = sum0_1
还有很多规则就不一一陈述,越到后面,所渗透下来的数据就越离谱。