滴!刷卡的時候發生了什麼?

典贊·2019科普中國

滴!刷卡的时候发生了什么?

中國科協「典贊·2019 科普中國」十大科普自媒體評選現已進入網絡投票環節。嚴肅裡透著皮,皮裡透著認真的二次元的中科院物理所也在裡面哦!不用關注,不用註冊,動動你們的小手

>> 猛戳這裡 <<

給可鹽可甜的中二所投上寶貴的一票吧(每天可投三票)!

這個情形,有一點像是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技術,刷卡上車,刷卡進站,刷卡開門這些我們生活中常見的事情才成為可能。

摩爾斯電碼的確並不神秘,但它的意義還是很大的。摩爾斯電碼出現時,人們甚至還沒有幻想到計算機這個東西。但是電信號編碼這樣一個思想,卻深刻地影響著計算機技術的發展。實際上,摩爾斯電碼本身,是人們迄今使用時間最久的電信號編碼方法。所以我們應該感謝諜戰劇普及了摩爾斯電碼這個名稱,因為在我們今後的技術發展中,它還可能會繼續帶給我們新的啟示。

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.


分享到:


相關文章: