RFIDler:一款定義RFID的讀、寫、仿真器的開源軟件


很多類似於RFID這樣的技術看起來都很神秘,實際上他是依賴於很多物理學原理的,比如”電磁感應原理”。是的,這些現象產生的各種信號足以令人發狂,看完這些模擬模擬信號后,我忽然發現二進制信息多么干凈美麗。

所以我一直在找一個工具,可以把這些模擬世界轉化成友好的數據,RFID就是主要的對象。近些年來,越來越多RFID/NFC產品出現了,可能在你的口袋里就有好幾個這樣的東西——比如,你的車鑰匙、門的鑰匙、信用卡等等。當然,他們都有各自的RFID閱讀器可以讀取他們的信息,但是我關心的是,有沒有一個RFID閱讀器可以讀取所有RFID上的信息,並且這個閱讀器還很小且很便宜。

憑心而論,似乎有很多閱讀器都可以達到我的要求,你可以買個很簡單的RFID USB閱讀器,大概也只需要10-15英鎊。但是之后你就會發現,這些便宜的閱讀器幾乎都只能閱讀一個標准下的RFID,你需要很多個這樣的RFID閱讀器才行。也有像Proxmark3這樣的可以閱讀所有RFID的,但是價格不菲呀。當然PM3確實是值得一看的,它被稱為“RFID界的瑞士軍刀”。它能夠閱讀很多版本的信號,無論是高頻還是低頻,稍后我們也將用它來舉個例子。

RFID標簽

所以,在開始前,我們不禁要發問,RFID標簽是用來做什么的呢?

基本上他有兩個作用:

1.基本上所有RFID標簽都是唯一的,都可以用來特定的標識自身

2.一些標簽具有數據存儲功能

圍繞着這兩個基本的作用,可以展開很多——標簽是盲目的展現ID或者DATA內容嗎?或者換一句話說,在構建他們的時候是否有做一些安全措施?這些存儲的都是些簡要的信息,因此如果你想寫入更長更多的信息,標簽是否有空間可以寫入?在這篇文章中,我的目的是討論一些模擬世界中一些基礎的通信過程,並且盡可能的把它們顯示出來。

RFID&感應現象

這些技術基本都是依賴於”感應現象”。簡單來說就是RFID/NFC都是依賴於你去激勵一個線圈,同時讓另一個線圈靠近它,第二個線圈就會通過感應從第一個線圈獲取到部分能量,即兩個線圈很神奇的發生了耦合(或者說是電磁感應)。同時,第二個線圈很有可能將會影響到第一個線圈的電壓,例如靠近第一個線圈,第一個線圈的電壓就下降了,我們稱這種現象為“阻尼現象”。這就是RFID的工作原理,總結來說就是:線圈間相互的溝通是通過發送能量(從閱讀器發出),或者引起了另一個線圈的能量變化(從RFID標簽)來進行的。

在本文中,為了能得到更多的細節我們將會使用最簡單的方式標記RFID標簽——直接通過一個ID來識別,同時我們要先構建以下環境:閱讀器通過反復激勵線圈給線圈供能。作為一個標准的低頻系統,它的頻率將會是每秒125000次,也就是125KHz,這些被稱為”載波信號”。RFID標簽線圈被放在一定區域內的時候,將會從產生一些能量,變成電感耦合線圈並且進入激活狀態。如果閱讀器想要發送一個”喚醒(或者其他)”命令,可以通過開關把載波信號的電源關閉很短的一段時間。就算標簽失去了電源,它依然可以依賴儲存的能量繼續工作一段時間,我們可以很容易的通過改變載波信號之間的缺口長短就可以代表0和1兩種信號,基於這一特點,閱讀器就能發送二進制信息了。

換一句話說,他們是通過幅移鍵控(ASK)來承載信息的,調整信號的振幅來代表不同的數據。更精確的一種方式是開關鍵控(OOK)。從閱讀器發送給標簽的信息被設計成ON和OFF兩種載波,返回的信號響應的為阻尼和非阻尼兩種。

信號分析

說了這么些個,大家好像一臉懵逼的樣子,事實上我翻譯的也有點懵逼了=。= 為了更容易理解,接下來我們用圖來說明。下圖是一個在示波器下觀察到的125KHz的載波:

接下來是閱讀器給標簽發送的一個信號:

這種情況是,用一個長脈沖代表’1’ 用一個短脈沖代表’0’,因此,這里的信號的意思就是’11000’,或者如果你用HITAG2算法的話,意思就是’START_AUTH’

正如我們提到的,標簽也會給閱讀器返回信息,它是通過短路自己的線圈使閱讀器的線圈發生阻尼現象。結果如下圖:

這看起來好像是閱讀器本身發送了一條信息。但是請注意,閱讀器發送的波幅度一直在變化,但不可能減小到沒有。相反,它要么是一個阻尼波要么是一個非阻尼波。這是因為並不是直接通過控制閱讀器線圈上的電壓達到的效果,而只是通過感應來影響波形。但它依然是可以讀的。這個時候,如果我們把阻尼作用當成是”1”,非阻尼作用當成是”0”,我們就能得到’1010101010010110011010’,這也就是曼徹斯特編碼的方式。

那么,曼徹斯特編碼要做的事情是什么呢?好,這個時候它就開始變得有趣了——如果你仔細觀察下這些不同規格標簽,你會發現他們提到很多種調制方案,例如“曼徹斯特(Manchester)”,“雙相(Bi-Phase)”,“移頻鍵控(FSK)”,“相移鍵控(PSK)”,‘NRZI’,‘ASK’……

我們准備的設備只能做ASK,那 FSK/PSK/Manchester malarky這些方案是怎么樣的呀?

這也是我一直很混亂的地方。如果你想做一個和現有供應商制定的RFID不一樣的產品,恭喜你,你掉坑里了,因為各種調試方案是相互沖突的。尤其是想找出能解調所有方案的閱讀器就更難了——如果你想找到一個閱讀器可以訪問到所有編碼方式的數據,那是不可能的。如果閱讀器想要進一步解調發送的信號。他們需要先確定信號是用什么方式編碼的,為了達到這個目的,閱讀器首先需要知道他們即將接受的標簽是采用哪些方式編碼的。

事實上我需要的僅僅只是最簡化的RFID閱讀器,所以只需要能得到一些最低等級的數據就可以了,但很奇怪的是,居然沒有現成的。每一個調試方法都是一個不同的電路,而且網上的這些電路看起來就是用來炫耀的,比如這篇200頁的文檔

http://ww1.microchip.com/downloads/en/devicedoc/51115f.pdf

在一通亂找之后,我們找到了一個比較簡單的設計:全世界最簡單的RFID閱讀器(鏈接:http://forums.parallax.com/showthread.php/105889-World-s-simplest-RFID-reader)。這有一個改進版的”DIT一個FSK的RFID閱讀器”(鏈接:http://playground.arduino.cc/Main/DIYRFIDReader )。事實上,這些其實也並不很符合我們期待的那樣。

我們使用PM3來閱讀不同型號的標簽發出的原始數據,PM3將作為閱讀器的線圈,並且過濾掉載波,留下阻尼的影響。

下面是ASK調試信號:

正如我們所想的的那樣,一個簡單的由載波的阻尼和非阻尼影響產生了一個方波。

下面是FSK標簽:

注意兩種不同脈沖的形狀,一個是瘦的,另一個長得比較胖。這樣我們就能看到不同頻率的脈沖了。

接下來的是PSK:

好吧,我也要瘋了,這究竟是什么鬼???

首先,圖中綠色的線表示標簽的阻尼/非阻尼影響下的閱讀器線圈上的電壓。我們並不需要知道具體的代表什么,只需要知道屏幕地步是0V電壓,或者說是全阻尼,而屏幕頂部是某一個電壓值,或者說是無阻尼狀態。電路產生的是125KHz的載波,並且可以提高或者降低輸出。至於說他具體是怎么工作的,我他媽才不管,這是芯片的事情。

現在我們知道了每條線的意思,問題就剩下了這些線為什么會是這樣形狀的。第一個例子很簡單:ASK/OOK調制不是ON就是OFF,因此我們在無阻尼的時候在屏幕頂部得到一條線,而在阻尼的時候,就會在地步得到一條線。

如下圖,標簽在阻尼閱讀器線圈的地方我用紅色標記出來了:

接下來讓我們分析下FSK的:

現在,不是簡單的用0和1表示阻尼了,我們用每個波的不同的周期來重新代表了經過阻尼和非阻尼的載波。如上如,紅色標記一個波的一個周期。脈沖的寬度和數量攜帶了這段波要表達的內容。

好了,那么,最瘋狂的PSK呢??

在相移鍵控中線圈的阻尼和載波的頻率有關。在本例中,它會正好變成速度的一半,因此,它正好阻塞一半的載波脈沖,而大部分時間產生的信號都無法強到直接是結果到達屏幕頂部,同時也不會低到到達屏幕底部,而是正好在中間。然而,只要有相位的變化,只要有半個bit的變化就意味着阻尼和非阻尼的在一個載波周期內發生了變化,因此,我們可以看到一個小的躍遷,或者躍降。如圖中的粉紅色部分,表示阻尼了50%的時間,正常的相移是紅色和黑色部分。

我們可以看到完全阻尼部分的低峰值和非阻尼時候的高峰值。這用肉眼很難讀出來,但基本的相位變化(只要相的方向變了),bit值就發生變化,這點可以很容易觀察到。相位如果不變的話,就是bit值保持不變。Bit的位數取決於相保持不變的時間,因此,只要在圖中加上一個網格紙,你就能知道載波的周期了,通過這樣的變化,你就可以得出比特流了。

假設我們開始的時候是“0”,那么我們通過上圖就能得到如下比特流:

01101010001111100111000100010110000111010011100101101100001

好吧,確實有點難以理解。

但是好像我們找的電路可以實現這樣的工作。

然而事實證明並不能,還有以下兩個問題:

1.它無法處理相移鍵控的下相位峰值問題。

2.在我們一開始玩的時候,就忽略掉了功能的問題,我們想做到更多的事情。

首先,為什么是只有一個閱讀器,我們是否還可以有一個寫入器?和其他的技術不同,RFID的閱讀和寫入是兩個幾乎沒什么差別的東西。在閱讀器向標簽發送信號的過程中,可以發送”write” 和”data” 兩種命令,這和閱讀標簽一樣的簡單。

然后,為什么只有一個寫入器,我們是否還可以有一個模擬器?所有的問題都只是閱讀器/寫入器與標簽之間的激勵與被激勵的關系而已。

基於以上的種種問題的解決,於是RFIDler誕生了,現在它活躍在Kickstarter上:

http://www.kickstarter.com/projects/1708444109/rfidler-a-software-defined-rfid-reader-writer-emul

所有的工程詳細內容都在文章末尾的鏈接里了,是一個用少於30英鎊做的低頻RFID研究以及一個精簡版的版本可以嵌入到自己的硬件項目,這個只有不到20英鎊。

我已經開始一個基於PIC32的固件項目,它運行在上述UBW32 BitWhacker,好了,最后將端口添加到其他平台吧。

項目地址如下:

https://github.com/ApertureLabsLtd/RFIDler

*參考來源adamsblog.aperturelabs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM