这个情形,有一点像是RFID芯片在发电报。读卡机根据周边电磁场的强弱变化情况,就可以知道RFID中的芯片在“说”什么了。有了RFID技术,刷卡上车,刷卡进站,刷卡开门这些我们生活中常见的事情才成为可能。想要明白RFID技术的原理和“进化”过程,我们得从摩尔斯电码说起。
(图源:flickr.com)
撰文 | 吴进远
前两年,有位朋友告诉我,她儿子着迷摩尔斯电码。我很好奇,在电脑手机互联网的时代,他是怎么知道摩尔斯电码的?后来我看了一部谍战电视剧才知道出处,那里面的女主角认真而又神秘地说,赶快把情报用摩尔斯电码发给上级。
我们这篇文章,就聊聊摩尔斯电码,以及其他的一些码。首先,我们需要理清一个可能由听觉引起的误导,摩尔斯是个姓,这个摩和魔法魔术魔力的魔没有关系,正如姓孙和太阳没有关系,姓何或者姓佘与“他”或者“她”没有关系一样。因此,摩尔斯电码尽管很重要,但并不像谍战剧女主角暗示的那样神秘,摩尔斯电码本身甚至连密码都不是。
为什么要编码?
简单地说,凡是没法说人话的时候,就都需要编码。就说打电报吧,发电报的人按下按键,收电报的那一方就听到“嘟”的一声。那么,怎样用电报来传递人话呢?这就需要编码,而摩尔斯电码就是这样一种编码。
摩尔斯电码是用按键的时间长短来传递信息的。按键时间短,称之为点,耳机里就听到“的(di)”的一声,而按键时间长,称之为划,听起来就是“哒”的一声。若干个“的”或者“哒”排列在一起,就代表一个字母。有了字母,你就可以传递人话了。比如你想说“救命啊(SOS)”,你就可以发“··· — — — ···”。
(图源:By Rhey T. Snodgrass & Victor F. Camp, 1922- Image:Intcode.png and Image:International Morse Code.PNG, Public Domain, https://commons.wikimedia.org/w/index.php?curid=3902977)
从表中不难看出,不同字母的编码长度是不一样的。大家找找看,最短的编码是哪个?没错,是E。为什么要把E设计成最短的码呢?因为E出现的概率比较高,用比较短的码来表示出现频度高的字符,可以大大提高信息的传输效率。
人同此心,心同此理,事实上,不论古今中外,人们都是这样做的。比如,《红楼梦》有个版本叫《脂砚斋重评石头记》是手抄本。
抄写的人,就把一些出现概率高的字,用笔画较少的字代替。林黛玉的“黛”,用“代”来代替,省了很多笔。寶玉和寶钗的“寶”,也被写成“宝”(有没有听人家嘲笑过简化字:宝无貝?嘲笑的人请自觉到脂砚斋的芳冢上压棺材板)。顺便说一句,宝这个字原来有两个写法:寶和寳。学问大的家长,可以给孩子讲讲(也顺便在文章后面留个言),这两个字的用法有什么不同。
从某种意义上说,文字就是一种编码。我们说的人话,没有办法直接记录到龟壳,兽骨,竹简,石碑,锦帛,纸张上,因此就需要用一个符号系列来记录。或者是记录读音,比如各种拼音文字,或者是直接记录事物或动作,比如汉字。
当电报出现后,连字母这种人话的编码都很难传递,于是就进一步码上加码,用按键的长短来把字母和数字编码。
用摩尔斯电码,我们显然可以发送用拉丁字符拼写的信息。可是,要想通过电报发送中文信息又该怎么办呢?在很长一个时期中,中文是用从0000到9999这样的四位数字编码的。而发电报时,再用摩尔斯电码发送四位一组的数字串。哪四个数字代表哪个汉字,当时是有一个全国通用的编码本的,这套编码通常称为明码。
谍战剧里发电报,想来多半不会用明码,而是收发双方各有一本专门编写的密码本,那里面哪个数字对应哪个汉字与明码的规定是不同的。这样的电报,敌方可能监听记录下来,写出来是一串数字。但如果想翻译出来,就很需要大开脑洞了。
由于用一串数字代表一个汉字,因而不难想象,要把中文翻译成数字电码,其中的劳动量是很大的。因此,当年到邮局发电报,收费是按字数计算的。按照当时的物价,在食堂买一个馒头4分钱,而发电报每个字3分5厘。这就要求电文必须简练清晰,没有废话。
比如姥姥要从北京坐火车去上海,妈妈给上海的舅舅打电报让他去车站接。这么一件事妈妈写出的电文是:“母于九月十日五次车下午两点半到上海”,已经够简练了吧?而邮局电报柜台的营业员阿姨会贴心地帮你改成“母9.10 5次1430到沪”。除了把上海简称为沪减少了一个字,电文中还尽量把汉语数字用阿拉伯数字来写。因为我们前面讲过,一个汉字要用四个数字来代表,而直接用阿拉伯数字,需要发送的字符数量就减少了很多,从而省下可以买好多个馒头的钱。
电报早已离开人们的生活走入历史,但那个时期留下的很多概念仍然没有过时。比如通讯安全(密码编制与反破解),数据无损压缩(把E用一个点表示)与有损压缩(用阿拉伯数字代替汉字数字)等,直到现在仍然是我们需要不断解决的问题,同时也经常给我们的科研工作带来启示。
计算机用的串行码
有人把摩尔斯电码中的点划说成是计算机二进制中的1和0,其实这是误解。摩尔斯电码之所以可以正确地传递信息,除了点划这两个要素,另一个必不可少的一个要素是没有声音的空白时间段。
前面的编码表中规定,点是一个单位时间段,划是三个单位时间段。这个单位时间段可长可短,因人而异,熟练的发报员可以短些,而生手可以慢些。除此之外,还规定了点点,点划,划划之间的空当为一个单位时间段,字母之间的空当为三个单位时间段,不同单词之间的空当为七个单位时间段等。只有这样,才不会把不同字母之间的点划连到一起,也不会把同一个字母中的点划拆到两个字母之中。
这样的编码方法可以确保收发报的人类不至于出错,但在计算机出现后,这样的编码就显得效率太低了。那么计算机里用的编码长得什么样子呢?我们举个简单的例子来说明。
当我们在键盘上按下一个字母键的时候,怎样让计算机主机知道我们按的是那一个字母呢?这是通过串行接口传递的高低电平知道的。如果我们找一个旧式的键盘,把键盘和主机之间的电缆剥开,找到许多线中正确的信号线,就可以从示波器上看到类似下图的波形。
在没有按下键的时候,串行接口处于静止状态,导线上处于高电平。当我们按下一个按键后,发送端首先把接口上的电平拉低一个单位时间段,然后在后面(即上图竖直实线之后)的8个单位时间段内输出时高时低的电平。具体哪个时间段高哪个时间段低,取决于我们按下的是哪一个字母或数字键。显然,后面这8个单位时间段每个时间段可以传输一个比特的信息。
很多情况下传输一个字符,需要10个单位时间段,这10个时间段包括在8个比特的信息之前需要一个低电平时间段以告知接收方准备接收,以及在8个比特传输之后,设置一个高电平的时间段,以便与后面紧接着的字符区隔。
当然具体使用接口时,我们有时可以把接口参数设置成只用7个比特传输一个字符。因为26个大小写英文字母,加十个数字,再加各种标点符号已经各种控制命令,只需要128种不同字符,因此可以用7个比特编码。尽管很多时候我们传输字符时包含了8个比特,但最高位的第8个比特总是0或者低电平。
如果我们打开示波器的波形记忆功能,则会得到如下的显示。
这个图中记录了我们连续发送两个字符时,示波器上看到的波形。在键盘上依次按下不同的字母与数字键,示波器记录下在每个单位时间间隔中信号的高低电平。可以看出,不论对哪一个字符,第一个起始时间段总是0。随后7个时间段,电平可以高也可以低。而第8个比特在传输普通字符时总是低电平。
假定我们按键速度极快,则第一个字符发送后,接口会紧接着发送第二个字符,如上图右半边所示。这第二个字符也是先把接口信号电平拉低一个单位时间间隔,然后发送8个比特的信息。
串行接口传输的速度称为波特率,前面图中接口的波特率是1200,它在每秒钟内可以传输1200个前面所说的单位时间段。换句话说,每个单位时间段的长度为1/1200秒,也就是0.83 毫秒左右。假定我们使用的接口设置是用10个单位时间段发送一个字符,则在波特率为1200时,每秒可以传输120个字符。
每秒120个字符在很多应用中会嫌太慢,毕竟120个字符仅仅对应于很多显示器上一行半文字,因此人们很多时候会需要更高的波特率。反之,如果传输距离很远,电气环境恶劣,而需要传输的信息量不太大时,人们可能需要比较低的波特率,以确保信息传递准确。常见的串行通讯接口往往会支持很多不同的波特率,包括75, 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 等等。
说了半天,计算机具体是怎样把高低电平转换成字符的呢?这就需要我们在把字符编成码。很多计算机设备中,用的都是ASCII编码。这个编码表的一部分如下图所示。
计算机首先把收到的高低电平排列成一个二进制数,然后从第2列(或第5,第8列)中找到对应的二进制数,就可以查到对应的字符。
对于人类来说,我们脑子里没有安装计算机中的电子元件,要想根据示波器上的电平翻译出传输的字符,就只能用笨办法了。设想我们在示波器上看到了下面一个波形。
这个波形在实虚两条竖线之间,显示了一个“高低高低高高低”的电平序列,我们高兴的话也可以读成“平仄平仄平平仄” 。为了翻译出这个字符,我们首先把这个电平序列写成1010110。不过,这一串数字与前面表上的二进制数还不完全一致。串行接口是先传输低位比特,后传输高位比特的,因此,我们应该把前面这个数的比特前后次序翻过来,变成0110101。用这个数,我们可以从编码表中查出,这个电平序列对应的是第53号字符:数字5。
要是我们在示波器上看到了“仄平仄平仄仄平”的波形,这又是一个什么字符呢?
我们把这个电平序列写成0101001,它对应的编码是1001010,也就是第74号字符:字母J。
大家想想看,要是把摩尔斯电码显示到示波器上,会是什么样子?
智能卡与数据编码
现在,我们的生活中到处都是计算机。为此,我们需要与计算机迅速方便地交换信息。只要我们注意观察,在我们周围有许许多多用于信息交换的东西。比如,我们可以从钱包里掏出一张信用卡或者银行卡,和孩子一起看看,很多卡上会有一个 1 厘米见方,切割得像花一样的小方块。
这是一块小型的电路板,上表面粘了镀金铜箔,铜箔被光刻腐蚀成8个接脚。当信用卡插入读卡器中时,读卡器中的接点与这8个接脚联通。电路板背面粘贴了一小块芯片,芯片与这8个接脚通过细金属丝点焊在一起。这些接脚的功能是什么呢?
上面图中标注了第1,2,3与5,6,7接脚的功能,第4与第8脚是为今后可能的拓展预留的。在有很多信用卡上,包括手机上用的SIM卡上,仅仅使用了6个脚,其他两个脚甚至可以不做出来。
在这些脚中,VCC与读卡器电源正极连接,GND则与公共地线连接,卡上的芯片通过这两个脚来供电。
芯片接上电以后,内部可能处于混乱状态,因此需要通过RST脚短时间内加一个电平,使得芯片内部各个寄存器复位。
芯片复位后,需要知道让它做什么,这就需要从外部送入芯片命令以及其他数据。命令与数据是通过I/O这根线送进去的。尽管I/O只是一根线,我们通过它传输的数据却是包含有很多比特的。因此,它所传输的数据是经过类似前面谈到的串行接口那样的分时编码的。
不过,芯片怎样才能知道I/O接口上哪个时刻的电平属于哪个比特呢?这就需要CLK这个时钟信号。所谓时钟信号,是按照一定频率上下变化的逻辑电平。在芯片当中,寄存器在时钟电平的上升沿或者下降沿,将I/O上的电平记录下来,成为一个比特。这样每一个时钟周期,可以传送一个比特。反过来,芯片向外输出其中数据时,也需要时钟信号的驱动,使之每个周期输出一个比特。此外,芯片中的计算功能也是利用时钟信号来控制其节律的,一般讲,每一个时钟周期可以执行运算程序中的一个步骤。
下图是一个废旧智能卡的复位操作。
图中通道1为RST信号。通道4为CLK,由于CLK的频率相对比较高,所以图中显示它的电平变化非常密集。通道2为I/O信号,在没有数据输出时电平为高,而在传输数据时则上下变化。这个波形显示当芯片收到复位信号后,送出一大串数据。这里显示的仅仅是开始的几个比特。
在有一些应用中,芯片需要在断电后仍然能够记忆一些信息,类似U盘那样。这就需要芯片里有 EEPROM 或 FLASH 这样一类存储单元。这些存储单元在写入信息时,往往需要相对比较高的电压。前面图中的第6脚,C6-VPP 就是用来提供这个电压的。
由于这种有芯片的信用卡或银行卡具有一定的加密功能,因此比起只有磁条的普通信用卡,其安全性提高了很多。
RFID与数据编码
前面谈到的接触式芯片卡固然有很多优点,但在一些需要快速完成验证的应用,比如公交地铁的检票系统中,乃至电子门禁中,就不是非常方便了。在这类应用中,人们普遍选用非接触的RFID芯片卡。在有的城市公交或地铁系统中,车票本身就是一张RFID芯片卡,整个卡制作在一张硬纸片上,然后在另一面贴上一层纸保护起来,成本极低。这样的车票放在水里浸泡一段时间就可以很容易揭开,暴露出完整的RFID的构造。
这种RFID卡中占据空间最大的是用金属薄膜制做的一个线圈,这个线圈是芯片与外界连接的唯一通道。从下面图中,我们可以看清楚线圈右下角的结构。可以看到有一根跳线,将线圈内圈与外边金属连接。最终,线圈的两端与一个芯片连接在一起。
芯片需要有电才能工作,因此怎样向芯片供电是这类技术的头等大事。对于接触式的芯片卡,人们可以利用一对接点来供电,但对于RFID,则只能通过线圈供电。当RFID接近读卡机时,读卡机首先发出一段时间的射频电磁波。比较常用的频率是13.56 MHz,当然有时也有工作在比较低的频段(120-150 kHz)或者很高频段(433 MHz以上)的情形。变化的电磁场通过线圈产生感生电动势,经过芯片整流,变成芯片可以使用的电能。
芯片根据其内部存储的数据,改变自己的有效载荷,有的时间段显得负载重,有时显得负载轻,这样就实现了对周边电磁场的调制。这个情形,有一点像是RFID芯片在发电报,尽管不是用摩尔斯电码,尽管发报距离仅仅几个厘米,而且发报机的电源还是收报方通过变化的电磁场提供的。读卡机根据周边电磁场的强弱变化情况,就可以知道RFID中的芯片在“说”什么了。有了RFID技术,刷卡上车,刷卡进站,刷卡开门这些我们生活中常见的事情才成为可能。
摩尔斯电码的确并不神秘,但它的意义还是很大的。摩尔斯电码出现时,人们甚至还没有幻想到计算机这个东西。但是电信号编码这样一个思想,却深刻地影响着计算机技术的发展。实际上,摩尔斯电码本身,是人们迄今使用时间最久的电信号编码方法。所以我们应该感谢谍战剧普及了摩尔斯电码这个名称,因为在我们今后的技术发展中,它还可能会继续带给我们新的启示。
来源:赛先生
编辑:lwk