《一个菜鸟应用软件工程师的成长故事》(2)
在看了三个礼拜的基于PBOC2.0的POS规范后,今天来梳理一下这段时间的学习内容。
由于规范里的内容比较多,这里就不讲那么仔细了,我打算在分析一份数据包的同时,穿插复习以前学过的知识。
下图就是一份主机从网控器收到的消费数据包(用两位十六进制数表示一个字节)。
相信很多人第一次接触到这种数据元都会抹眼黑,啥也看不懂,我也是,说实话,我是听了我们技术总监的讲课后才明白这是怎么回事的,现在虽然能看懂,但还不是很熟练。废话少说,我们来看看这是怎么回事(数据包里的字节按从左到右的顺序来排列)。
首先,从第1个字节开始。02,转化为二进制就是0000 0020,它表示这份数据的开始,几乎每份数据包都有它的存在。
第2、3个字节是表示后面数据(即8583包)的长度大小,01 06表示8583包的大小为106个字节,即从第4个字节到第109个字节(即倒数第2个字节03)。其中,03为结束符,03前一个字节31则是crc校验:从第2个字节到结束符03(包括03)之间的异或结果。
第4个字节到第7个字节是网控地址,即tpu:60 00 07 08 08。
第8、9个字节是8583包的开始,它表示交易信息码(MSGID),02 00表示交易类型为消费,即消费信息码。
第10到第17个字节(30 20 05 00 20 c0 02 01)是数据包的位图,位图一共有8个字节(64位)。先将位图转换为二进制(0011 0000 0010 0000 0000 0101 0000 0000 0010 0000 1100 0000 0000 0010 0000 0001),由于第一位不是1,所以除了这个位图外,数据包中没有扩展位图;从这个二进制序列中,我们可以很容易地得知,位图依次包含以下几个域:3,4,11,22,24,35,41,42,55,64。
其实,从30到31就是8583数据包,即通常说的数据元。
位图之后,跟着的是域的信息,域的属性主要有如下几种:
a 表示字符,
n 表示数字,
s 表示特殊字符,
b 表示二进制,
z 磁道编码。
首先,我们来看位图后面的第一个域,即3域。
第3域:
名称:交易处理码
属性:n6
类型:BCD
截取字符:00 40 00
如此,原始数据为:004000
从这个例子可以看出,只要我们从位图上确定了某个域的存在,然后就可以在相应的位置找到该域,然后很据它的属性与类型来确定原始数据。
类似地,可以得出接下来几个域表示的信息。
第4域:
名称:交易金额
属性:N12
类型:BCD
截取字符:00 00 00 00 00 99 80(金额是以分为最小单位的,左补零)
原始数据为:99.80
第11域:
名称:受卡方系统跟踪号(即流水号)
属性:n6
类型:BCD
截取字符:00 00 01
原始数据为:000001
第22域:
名称:服务点输入方式码
属性:n3
类型:BCD
截取字符:00 21(左补零)
原始数据为:021
第24域:
名称:国际网络识别符
属性:n3
类型:BCD
截取字符:00 03(左补零)
原始数据为:003
第35域:
名称:2磁道数据
属性:z..37(长度为37,取整后有19个字符)
格式:LLVAR(可变长)
类型:BCD
截取字符:37 62 14 02 10 00 07 41 50 78 d1 56 07 12 20 10 00 00 00 00
原始数据为:62 14 02 10 00 07 41 50 78 d1 56 07 12 20 10 00 00 00 0
第41域:
名称:受卡机终端标识码(即终端号)
属性:ans8(字母,数字,特殊字符皆可,长度为8)
类型:ASCⅡ
截取字符:31 32 33 34 35 36 37 38
原始数据为:12345678(1的ASCⅡ码为31,因此很容易得出这个结果)
第42域:
名称:收卡方标识码(即商户号)
属性:ans15
类型:ASCⅡ
截取字符:30 34 33 20 20 20 20 20 20 20 20 20 20 20 20
原始数据为:043
第55域:
名称:IC卡数据域
用法:未知(55域有很多用法,这里不确定是用哪种)
属性:未知
类型:未知
截取字符:ce 8e b2 00 18 03 1e 9a
原始数据为:未知
第64域:
名称:MAC
属性:b64
类型:BINARY
截取字符:00 06 30 30 30 30 30 31 00 06 30 30 30 30 30 30 00 06 30 30 30 30 30 31
原始数据:00000000 00000110 00110000 00110000 00110000 00110000 00110000 00110001 00000000 00000110 00110000 00110000 00110000 00110000 00110000 00110000 00000000 00000110 00110000 00110000 00110000 00110000 00110000 00110001
-------------------------------------
以上就是对这份消费数据包的分析,除了第55域我还没弄懂外,其他的可以说是基本理解了。总的来说,数据包的分析并不难,关键是了解数据包是对应什么类型,然后在此基础上参照具体的模板分析出数据包里传输的信息。当然,在熟练之后,一眼就能看出某个数据包是用来干嘛的。
写了那么多,其实也就是涉及了POS规范里的一点点内容罢了,像POS终端管理、终端交易、终端界面和终端交易处理流程都没有提到,这些都是学习POS规范要求掌握的知识点。鉴于篇幅有限,就留在下篇整理吧。
今天培训的时候,还讲到了安全加密方面的知识,有时间的话,我也整理一些心得体会出来。So,就到此为止吧~