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阅读器。这有一个改进版的”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

*本文转自 K1two2 博客园博客,原文链接:http://www.cnblogs.com/k1two2/p/5525455.html  ,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 内存技术
【软件开发流程控制文档】嵌入式应用软件在线升级功能软件需求规格书
【软件开发流程控制文档】嵌入式应用软件在线升级功能软件需求规格书
33 0
|
4月前
|
编解码 数据挖掘 测试技术
对于大屏幕显示系统工程,这通常涉及到硬件(如显示器、投影仪、控制器等)和软件(如内容管理系统、控制软件等)的集成。
对于大屏幕显示系统工程,这通常涉及到硬件(如显示器、投影仪、控制器等)和软件(如内容管理系统、控制软件等)的集成。
|
4月前
|
Python
智能卡系统工程是一个涉及多个方面的复杂系统,包括硬件(如读卡器、智能卡)、软件(如读卡器驱动程序、智能卡操作系统和应用软件)以及网络通信等。
智能卡系统工程是一个涉及多个方面的复杂系统,包括硬件(如读卡器、智能卡)、软件(如读卡器驱动程序、智能卡操作系统和应用软件)以及网络通信等。
|
6月前
|
机器人 测试技术 语音技术
LabVIEW使用软件定义进行汽车电子测试
LabVIEW使用软件定义进行汽车电子测试
55 0
|
6月前
|
Linux
Linux设备驱动之多个同类设备共用一套驱动
Linux设备驱动之多个同类设备共用一套驱动
171 0
|
人工智能
西门子S7-300的硬件结构,各模块按照什么顺序来组态?
今天我们来介绍一下西门子S7-300的硬件结构,并和大家讲一下S7-300各模块是按照什么顺序来组态的。
西门子S7-300的硬件结构,各模块按照什么顺序来组态?
|
网络协议 物联网 5G
教你如何进行嵌入式网络模块的联网操作
教你如何进行嵌入式网络模块的联网操作
202 0
教你如何进行嵌入式网络模块的联网操作
硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件
有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的。为了更好的表述封装设计过程,本文描述了一个创建USB封装,创建DIP焊盘,关将原理图的元器件关联引脚封装。   该USB是完全定义建立的封装,DIP带固定柱
硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件
|
C# 开发工具 C++
惠普打印机、扫描仪二次开发、支持状态获取
惠普打印机、扫描仪二次开发、支持状态获取
805 0
惠普打印机、扫描仪二次开发、支持状态获取
|
安全 Linux Android开发
阿里90后工程师利用ARM硬件特性开启安卓8终端“上帝模式”
本文以安卓8终端为载体,介绍阿里安全潘多拉实验室成员研究并提出的内核空间镜像攻击利用技巧。
6897 0
下一篇
无影云桌面