射频识别技术漫谈(6)——通讯协议概述
通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等。在这里通迅的双方指的是读写器和卡片。
首先是谁先发起通讯,很显然有两种,读写器先发言和卡片先发言。前一种叫ReaderTalk First,简称为RTF;后一种叫Tag TalkFirst,简称为TTF。
我们知道,卡片从读写器产生的射频场获得工作时需要的能量,一般认为应该是读写器主动,卡片被动才对,这也是人之常情。所以多数功能稍复杂的卡片都是采用RTF模式,即读写器问,卡片回答。读写器没有命令,卡片是无论如何也不能主动说话的。但是有些卡片功能单一,每次与读写器的交流中只会回答一个问题,而且每次内容都相同。对于这种卡片,似乎再让读写器每次先提问已经没有什么意义了,还不如每次与读写器交流直接让卡片先说它那永远不会变的一句话得了,于是就有了TTF模式。TTF模式的卡片一般都是我们常说的ID卡,即识别卡,ID卡每次说的相同的一句话都是一个识别号,读写器利用这个识别号确定持卡者的身份。
其次是交流的秩序。对TTF卡片当然没什么秩序可言了,一进入射频场卡片就自说自话。但对RTF的卡片一般有严格的顺序,如下图所示:
第一步是读写器呼叫卡,如果射频场中有读写器支持的卡片,卡片将回送一个应答,告诉读写器自己是什么类型的卡片。
然后读写发出命令选中卡片,如果射频场中有多张卡片,通常还要进行防冲突循环以便决出唯一张卡片进行操作。
第三步是进行认证,一方面读写器要认证卡片是合法的,另一方卡片也要认证读写器是合法的。
如果认证顺利通过,就可以进行正常的读写数据操作了。
这些步骤并不都是必须的,有些简单的卡片,要求操作前用户把卡片放到读写器上,读写器直接对其进行读写操作,前面的3步都省了;有些卡片没有密码,当然不需要相互认证;有些卡片不支持防冲突,同时有多张卡片时将无法操作;还有些卡片将呼叫和防冲突用一个步骤代替。所以对于具体的卡片,要仔细阅读其说明书,进行具体的分析。
还有一类卡片既可以工作在TTF模式,又可以工作在RTF模式。两种模式之间的切换一般有两种方式:一种是卡片刚进入射频场上电复位后会等待一个固定时间,在这段时间内如果有读写器的命令,则工作在RTF模式,如果没有收到命令则进入TTF模式。另一种是卡片上电后主动在RTF与TTF之间不停的切换,在TTF模式下发送完一个识别号后,立即进入RTF模式等待读写器的命令,如果有命令则执行命令,没有命令则退出RTF模式返回TTF模式继续发送识别号,之后进行下一次的切换。
最后还有一个全双工(Full Duplex,FDX)和半双工(Half Duplex,HDX)的概念。在有线通讯中,我们知道全双工就是通讯双方可以同时双向通讯,半双工就是虽能双向通讯,但某一时刻只能有一个方向通讯。一般来说当然是全双工好,如果技术上能实现全双工,当然最好不用半双工;成本上全双工贵,半双工便宜。但在射频识别技术中FDX和HDX并不是这个意思。在ISO11785中对FDX和HDX的定义如下:
FDX:标签和读写器在读写器产生的磁场没有消失的情况下进行通讯。
HDX:标签和读写器在读写器产生的磁场停止之后进行通讯。
RFID技术中FDX的例子如Mifare系列卡片,HDX的例子如TI公司的134.2KHz标签,如RI-TRP-WR2B。目前的射频卡FDX比较多,因为射频卡无源,需要从读写器的射频场取电,射频场不消失,卡片可以源源不断的取电,对卡片内部的储能电路要求不高。缺点是卡片回送数据时因为自己不能产生射频场,只能被动发送,所以一般采取负载调制的方法回送数据。HDX在读写器的射频场停止后回送数据,读写器对卡片数据的识别解调容易。缺点是对卡片的储能电路要求较高,而且回送数据量有限。成本上HDX也未必比FDX便宜。
射频识别技术漫谈(7)——ID卡
ID(Identification)是识别的意思,ID卡就是识别卡。ID卡包含范围广泛,只要具有识别功能的卡片都可以叫ID卡,例如条码卡,磁卡都可以是ID卡,我们这儿说的当然是射频识别卡。
射频ID卡一般都工作在TTF模式,进入射频场得电后不停地发送自己的识别号。最初识别卡是用来识别人的,用5个字节40位二进制数表示,可以识别大约一万亿人,估计是因为考虑到一万亿太多了,一般ID卡使用时只使用低位的4个字节,而把最高位的一个字节作为厂家标识或版本号使用。这样4字节32位二进制数可以识别43亿人,在当时全世界每人一个识别号也足够了。当然后来又发展到卡号可以随便复制,这是后话。
为了检查数据传输中是否发生了错误,射频识别卡对每个字节都增加了两个校验位,其中高半字节一个,低半字节一个,这样每个字节增加到10位二进制数,5个字节共有50位。为了校验数据的整体性错误,射频ID卡还增加了一个4位的纵向冗余检验,这样整个ID卡数据增加到54位。当进入射频场时,如果卡片直接回送这5个字节,那么读写器很难确定起始位和结束位,所以射频识别卡又增加了9个二进制“1”在前面作起始位,增加了一个二进制“0”在后面作结束位,这样ID卡就有了64位数据,正好8个字节。其排列如下图所示:
例如卡号为2100A5EAD9的卡片,其编码格式为
1 1 1 1 1 1 1 1 1 9个“1”的起始位,也叫头部
0 0 1 0 1 “2”
0 0 0 1 1 “1”
0 0 0 0 0 “0”
0 0 0 0 0 “0”
1 0 1 0 0 “A”
0 1 0 1 0 “5”
1 1 1 0 1 “E”
1 0 1 0 0 “A”
1 1 0 1 1 “D”
1 0 0 1 0 “9”
1 1 0 0 0 列偶校验和结束位“0”
射频ID卡的数据编码一般使用曼侧斯特码或两项码,传送数据的速率用传送一位二进制数据使用几个单位载波表示。常用的有64载波,32载波,16载波,在125KHz的频率下,一个载波的时间是8微秒,因此相应的位宽为512微秒,256微秒,128微秒。对应的数据传输速率为2K(1953)、4K(3906)、8K(7813)。我们平常使用的大多是2K曼侧斯特编码的ID卡。下图是使用HTRC110芯片读卡时,卡号为2100A5EAD9的卡片从数据输出脚DOUT输出的实测波形。
软件解码时可以使用查询或中断检测跳变,配合定时器确定脉宽,根据跳变沿的方向确定数据。
为了和128位的动物识别标签相区别,业内一般称这种64位的ID卡格式为“ID64格式”。
射频识别技术漫谈(8)——动物标签
动物标签也是工作在TTF模式的ID(Identification)卡。之所以通常称为动物标签,估计是因为一来和识别人的ID卡相区分,二是因为动物不如人听话,人的ID卡可以做成卡片形状拿在手上,而动物不会用四肢持卡,要么做成小玻璃管状用设备注射到皮下,例如小狗小猫等宠物,要么做成耳钉订在耳朵上,例如猪耳标,要么做成环状套在腿上,例如信鸽的脚环。
动物识别标签的通讯方式分为全双工(FDX)和半双工(HDX),全双工是标签回送数据时读卡器产生的射频场不消失,半双工是标签回送数据时读卡器产生的射频场消失。目前市场上以全双工模式居多,下面具体说明全双工模式。
尽管生物物种不停地灭绝,但国际标准的制定者们还是坚定的认为世界上的动物比人多的多,所以全双工模式的动物标签足足有128位,是ID64识别卡的两倍。按顺序依次是11位的头部,64位的识别码,16位的CRC校验,24位的尾部。另外还有13位的控制位。
11位的头部是固定的“00000000001”,用来引导和同步。
64位的识别码是标签的主体部分,包括1位动物识别标志,14位的保留位,1位附加数据标志,10位国家码和38位识别号。动物识别标志表示这个标签是不是动物标签,为1表示是动物标签,为0表示不是动物标签。14位的保留位保留将来使用(RFU)。附加数据标志位表示在64位的识别码之后是否有另外的数据需要接收,1表示有,0表示没有,一般情况此位为0。10位国家码一共可以表示1024个国家,世界上本来就没有这么多国家,于是规定其中的900-998用来表示独立的标签制造商,999表示这个标签是一个测试用的标签,标签的***可能不是全国唯一的。38位的识别号表示在一个国家之内的唯一***,当然是在国家码不等于999的情况下。
16位的CRC校验用来对前面的64位识别码进行错误检查,看是否在传输的过程中发生了错误。
24位的尾码没有规定什么内容,一般填0。
前面的64位的识别码,16位的CRC校验,24位的尾部共有104位13个字节.为了有效区分和校验这13个字节,规定在每个字节的后面增加一个固定的“1”,共增加了13位,这就是控制位。所以控制位并不是在识别号的最后面,而是在中间13个字节每个字节的后面都有一位控制位“1”。标签回送数据时先回送低位字节,再回送高位字节,每个字节先送最低有效位(LSB),后送最高有效位(MSB),如下图所示:
例如,一个标签的保留位是8003(01 1111 0100 0011),国家编码是156(00 10011100),国内唯一***是9138702(00 0000 0000 0000 1000 10110111 0100 0000 1110),尾部全0(0000 0000 0000 0000 00000000),动物标志为1,有附加数据(1),标签的64位识别码是10111110 10000111 00100111 0000000000000000 10001011 01110010 00001110,即十六进制的0xBE872700008B720E。它的CRC16=0x2C72(00101100 01110010),动物标签一般使用两相(Biphase)码,则其发送波形如下:
再比如,我手头有一个注射式动物标签如下图:
打开后的样子:
放在读写器上,从HTRC110的DOUT脚捕捉到波形如下:
则可以写出以下形式
1 0 0 0 0 0 0 0 0 0 0 11个头部
1 1 1 0 0 0 1 0 1 ***SN7-SN0: C5H
1 0 1 1 0 0 0 0 0 ***SN15-SN8: 60H
1 0 1 0 0 0 1 1 0 ***SN23-SN16:46H
1 1 1 0 1 0 1 0 0 ***SN31-SN24:D4H
1 0 0 1 0 0 0 0 0 ***SN37-SN32:20H;国家码C1-C0:00H
1 0 1 1 0 0 0 1 0 国家码C9-C2:62H
1 0 0 0 0 0 0 0 0 保留位留位R6-R0=0,没有附加数据
1 1 0 0 0 0 0 0 0 动物标识=1,保留位R13-R7=0
1 0 1 0 1 0 1 0 1 CRC16校验低位字节:55H
1 1 1 1 0 1 1 1 0 CRC16校验高位字节:EEH
1 0 0 0 0 0 0 0 0 尾部TR7-TR06: 00H
1 0 0 0 0 0 0 0 0 尾部TR15-TR8: 00H
1 0 0 0 0 0 0 0 0 尾部TR23-TR16:00H
根据以上数据列表,可以知道,该标签的国家代码是392(188H),国内唯一***是141000335557(20D44660C5H)。你也看到了,包装上写着呢。
射频识别技术漫谈(9)——动物标签HDX
半双工(HDX,HalfDuplex)技术是ISO11784/11785中规定的另一种标签与读写器之间的通讯方式。读写器先打开射频场对标签充电以**标签,然后关闭磁场,标签在读写器磁场关闭的情况下向读写器传送数据。不过HDX虽然是在动物标签标准中规定,但似乎更多的应用于和动物联系不大的工业识别领域。这也没什么大惊小怪的,标准是标准,实际应用中适合的才是最好的,就像信鸽虽然是动物,但许多信鸽的脚环识别号其实是ID64格式。
与全双工(FDX)相比,HDX 通常识别能力更强,因为HDX读写器的射频场在HDX标签响应期间关闭,从而读写器可以专注于接收来自标签的信号,同时也消除了读写器射频场对标签信号的干扰。HDX采用移频键控(FSK)技术,发送数据“1”使用124.2KHz的频率,发送数据“0”使用134.2KHz的频率。数据的传送速率大约8Kbps,基本上是FDX的两倍。实际工作时读写器持续打开射频场至少50毫秒,以**标签,在读写器关闭射频场3毫秒的时间之内,标签开始回送识别数据,如下图所示:
因为标签回送数据时读写器的射频场已经消失,回送数据完全使用标签自己之前储存的能量,所以标签如何节能降耗非常重要。为此,一方面HDX传送数据的速率比FDX快一倍,另一方面尽量减少不必要的数据传输,除了64位的识别数据必须完整回送外,其它部分只要不是非传不可的数据,标签是能省则省。头部由FDX的11位减少为8位,同时省略了FDX的13位控制位,这样一共比FDX少传送16位,正好两个字节。整个数据帧的位数也从128位减少到112位。同FDX一样,数据发送时先送最低有效位(LSB)再送最高有效位(MSB),传送的顺序如下图所示:
例如,一个标签的保留位是0,国家编码是999(10进制),国内唯一***是1008(10进制),尾部是123456(16进制),动物标志为1,有附加数据(1),64位识别码的16进制数为0x8001F9C0000003F0,它的CRC16=0x5DD6,标签回送数据的顺序如下:
MSB LSB
0 1 1 1 1 1 1 0 8位头部
1 1 1 1 0 0 0 0 38位国内唯一***
0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 1 10位国家代码
0 0 0 0 0 0 0 1 1位附加数据,14位保留数据
1 0 0 0 0 0 0 0 1位动物标识
1 1 0 1 0 1 1 0 16位CRC校验
0 1 0 1 1 1 0 1
0 1 0 1 0 1 1 0 24位尾部
0 0 1 1 0 1 0 0
0 0 0 1 0 0 1 0
波形使用最简单的非归零码,此处不再画出。需要说明的是,因为非归零码容易失步,所以一般读卡芯片解调后输出数据都使用两条线,一条数据线和一条时钟线。比如TI的芯片RI45538,它的第15脚是RXDT,用来输出数据,第16脚是RXCK,用来输出时钟。
射频识别技术漫谈(10)——识别号的格式变化
从事RDID行业的朋友经常会遇到这样的情况,同一张ID卡,在不同厂家生产的读卡器上读出的识别号完全不一样,有时甚至差之千里。ID卡的识别号一般是在出厂时被固化在卡片的ROM里,本身是不会改变的,问题出在读卡器上,是读卡器对卡片识别号采用了不同的输出格式。下面以第7节中提到的ID卡(其卡号是16进制的2100A5EAD9H)为例,说明常见的识别号输出格式。
1.ASCII码与16进制真值变换
在嵌入式系统里,数据的存储一般以字节为单位,字节的表示范围为16进制的00-FFH,这就是16进制的真值。而计算机显示数据一般使用可见字符的ASCII码,ASCII码使用一个字节表示原来16进制真值数据的半个字节。比如ASCII用30H-39H表示16进制的0-9,用41-46H表示16进制的A-F。对于上面的卡号,在16进制显示模式下,如果使用16进制真值,输出结果为
21 00 A5 EA D9
如果使用ASCII码输出,则变成了
32 31 30 30 41 35 45 41 44 39
2.大小端模式变换
如果我们把识别号看成一个数,按多数人的习惯,一般要先输出数据的高位部分,再输出数据的低位部分。对于卡号2100A5EAD9H到底是左边的21是最高位,还是右边的D9是最高位呢?这就是大小端模式的问题。如果认为左边是高位,就是大端模式,如果认为右边是高位,就是小端模式。所以识别号2100A5EAD9H在大端模式下输出就是.
21 00 A5 EA D9
在小段模式下输出就是
D9 EA A5 00 21
3.识别号的整体与部分输出
ID卡的识别号有5个字节,通常情况下使用低位的4个字节。有的用户需要ID号的全部信息,就会输出全部5个字节。有时一个单位的人数较少,为方便记录,只使用低位的2个或3个字节。使用的字节数越少,表示的数值范围越小,越容易发生重号。仅使用两个或3个字节的用户,一般在购卡时会购买一个低位连续的号段,同时让高位字节固定。比如如果想只使用低位的两个字节,则可以固定高位3个字节为2100A5H, 低位两个字节从0000-1000H,也就是将2100A50000-2100A51000H范围的识别卡买断。这样在单位内部使用时就不会重号了。实际上只要高位的三个字节相同,根据卡号的唯一性,低位的两个字节无论如何也不会相同的。如果卡号不唯一,情况将另当别论,“关于ID卡的复制”后面还要述及。
2100A5EAD9H在大端模式下输出5个字节
21 00 A5 EA D9
输出4个字节
00 A5 EA D9
输出3个字节
A5 EA D9
输出2个字节
EA D9
4.16进制与10进制转换
对于卡片的用户来说,10进制相对于16进制更容易记忆和接受,所以许多读卡器都把卡号转换成10进制输出。多数情况下,是将低位的4个字节转换为10位的10进制数,当然也可以把5个字节转换为13位的10进制数、把3个字节转换为8位的10进制数、把2个字节转换为5位的10进制数输出。
2100A5EAD9H整体5字节转换为13位10进制数结果为
141744794329
右边4字节转换为10进制
0010873561
右边3字节转换为10进制
10873561
右边2字节转换为10进制
60121
5.数据的韦根格式
这里的韦根指的是韦根数据转换格式,而不是韦根信号传输接口。韦根数据格式只使用识别号的低位三个字节,这三个字节的第一个字节转换成一个3位的10进制数,后两个字节转换成一个5位的10进制数,然后把两部分组合成一个8位的10进制数输出。例如2100A5EAD9H,只使用A5EAD9H,把A5H化为10进制的165,把 EAD9H化为10进制的60121,最后输出16560121。
6.数据的半字节旋转
还有一些读卡器厂家的排他性较强,对ID号进行了一些加密变换,比如所有卡号的识别字节都异或一个数,或者按某种规则把识别号和一些数进行运算,然后将运算结果输出。这种情况下一般很难猜出其加密算法。半字节旋转就是常见的一种加密方法。我们知道,16进制数的数值范围是0-15,用4位2进制数表示。半字节旋转法是将每一个0-15之间的4位2进制数左边的两个bit和右边的两个bit对调。其对调的结果如下
原值16进制 原值2进制 对调后2进制 对调后16进制
0 0000 0000 0
1 0001 1000 8
2 0010 0100 4
3 0011 1100 C
4 0100 0010 2
5 0101 1010 A
6 0110 0110 6
7 0111 1110 E
8 1000 0001 1
9 1001 1001 9
A 1010 0101 5
B 1011 1101 D
C 1100 0011 3
D 1101 1011 B
E 1110 0111 7
F 1111 1111 F
例如2100A5EAD9H ,按上述规则变为48005A75B9H
7.ID64格式输出
前面说过,TTF的ID卡,只要一进入读卡器的射频场,就不停的发送64位的ID64格式的数据,读卡器从这64位数据中解码提取5个字节的识别号。有些读卡器直接将64数据不解码输出,这时正好是8个字节。例如2100A5EAD9H,对应的ID64格式输出为FF94600515DA6E58H(参见射频识别技术漫谈(7)——ID卡)。由于ID64格式的开始是9个“1”,所以这种输出的第一个字节必定是FFH。
8.数据的前缀与后缀
前面几条主要说的是卡号本身的变换。在ASCII码输出的情况下,为了区分每一条数据,有时读卡器在每一条识别号的后面增加一个回车换行(0D 0A);有时为了更清楚的表示每一条识别号的开始和结束,在识别号的前面增加一个起始符,后面增加一个结束符,最常见的起始符是02,结束符是03。例如2100A5EAD9H,增加了前缀后缀和回车换行,并转为ASCII输出后的格式为
02 32 31 30 30 41 35 45 41 44 39 0D 0A 03
有些读卡器还有校验字节,射频识别技术中常用的数据校验方法笔者将用专门一节介绍。
实际的读卡器输出格式往往是上述一种或几种的组合,例如先半字节旋转,然后转化为10进制,最后用ASCII加前后缀输出。对于其他可读写的IC卡,比如常用的Mifare系列卡片,当用作ID卡时,其***的格式也有上述类似的变换。