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
RFIDler:一款定义RFID的读、写、仿真器的开源软件的更多相关文章
- java它们的定义jar套餐读Excel(这包括2003和2007)数据,和实例
使用java它们的定义jar套餐读excel数据支持excel2007和excel2003 在http://download.csdn.net/detail/u010792467/8079355下载所 ...
- Pandas 基础(4) - 读/写 Excel 和 CSV 文件
这一节将分别介绍读/写 Excel 和 CSV 文件的各种方式: - 读入 CSV 文件 首先是准备一个 csv 文件, 这里我用的是 stock_data.csv, 文件我已上传, 大家可以直接下载 ...
- MyISAM Key Buffer 读/写/利用率(%) MylSAM平均每秒Key Buffer利用率(%) MylSAM平均每秒Key Buffer读命中率(%) MylSAM平均每秒Key Buffer写命中率(%)
MyISAM Key Buffer 读/写/利用率(%) MylSAM平均每秒Key Buffer利用率(%)MylSAM平均每秒Key Buffer读命中率(%)MylSAM平均每秒Key Buff ...
- openpyxl -用于读/写Excel 2010 XLSX/XLSM文件的python库
openpyxl -用于读/写Excel 2010 XLSX/XLSM文件的python库¶ https://www.osgeo.cn/openpyxl/index.html
- Windows操作系统中的I/O(读/写 输入/输出)
导言 写一个Windows平台下的应用程序大多时候都是离不开读写文件,网络通信的. 比如一个服务应用程序来说,它可能从网络适配器接受用户的请求,对请求进行处理计算,最终将用户端所需的数据返回,中间可能 ...
- java读/写文件
读取文件参考:https://blog.csdn.net/weixin_42129373/article/details/82154471 写入文件参考:https://blog.csdn.net/B ...
- 使用 FIO 对 Kubernetes 持久卷进行 Benchmark:读/写(IOPS)、带宽(MB/s)和延迟
工具 Dbench https://github.com/leeliu/dbench 用法 编辑 dbench.yaml 文件中的 storageClassName 以匹配你自己的 Storage C ...
- 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖
引用 http://baike.baidu.com/link?url=z_phkcEO4_HjFG_Lt163dGFAubdb68IbfcfzWscTOrrZ55WbJEQKzyMQ5eMQKyatD ...
- Windows系统下三十款优秀开源软件
Windows系统下三十款优秀开源软件 1.Firefox 官方网站:http://www.getfirefox.com/ 可替换Internet Explorer 功能特点:如果你还没有使用Fire ...
随机推荐
- Bootstrap标签
Bootstrap是Twitter推出的一个用于前端开发的开源工具包.用外链加载的方式可以将Bootstrap链接进来 常用方式: <link rel="stylesheet" ...
- jmeter 建立一个网络服务的测试计划
如何创建一个 测试计划 测试一个网络服务. 你会 创建5个用户发送请求到一页. 同时,你会告诉用户运行测试两次. 的总数 请求用户请求(5)x(1)x(重复2次)= 10 HTTP请求. 来 建立测试 ...
- 制作ubuntu安装u盘
Ubuntu官方中文译名为友帮拓,是一款开源免费的linux操作系统.与其他的linux操作系统不同之处在于Ubuntu的软件包清单只包含那些高质量的重要应用程序,因此深受广大linux用户的喜爱,那 ...
- CentOS中yum安装软件时报错:No package XXX available
yum 安装软件时,报错:No package XXX available. [root@localhost ~]# yum -y install redis Loaded plugins: fast ...
- CentOS报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock32 error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
今天安装完带图形界面的CentOS 7后,在Terminal中运行yum安装命令时报了以下错误: Could not retrieve mirrorlist http://mirrorlist.cen ...
- VBA提高速度的技巧
此贴原转自EH论坛,我自己有所修改 [编者按]速度是程序设计永恒的热门话题,虽然速度技巧在各种语言之间可以相互借鉴,但差别有时也会很大,比如VC中由于字符串的存储方式决定了判断空串使用len函数更快, ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- DES加密算法
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开 ...
- Servlet后续的尾(yi)巴--------Filter过滤器
-------载录自 http://www.blogjava.net/yangaiyou/archive/2007/08/29/140854.html 感谢博主心如止水 一心向佛 描写出这么的具体 ...
- 教你如何用PS制作多款按钮UI设计教程
教你如何用PS制作多款按钮UI设计教程 本文教大家制作按钮的方法 LV. ★ 初入设计,学做按钮.只会套个底色,加个阴影,字体纯白,小聪明的弄个圆角. LV. ★★(描边.字体.内阴影) 看了很多案例 ...