這個情形,有一點像是RFID芯片在發(fā)電報。讀卡機(jī)根據(jù)周邊電磁場的強(qiáng)弱變化情況,就可以知道RFID中的芯片在“說”什么了。有了RFID技術(shù),刷卡上車,刷卡進(jìn)站,刷卡開門這些我們生活中常見的事情才成為可能。想要明白RFID技術(shù)的原理和“進(jìn)化”過程,我們得從摩爾斯電碼說起。
(圖源:flickr.com)
撰文 | 吳進(jìn)遠(yuǎn)
前兩年,有位朋友告訴我,她兒子著迷摩爾斯電碼。我很好奇,在電腦手機(jī)互聯(lián)網(wǎng)的時代,他是怎么知道摩爾斯電碼的?后來我看了一部諜戰(zhàn)電視劇才知道出處,那里面的女主角認(rèn)真而又神秘地說,趕快把情報用摩爾斯電碼發(fā)給上級。
我們這篇文章,就聊聊摩爾斯電碼,以及其他的一些碼。首先,我們需要理清一個可能由聽覺引起的誤導(dǎo),摩爾斯是個姓,這個摩和魔法魔術(shù)魔力的魔沒有關(guān)系,正如姓孫和太陽沒有關(guān)系,姓何或者姓佘與“他”或者“她”沒有關(guān)系一樣。因此,摩爾斯電碼盡管很重要,但并不像諜戰(zhàn)劇女主角暗示的那樣神秘,摩爾斯電碼本身甚至連密碼都不是。
為什么要編碼?
簡單地說,凡是沒法說人話的時候,就都需要編碼。就說打電報吧,發(fā)電報的人按下按鍵,收電報的那一方就聽到“嘟”的一聲。那么,怎樣用電報來傳遞人話呢?這就需要編碼,而摩爾斯電碼就是這樣一種編碼。
摩爾斯電碼是用按鍵的時間長短來傳遞信息的。按鍵時間短,稱之為點,耳機(jī)里就聽到“的(di)”的一聲,而按鍵時間長,稱之為劃,聽起來就是“噠”的一聲。若干個“的”或者“噠”排列在一起,就代表一個字母。有了字母,你就可以傳遞人話了。比如你想說“救命啊(SOS)”,你就可以發(fā)“··· — — — ···”。
(圖源: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設(shè)計成最短的碼呢?因為E出現(xiàn)的概率比較高,用比較短的碼來表示出現(xiàn)頻度高的字符,可以大大提高信息的傳輸效率。
人同此心,心同此理,事實上,不論古今中外,人們都是這樣做的。比如,《紅樓夢》有個版本叫《脂硯齋重評石頭記》是手抄本。
抄寫的人,就把一些出現(xiàn)概率高的字,用筆畫較少的字代替。林黛玉的“黛”,用“代”來代替,省了很多筆。寶玉和寶釵的“寶”,也被寫成“寶”(有沒有聽人家嘲笑過簡化字:寶無貝?嘲笑的人請自覺到脂硯齋的芳冢上壓棺材板)。順便說一句,寶這個字原來有兩個寫法:寶和寳。學(xué)問大的家長,可以給孩子講講(也順便在文章后面留個言),這兩個字的用法有什么不同。
從某種意義上說,文字就是一種編碼。我們說的人話,沒有辦法直接記錄到龜殼,獸骨,竹簡,石碑,錦帛,紙張上,因此就需要用一個符號系列來記錄。或者是記錄讀音,比如各種拼音文字,或者是直接記錄事物或動作,比如漢字。
當(dāng)電報出現(xiàn)后,連字母這種人話的編碼都很難傳遞,于是就進(jìn)一步碼上加碼,用按鍵的長短來把字母和數(shù)字編碼。
用摩爾斯電碼,我們顯然可以發(fā)送用拉丁字符拼寫的信息。可是,要想通過電報發(fā)送中文信息又該怎么辦呢?在很長一個時期中,中文是用從0000到9999這樣的四位數(shù)字編碼的。而發(fā)電報時,再用摩爾斯電碼發(fā)送四位一組的數(shù)字串。哪四個數(shù)字代表哪個漢字,當(dāng)時是有一個全國通用的編碼本的,這套編碼通常稱為明碼。
諜戰(zhàn)劇里發(fā)電報,想來多半不會用明碼,而是收發(fā)雙方各有一本專門編寫的密碼本,那里面哪個數(shù)字對應(yīng)哪個漢字與明碼的規(guī)定是不同的。這樣的電報,敵方可能監(jiān)聽記錄下來,寫出來是一串?dāng)?shù)字。但如果想翻譯出來,就很需要大開腦洞了。
由于用一串?dāng)?shù)字代表一個漢字,因而不難想象,要把中文翻譯成數(shù)字電碼,其中的勞動量是很大的。因此,當(dāng)年到郵局發(fā)電報,收費(fèi)是按字?jǐn)?shù)計算的。按照當(dāng)時的物價,在食堂買一個饅頭4分錢,而發(fā)電報每個字3分5厘。這就要求電文必須簡練清晰,沒有廢話。
比如姥姥要從北京坐火車去上海,媽媽給上海的舅舅打電報讓他去車站接。這么一件事媽媽寫出的電文是:“母于九月十日五次車下午兩點半到上海”,已經(jīng)夠簡練了吧?而郵局電報柜臺的營業(yè)員阿姨會貼心地幫你改成“母9.10 5次1430到滬”。除了把上海簡稱為滬減少了一個字,電文中還盡量把漢語數(shù)字用阿拉伯?dāng)?shù)字來寫。因為我們前面講過,一個漢字要用四個數(shù)字來代表,而直接用阿拉伯?dāng)?shù)字,需要發(fā)送的字符數(shù)量就減少了很多,從而省下可以買好多個饅頭的錢。
電報早已離開人們的生活走入歷史,但那個時期留下的很多概念仍然沒有過時。比如通訊安全(密碼編制與反破解),數(shù)據(jù)無損壓縮(把E用一個點表示)與有損壓縮(用阿拉伯?dāng)?shù)字代替漢字?jǐn)?shù)字)等,直到現(xiàn)在仍然是我們需要不斷解決的問題,同時也經(jīng)常給我們的科研工作帶來啟示。
計算機(jī)用的串行碼
有人把摩爾斯電碼中的點劃說成是計算機(jī)二進(jìn)制中的1和0,其實這是誤解。摩爾斯電碼之所以可以正確地傳遞信息,除了點劃這兩個要素,另一個必不可少的一個要素是沒有聲音的空白時間段。
前面的編碼表中規(guī)定,點是一個單位時間段,劃是三個單位時間段。這個單位時間段可長可短,因人而異,熟練的發(fā)報員可以短些,而生手可以慢些。除此之外,還規(guī)定了點點,點劃,劃劃之間的空當(dāng)為一個單位時間段,字母之間的空當(dāng)為三個單位時間段,不同單詞之間的空當(dāng)為七個單位時間段等。只有這樣,才不會把不同字母之間的點劃連到一起,也不會把同一個字母中的點劃拆到兩個字母之中。
這樣的編碼方法可以確保收發(fā)報的人類不至于出錯,但在計算機(jī)出現(xiàn)后,這樣的編碼就顯得效率太低了。那么計算機(jī)里用的編碼長得什么樣子呢?我們舉個簡單的例子來說明。
當(dāng)我們在鍵盤上按下一個字母鍵的時候,怎樣讓計算機(jī)主機(jī)知道我們按的是那一個字母呢?這是通過串行接口傳遞的高低電平知道的。如果我們找一個舊式的鍵盤,把鍵盤和主機(jī)之間的電纜剝開,找到許多線中正確的信號線,就可以從示波器上看到類似下圖的波形。
在沒有按下鍵的時候,串行接口處于靜止?fàn)顟B(tài),導(dǎo)線上處于高電平。當(dāng)我們按下一個按鍵后,發(fā)送端首先把接口上的電平拉低一個單位時間段,然后在后面(即上圖豎直實線之后)的8個單位時間段內(nèi)輸出時高時低的電平。具體哪個時間段高哪個時間段低,取決于我們按下的是哪一個字母或數(shù)字鍵。顯然,后面這8個單位時間段每個時間段可以傳輸一個比特的信息。
很多情況下傳輸一個字符,需要10個單位時間段,這10個時間段包括在8個比特的信息之前需要一個低電平時間段以告知接收方準(zhǔn)備接收,以及在8個比特傳輸之后,設(shè)置一個高電平的時間段,以便與后面緊接著的字符區(qū)隔。
當(dāng)然具體使用接口時,我們有時可以把接口參數(shù)設(shè)置成只用7個比特傳輸一個字符。因為26個大小寫英文字母,加十個數(shù)字,再加各種標(biāo)點符號已經(jīng)各種控制命令,只需要128種不同字符,因此可以用7個比特編碼。盡管很多時候我們傳輸字符時包含了8個比特,但最高位的第8個比特總是0或者低電平。
如果我們打開示波器的波形記憶功能,則會得到如下的顯示。
這個圖中記錄了我們連續(xù)發(fā)送兩個字符時,示波器上看到的波形。在鍵盤上依次按下不同的字母與數(shù)字鍵,示波器記錄下在每個單位時間間隔中信號的高低電平。可以看出,不論對哪一個字符,第一個起始時間段總是0。隨后7個時間段,電平可以高也可以低。而第8個比特在傳輸普通字符時總是低電平。
假定我們按鍵速度極快,則第一個字符發(fā)送后,接口會緊接著發(fā)送第二個字符,如上圖右半邊所示。這第二個字符也是先把接口信號電平拉低一個單位時間間隔,然后發(fā)送8個比特的信息。
串行接口傳輸?shù)乃俣确Q為波特率,前面圖中接口的波特率是1200,它在每秒鐘內(nèi)可以傳輸1200個前面所說的單位時間段。換句話說,每個單位時間段的長度為1/1200秒,也就是0.83 毫秒左右。假定我們使用的接口設(shè)置是用10個單位時間段發(fā)送一個字符,則在波特率為1200時,每秒可以傳輸120個字符。
每秒120個字符在很多應(yīng)用中會嫌太慢,畢竟120個字符僅僅對應(yīng)于很多顯示器上一行半文字,因此人們很多時候會需要更高的波特率。反之,如果傳輸距離很遠(yuǎn),電氣環(huán)境惡劣,而需要傳輸?shù)男畔⒘坎惶髸r,人們可能需要比較低的波特率,以確保信息傳遞準(zhǔn)確。常見的串行通訊接口往往會支持很多不同的波特率,包括75, 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 等等。
說了半天,計算機(jī)具體是怎樣把高低電平轉(zhuǎn)換成字符的呢?這就需要我們在把字符編成碼。很多計算機(jī)設(shè)備中,用的都是ASCII編碼。這個編碼表的一部分如下圖所示。
計算機(jī)首先把收到的高低電平排列成一個二進(jìn)制數(shù),然后從第2列(或第5,第8列)中找到對應(yīng)的二進(jìn)制數(shù),就可以查到對應(yīng)的字符。
對于人類來說,我們腦子里沒有安裝計算機(jī)中的電子元件,要想根據(jù)示波器上的電平翻譯出傳輸?shù)淖址椭荒苡帽哭k法了。設(shè)想我們在示波器上看到了下面一個波形。
這個波形在實虛兩條豎線之間,顯示了一個“高低高低高高低”的電平序列,我們高興的話也可以讀成“平仄平仄平平仄” 。為了翻譯出這個字符,我們首先把這個電平序列寫成1010110。不過,這一串?dāng)?shù)字與前面表上的二進(jìn)制數(shù)還不完全一致。串行接口是先傳輸?shù)臀槐忍兀髠鬏敻呶槐忍氐模虼耍覀儜?yīng)該把前面這個數(shù)的比特前后次序翻過來,變成0110101。用這個數(shù),我們可以從編碼表中查出,這個電平序列對應(yīng)的是第53號字符:數(shù)字5。
要是我們在示波器上看到了“仄平仄平仄仄平”的波形,這又是一個什么字符呢?
我們把這個電平序列寫成0101001,它對應(yīng)的編碼是1001010,也就是第74號字符:字母J。
大家想想看,要是把摩爾斯電碼顯示到示波器上,會是什么樣子?
智能卡與數(shù)據(jù)編碼
現(xiàn)在,我們的生活中到處都是計算機(jī)。為此,我們需要與計算機(jī)迅速方便地交換信息。只要我們注意觀察,在我們周圍有許許多多用于信息交換的東西。比如,我們可以從錢包里掏出一張信用卡或者銀行卡,和孩子一起看看,很多卡上會有一個 1 厘米見方,切割得像花一樣的小方塊。
這是一塊小型的電路板,上表面粘了鍍金銅箔,銅箔被光刻腐蝕成8個接腳。當(dāng)信用卡插入讀卡器中時,讀卡器中的接點與這8個接腳聯(lián)通。電路板背面粘貼了一小塊芯片,芯片與這8個接腳通過細(xì)金屬絲點焊在一起。這些接腳的功能是什么呢?
上面圖中標(biāo)注了第1,2,3與5,6,7接腳的功能,第4與第8腳是為今后可能的拓展預(yù)留的。在有很多信用卡上,包括手機(jī)上用的SIM卡上,僅僅使用了6個腳,其他兩個腳甚至可以不做出來。
在這些腳中,VCC與讀卡器電源正極連接,GND則與公共地線連接,卡上的芯片通過這兩個腳來供電。
芯片接上電以后,內(nèi)部可能處于混亂狀態(tài),因此需要通過RST腳短時間內(nèi)加一個電平,使得芯片內(nèi)部各個寄存器復(fù)位。
芯片復(fù)位后,需要知道讓它做什么,這就需要從外部送入芯片命令以及其他數(shù)據(jù)。命令與數(shù)據(jù)是通過I/O這根線送進(jìn)去的。盡管I/O只是一根線,我們通過它傳輸?shù)臄?shù)據(jù)卻是包含有很多比特的。因此,它所傳輸?shù)臄?shù)據(jù)是經(jīng)過類似前面談到的串行接口那樣的分時編碼的。
不過,芯片怎樣才能知道I/O接口上哪個時刻的電平屬于哪個比特呢?這就需要CLK這個時鐘信號。所謂時鐘信號,是按照一定頻率上下變化的邏輯電平。在芯片當(dāng)中,寄存器在時鐘電平的上升沿或者下降沿,將I/O上的電平記錄下來,成為一個比特。這樣每一個時鐘周期,可以傳送一個比特。反過來,芯片向外輸出其中數(shù)據(jù)時,也需要時鐘信號的驅(qū)動,使之每個周期輸出一個比特。此外,芯片中的計算功能也是利用時鐘信號來控制其節(jié)律的,一般講,每一個時鐘周期可以執(zhí)行運(yùn)算程序中的一個步驟。
下圖是一個廢舊智能卡的復(fù)位操作。
圖中通道1為RST信號。通道4為CLK,由于CLK的頻率相對比較高,所以圖中顯示它的電平變化非常密集。通道2為I/O信號,在沒有數(shù)據(jù)輸出時電平為高,而在傳輸數(shù)據(jù)時則上下變化。這個波形顯示當(dāng)芯片收到復(fù)位信號后,送出一大串?dāng)?shù)據(jù)。這里顯示的僅僅是開始的幾個比特。
在有一些應(yīng)用中,芯片需要在斷電后仍然能夠記憶一些信息,類似U盤那樣。這就需要芯片里有 EEPROM 或 FLASH 這樣一類存儲單元。這些存儲單元在寫入信息時,往往需要相對比較高的電壓。前面圖中的第6腳,C6-VPP 就是用來提供這個電壓的。
由于這種有芯片的信用卡或銀行卡具有一定的加密功能,因此比起只有磁條的普通信用卡,其安全性提高了很多。
RFID與數(shù)據(jù)編碼
前面談到的接觸式芯片卡固然有很多優(yōu)點,但在一些需要快速完成驗證的應(yīng)用,比如公交地鐵的檢票系統(tǒng)中,乃至電子門禁中,就不是非常方便了。在這類應(yīng)用中,人們普遍選用非接觸的RFID芯片卡。在有的城市公交或地鐵系統(tǒng)中,車票本身就是一張RFID芯片卡,整個卡制作在一張硬紙片上,然后在另一面貼上一層紙保護(hù)起來,成本極低。這樣的車票放在水里浸泡一段時間就可以很容易揭開,暴露出完整的RFID的構(gòu)造。
這種RFID卡中占據(jù)空間最大的是用金屬薄膜制做的一個線圈,這個線圈是芯片與外界連接的唯一通道。從下面圖中,我們可以看清楚線圈右下角的結(jié)構(gòu)。可以看到有一根跳線,將線圈內(nèi)圈與外邊金屬連接。最終,線圈的兩端與一個芯片連接在一起。
芯片需要有電才能工作,因此怎樣向芯片供電是這類技術(shù)的頭等大事。對于接觸式的芯片卡,人們可以利用一對接點來供電,但對于RFID,則只能通過線圈供電。當(dāng)RFID接近讀卡機(jī)時,讀卡機(jī)首先發(fā)出一段時間的射頻電磁波。比較常用的頻率是13.56 MHz,當(dāng)然有時也有工作在比較低的頻段(120-150 kHz)或者很高頻段(433 MHz以上)的情形。變化的電磁場通過線圈產(chǎn)生感生電動勢,經(jīng)過芯片整流,變成芯片可以使用的電能。
芯片根據(jù)其內(nèi)部存儲的數(shù)據(jù),改變自己的有效載荷,有的時間段顯得負(fù)載重,有時顯得負(fù)載輕,這樣就實現(xiàn)了對周邊電磁場的調(diào)制。這個情形,有一點像是RFID芯片在發(fā)電報,盡管不是用摩爾斯電碼,盡管發(fā)報距離僅僅幾個厘米,而且發(fā)報機(jī)的電源還是收報方通過變化的電磁場提供的。讀卡機(jī)根據(jù)周邊電磁場的強(qiáng)弱變化情況,就可以知道RFID中的芯片在“說”什么了。有了RFID技術(shù),刷卡上車,刷卡進(jìn)站,刷卡開門這些我們生活中常見的事情才成為可能。
摩爾斯電碼的確并不神秘,但它的意義還是很大的。摩爾斯電碼出現(xiàn)時,人們甚至還沒有幻想到計算機(jī)這個東西。但是電信號編碼這樣一個思想,卻深刻地影響著計算機(jī)技術(shù)的發(fā)展。實際上,摩爾斯電碼本身,是人們迄今使用時間最久的電信號編碼方法。所以我們應(yīng)該感謝諜戰(zhàn)劇普及了摩爾斯電碼這個名稱,因為在我們今后的技術(shù)發(fā)展中,它還可能會繼續(xù)帶給我們新的啟示。
來源:賽先生
編輯:lwk