第一章 磁条卡基础:从物理结构到数据格式
各位同学好,我是老张。做嵌入式这些年,跟磁条卡读卡器打了不下十年交道。今天咱们聊聊磁条卡的基础知识。别看这玩意儿现在被芯片卡抢了风头,但在POS机领域,磁条卡读卡器依然是标配——毕竟存量太大了。
说白了,磁条卡就是个带磁条的塑料卡片。但这里面的门道,比你想象的多。
1.1 磁条卡的物理结构
磁条卡由三部分组成:基片、磁条和保护层。基片通常是PVC材质,厚度0.76mm左右——这是ISO标准规定的。磁条呢,是涂覆在卡片背面的磁性材料,宽度大约6mm。
我记得刚入行那会儿,有个项目死活读不出卡。折腾了两天,最后发现是磁条磨损太严重。嗯,这里要提醒大家:磁条是消耗品,读写次数多了会退化。
关键尺寸:
- 卡片尺寸:85.6mm × 53.98mm(ISO 7810 ID-1标准)
- 厚度:0.76mm ± 0.08mm
- 磁条宽度:6mm(Track1+Track2+Track3共用)
- 磁条位置:距卡片上边缘约4mm
磁条上分布着三个磁道。你可能会问:为什么是三个?其实早期只有两个,后来为了扩展功能才加了第三个。我个人习惯把磁道想象成三条并排的跑道,每条跑道上跑着不同的数据。
1.2 磁道数据格式详解
三个磁道,各有各的规矩。咱们一个一个说。
Track1(磁道一)
Track1是密度最高的磁道,记录密度210BPI(每英寸比特数)。它用7位编码(含1位奇偶校验),能存79个字符。说白了,它主要存字母数字混合信息。
格式长这样:
起始符 + 主账号 + 分隔符 + 姓名 + 分隔符 + 过期日期 + 服务代码 + 其他数据 + 结束符 + LRC
举个例子:
%B1234567890123456^ZHANG/SAN.^2405121000000000000000?
其中:
% 是起始符
B 是格式代码(表示银行/金融卡)
^ 是分隔符
? 是结束符
最后一位是LRC校验
我的经验:Track1的姓名域经常出问题。有些卡发行方会在姓名里加特殊字符,比如连字符、点号。我曾经遇到过一个客户,名字里有"O'Brien",结果读卡器解析到单引号就崩了。所以驱动里一定要做好异常字符过滤。
Track2(磁道二)
Track2是POS机最常用的磁道。密度75BPI,用5位编码(含1位奇偶校验),能存40个字符。它只支持数字0-9,以及分隔符"="和">"。
格式更简洁:
起始符 + 主账号 + 分隔符 + 过期日期 + 服务代码 + 其他数据 + 结束符 + LRC
实际数据长这样:
;1234567890123456=24051210000000000000?
; 是起始符
= 是分隔符
? 是结束符
注意:Track2没有姓名字段。很多新手以为Track2能读出持卡人姓名,其实不行。姓名只在Track1里。我见过有人写驱动时把Track2的姓名域解析成乱码,就是因为没搞清楚这个区别。
Track3(磁道三)
Track3密度跟Track2一样,也是75BPI,但能存107个字符。它主要用于一些特定应用场景,比如ATM机的离线交易记录。说实话,我在POS机项目里用到Track3的情况很少,大概十次里有一次吧。
格式:
起始符 + 主账号 + 分隔符 + 国家代码 + 货币代码 + 其他数据 + 结束符 + LRC
1.3 ISO 7810/7811标准解读
这两个标准是磁条卡的"宪法"。不读懂它们,你写的驱动就是空中楼阁。
| 标准编号 | 内容 | 我的理解 |
|---|---|---|
| ISO 7810 | 卡片物理尺寸、厚度、弯曲强度等 | 决定了读卡器的机械结构怎么设计 |
| ISO 7811-1 | 磁条物理特性(矫顽力、剩磁等) | 决定了读卡磁头的电气参数 |
| ISO 7811-2 | 磁道位置、宽度、间距 | 决定了磁头对准精度要求 |
| ISO 7811-3 | Track1编码方式(7位+奇偶) | 决定了数据解码算法 |
| ISO 7811-4 | Track2/Track3编码方式(5位+奇偶) | 同上,但位宽不同 |
| ISO 7811-5 | 数据格式、起始符/结束符定义 | 决定了数据帧结构 |
这里有个坑,我当年踩过。ISO 7811-2规定磁道间距是2.92mm,但有些非标卡会偏离这个值。如果你的读卡器磁头固定死了,遇到这种卡就可能读不出来。所以我现在设计驱动时,都会加一个磁道偏移校准功能。
1.4 数据校验机制
磁条卡数据不是裸奔的,它有一套校验体系:
- 奇偶校验:每个字符都有1位奇偶位,确保数据完整性
- LRC校验:纵向冗余校验,对整个数据块做异或运算
- 格式校验:检查起始符、结束符、分隔符是否合法
为什么需要这么多校验?你想想看,磁条卡是靠磁头划过磁条来读数据的。刷卡速度快慢、磁条脏污、电磁干扰,都会导致数据出错。没有校验,你读出来的可能就是一堆乱码。
避坑指南:我曾经遇到一个案例,读卡器在冬天老是报错。排查后发现是静电干扰导致LRC校验失败。解决方案是在驱动里加了一个重试机制——如果LRC校验失败,自动重读3次。成功率从82%提升到了99.5%。
1.5 实际开发中的注意事项
最后,分享几个我在项目中积累的经验:
- 不要假设数据完美:磁条卡数据经常有噪声,驱动里要做好容错处理
- 注意刷卡方向:磁条朝下、朝前刷卡是标准方向,但有些用户会反着刷
- 处理空数据:有些卡只有Track2,没有Track1。驱动要能优雅处理
- 速度自适应:不同人刷卡速度差异很大,驱动要能自适应
好了,第一章就到这里。磁条卡的基础知识是后面所有章节的基石。下一章咱们聊磁头的工作原理和信号调理电路——那才是真正跟硬件打交道的地方。
公众号:蓝海资料掘金营,微信deep3321