首页
社区
课程
招聘
[翻译]Arduino DIY RFID门锁
2016-8-27 23:48 11438

[翻译]Arduino DIY RFID门锁

2016-8-27 23:48
11438

DIY 带备用电池的电子RFID门锁

英文版原文地址:http://www.codeproject.com/Articles/1096861/DIY-electronic-RFID-Door-Lock-with-Battery-Backup

提示:这是第一次用 Arduino/Teensy开发Desfire项目,你只需稍做修改就可以用于Windows, Linux或者其他平台

关于小偷


最近Spiegel出版了一篇关于德国小偷的文章:

窃贼喜欢冬月入室盗窃,12月份入室盗窃比7月份增加3倍多。

警方说,很难找到罪犯。主要是没有目击者和痕迹。只有约2,6%的入室盗窃犯被判刑。

窃贼不只有闯入富人的房子。每个人都可能成为受害者。在附近他们发现房子里有情侣、笔记本电脑或现金的。特别是吸毒者选择房屋附近是这样的环境。

根据警察的经历,最好的预防是一个机械保护的门窗和细心的邻居。大多数窃贼只有2 - 3分钟时间尝试进入房子。但在60%的情况下,他们是会成功的。

这篇文章讲述,德国警方指出,越来越多的入室盗窃职业犯罪团伙来自于塞尔维亚,罗马尼亚,土耳其,阿尔巴尼亚和格鲁吉亚。这些人申请庇护,通过在欧洲不同国家进行旅行,只做一件事:偷窃。

还有另一篇文章与德国的地图显示城市主要发生入室偷窃的地方。警方统计2015年发生了152.000例 -趋势增加。

大多数的门锁是非常不安全的
你的门锁保护你免受窃贼吗?
如果你主要是这样的:


当然不。

你的门可以在几秒内打开,你甚至不会注意到有人进入,当你不在家的时候,因为门和锁都没有被破坏。同样你的邻居不会听到什么,因为开锁声音绝对是很静。
你不相信吗?
然后看这个视频:


正如您所见:开锁很容易。

一个小偷甚至不需要特殊的工具。他就可以通过两个发夹打开你的锁!

当你在Youtube上搜索“开锁”你会发现169.000个结果。

在这个视频中如你所见:用电子振荡器(把枪)只要不到10秒钟就可以打开一个锁。

你在这个视频看到:即使对于十字锁,用专门的开锁工具也可以在10秒内打开。

更好的机械锁

这里有更好的锁,钥匙用这样的圆孔替代刻槽,像KESO 2000。


这些锁是非常昂贵。不过,他们也可以开锁,尽管它可能需要3分钟才能打开。你看到这个视频。

你在这个视频看到:最后锁可以被一个大钳子或钻打开。

结论:你不会找到一个机械锁是安全的。

复制钥匙

如果你出租一套公寓,你的租户可以复制钥匙给他人。所以他可以转租你的公寓。如果有一天他离开了,然后你重新想出租公寓,你必须换锁,否则之前的租户仍然能够进入这套公寓。

电子门锁

电子门锁的优点是,上述安全问题不再存在。安全门锁比通过发出声音的报警系统更能阻止小偷进入。当警察到来时,小偷可能带着贵重的东西逃之夭夭了。安全锁比报警系统或摄像头更好。

市场上可以选择的有什么?
我寻找一种电子设备,但是我发现没有能满足我的:

有指纹识别的,但是我发现没有一个是能防水的,所以不能户外安装。另外,你电子设备暴露在街道很容易就会被不怀好意的人破坏。

你可能已经在酒店看到,有些电子门锁是用卡来开门。

但这些仅能在供室内安装,他们依赖于一个小电池,电池很快就将到期。

我发现当你有一个电源故障却没有解决方案,因为他们都缺乏一个强大的备用电池。一个锁在停电的情况下是没有用的。

主要是电子解决方案太贵了。

我的项目

所以我设计我自己的解决方案具有以下特征:

1、设计大楼的正门:没有电子设备暴露在街道或被雨淋。你只需要在门内侧挂载一个RFID读取器通过这扇关闭的门读取RFID卡。
2、没有可能从门外面被暴力推开。
3、强大的备份电池确保设备即使停电也能工作好几天。
4、微处理器管理充电。
5、提供了一个非常容易使用的界面可以通过一个USB电缆与终端程序相联,允许您很快添加或删除用户。即使电脑初学者很快可以管理用户授权。
6、你可以储存64个用户在卡片微处理器里的EEPROM。超过64用户可能通过修改源代码。
7、访问终端接口是用密码保护的。
8、如果你或你的房客丢失RFID卡,您可以轻松地从EEPROM删除这张卡,无需改变机械门锁。
9、我设计了一个板子的布局,让电子焊接初学者都可以操作。
10、整个解决方案比商业解决方案便宜。
11、假设你有一个安全的门不会被一根撬棍不能打开,这个解决方案比任何保险便宜,它能保护你一辈子,而不用支付任何保险。
12、整个项目是由一个非常有经验的硬件和软件工程师设计和测试。

RFID卡和令牌

什么将取代你的机械钥匙?
您可以选择一个RFID卡或令牌像这样:


这些卡片对于弯曲是很敏感的,所以你应该把它们放在你的钱包,而不是口袋里。

每个RFID卡或令牌具有唯一的ID号,这是由工厂分配的,以后不能修改。有的卡(如Mifare Classic),有一个4字节允许2^ 32种可能的ID,其他卡 (如MIFARE DESFire),使用7字节的ID允许2^ 56种可能的ID:远远超过任何机械钥匙。

我的项目支持13,56MHz卡遵守智能卡标准ISO14443 A和B,或ISO 18092。更多细节见维基百科。

您可以编译源代码为两种可能的操作模式:

1.适用于MIFARE经典卡:在此模式下一张卡的ID被用于识别一个用户来开门。 (不建议)

2.适用于Mifare DESFire卡:在这种模式下,密钥长128位或168位能够保护你的门。但是,即使在MIFARE经典模式蛮力攻击是不可能的,因为攻击者不知道自己的卡ID,这意味着他将不得不尝试2 ^ 32甚至2 ^56可能卡的ID。

这是不可能的,因为在Teensy运行开门代码时,在无效的判定后延迟了1秒。攻击者无法生存足够长的时间来测试所有的可能性,因为这将需要140年。

MIFARE经典卡

这将是可以存储在MIFARE经典卡的秘密值以及带密钥保护它。
但是,这没有任何意义,因为MIFARE经典的加密已被破解。
当飞利浦设计的经典卡时,他们犯了错误使用弱加密算法(Crypto-1)来实现“security-through-obscurity”。
究其原因,这些卡是如此之广传播(对已售出40亿)是算法已被保密了14年。
但在2008年的一个研究小组分析了芯片在显微镜下,并在硬件实现的算法可以推断。
他们发现,最关键的48位密钥是有几个设计缺陷。
你会发现更多细节在压缩包里的《Reverse Engineering Mifare Classic cards.pdf》。
其结果是,今天MIFARE经典卡可以在几秒钟内被克隆,包括存储的所有数据,即使数据被用密钥保护在EEPROM中。
通常一个RFID卡的唯一ID是工厂被分配,不能事后修改。但在eBay上,你可以买到中国的克隆卡,允许写任何的ID到卡上。 (搜索“UID更换卡”)
因此,理论上恶意攻击者可能通过克隆你口袋里的MIFARE经典卡,来访问你的房子。
这也有可能是通过Android的NFC应用程序实现RFID卡通信来完成。
这也有些设备像 Tastic RFID Thief 那样可以从半米的距离读取RFID卡。
所以,如果你决定使用MIFARE经典卡,你应该买一个不锈钢钱包里面有一个金属屏蔽层,阻止任何外部RF频率访问您的卡,让克隆您的卡成为不可能:


旧的Mifare DESFire卡

2002年,飞利浦推出不依赖自主研发算法的DESFire卡。DESFIRE使用(如名字一样)DES加密。不过,对于第一代DESFire卡的攻击已经公布,允许通过旁路攻击,以获得从EEPROM中的加密数据。用复杂的硬件来检测卡在加密过程中的功率消耗。但这种攻击比MIFARE经典卡攻击更为困难,耗时大约7小时。

你可以在Youtube上找到一个视频,是关于德国波鸿鲁尔大学的卡斯帕·蒂莫介绍(英文)如何破解老式DESFire卡。在视频的18分20秒的时候,他开始谈到的DESFIRE攻击,以及他们如何提取从卡中的所有加密密钥,但视频的其余部分也很有趣。

你应该不再使用旧的DESFire卡。我的项目不支持他们,因为他们要求的物理认证没有生效。

Mifare Desfire EV1卡

2009年新一代Mifare Desfire EV1卡面市:它又一次改良了,直到今天也没有任何已知攻击。

所以,如果你使用DesFire EV1卡,你并不需要一个不锈钢电子钱包。

购买DesFire EV1卡是比较困难的。

你购买50,100甚至500张卡也不会有优惠和降价。

我发现这两家公司还有少量出售(RyscCorp和Smartcard Focus)。

您也可以通过eBay在Smartcard America下订单,但他们的运费对其他国家来说是非常昂贵的。

小心假冒来自中国在eBay上供货:中国克隆履行的安全标准,如同原NXP卡一样没有保证。

         Mifare Classic 和 Desfire对比


经典卡是完全静态的,而DESFire卡存储数据包含在“applications”中,"files" 是动态大小的。
什么是应用程序?

应用程序无非就是文件的容器。

想象一下,一张RFID卡发给一所大学的学生。
这张卡,学生即可以在食堂吃饭,可以用来停他的车。
在这个例子中,卡上的两个应用程序是独立的:一个食堂应用程序和一个停车应用程序。
学生可以给午餐和停车充钱,这会被存储在相应的应用程序文件中。
每个应用程序具有一个或多个加密密钥(该应用程序的密钥),其允许改变相应的应用程序存储的值。
每个密钥可能只有读权限、只有写权限或两者兼而有之。
此外,该卡具有另一个重要的密钥:PICC主密钥,这是“god Key”。
PICC主密钥允许创建和删除应用程序,分配密钥给每个应用程序,甚至格式化整个卡。
但有趣的是PICC主密钥无法访问存储在应用程序中的数据。
无论是食堂,还是停车位都无法知道PICC主密钥。
他们只能访问到相应的应用程序,却不能超出这个权限。

RFID读取器

来自Adafruit(USD $40)的PN532接口板有来自NXP(原飞利浦)芯片。
当您订到这块主板时,芯片已在白色MIFARE卡上了。
该板尺寸为12厘米×5厘米,厚3毫米。
它的内部工作电压3.3V,但可以用5V。

该板不只能读MIFARE卡,它还读取您的生物特徵、FeliCa卡和NFC(Near Field Communication)。它还能与万事达卡和Visa集成的RFID(PayPass,payWave,ExpressPay),卡里普索等通信。

此板相对于其它硬件的主要优点在于,天线(印刷在板内)是非常大的(一个RFID卡的大小)。
它的硬件比其他天线更小,但读取的距离更大。
Adafruit说,天线检测卡片的距离可以达到10厘米。
对于白色MIFARE经典卡来说这是真的,如果板上带有这样的芯片。
但我有另一张卡(公共交通用),检测距离可达到7.5厘米。
并且我还有需要检测距离达到5.5厘米的令牌(令牌的天线比卡的天线更小)。
DESFIRE EV1卡的最大距离取决于加密,因为加密增加了卡的功率消耗:
如果在经典模式下(不使用加密),这个距离可以达到6,3厘米。
如果在DESFIRE模式与DES加密编译的距离可达5,3厘米。
如果DESFIRE模式,AES加密编译的距离可以达到4,0厘米。
此外,我测量发现,该卡会消耗更多电量,如果内存越大的话。
4 KB的卡可以比8 KB卡有更大的读取距离。这个距离是大约为5mm。
由于我的项目仅占卡中的EEPROM几个字节,你应该买尽可能小的卡。
您应该安装转接板在你家门的内侧。

你可以在它上面安装一个塑料或木盒保护其免受机械损坏。

在那个盒里也要安装一个双色LED(红/绿)总是显示系统是否正常工作。

一根长平线把它与主板连接起来。

在这里,你可以看到转接板通过扁平电缆与双色LED连接的照片:

首先,你必须在板子上焊接定义通信模式的两个跳线。

线太长,I2C传输就会变弱,因为I2C是上拉电阻的集电极开路总线。

我用10kHz的低速SPI通信。

所以,你必须设置跳线:SEL0= OFF和SEL1= ON。

阅读Wikipedia有关SPI和I2C。

我故意焊接在门上不使用任何插头,这里是为了更安全。

板之间的电缆连接

转接板(装在门的内侧)和主板(你放在靠近门口的一个安全的地方)之间需要一根长一点的线缆。

我用10条扁平电缆。

如果你不希望使用扁平电缆也可以用一根网线。

但网线只有8根线。

在这种情况下,你可以在另一个地方(而不是在门上)安装LED,这样你就只需要8根线。

SPI总线需要用几个兆赫的速度正常运行。

这样就不能用较长的电缆来传送信号。

所以我把SPI的速度限制在10kHz。

即使超过3米的电缆信号在示波器上看起来也绝对清晰。

我想,即使10米也能没有任何问题的工作。

当使用Defire卡,你甚至可以附加一个SPI电缆,但你永远不会看到在电缆上传输的加密密钥。

在只有加密的随机值传送和密钥变化成新的密钥发送也从未离开Teensy会话密钥加密。

Teensy3.2

主板的心脏是微处理器。我使用的是从PJRC.com买的Teensy3.2 。

与其他的Arduino相似板相比Teensy有几个优点:

1.它是非常快的(32位在96MHz的运行ARM处理器)

2.它是很小(3.5厘米×1.5厘米)

3.它比其他板有更多的RAM(64 KB)和Flash程序存储器(260 KB),它还有一个EEPROM。

较新的Arduino电路板(Due, Zero, 101)完全没有EEPROM,这使得它们毫无用处。

4.它便宜(USD $20)

5.耗电量低。

6.它内部工作电压在3,3V,但可以用5V的。

7. Teensy库(TeensyDuino)比官方的Arduino库有更多更好的功能。

首先,你必须弄掉在Teensy与纸板切割机底部的小跳线。

否则,从USB电缆来的5V将与主板的5V电源直接连接。

这将导致当前电流在计算机关闭的时候主板开启,反之亦然。


电池

我用了一个12V铅酸摩托车蓄电池,在电源故障的情况下,备份系统。

电池能让整个系统能够长久地运行。

电池提供开门所需的高电流(1..2安培)。

如果出现电源故障,电池可保持系统运行大约五天。

微处理器持续保持电池电压在13,6V。

在这个电压(所谓的“浮充电”)电池具有最长的使用寿命。

如果电池将充电和放电在时间间隔较长的话,它的寿命将会缩短。

太高电压(>14,4V)导致正极板栅腐蚀。

过低的电压导致硫酸化在负极板上。

在13,6V电池具有非常高的阻抗。

当你拔下充电器,你会看到,电压迅速下降(2分钟内)从13,6V到12,8V,然后非常非常缓慢到12,0V(几天之内)。 这个是正常的。

此图显示了可以从电压直接推导出一个铅蓄电池的充电状态。

你看,在12,8V电池100%满。

你会发现在batteryuniversity.com很多有关电池的详细信息。

我使用模块是YTX7A-BS具有为6Ah。 (USD $ 30)

这种铅蓄电池是MF(免维护),这意味着你将永远不会给它补水,它也能工作得很好。

当你买了它,它包含6个单独的酸块。

你填充酸到电池,几小时后的液体转换成凝胶。

然后你关闭电池,不用再次打开它。

电池里面是液体不能够在任何位置安装电池,它不能是垂直的。

你可以把电池安装到背面的,并安装主板在它的上面,以节省空间。

铅酸电池不能接触高温,你应该按规定存储它们,否则他们的寿命会缩短。

要非常小心的电池!如果你产生一个短路,电流流将超过100安培!两极之间会产生一团烟雾!

主板


在左侧的扁平电缆连接到RFID读取器。在右边的电缆连接到门的线包和电源线(220V)。

这里是电路图:



当继电器开关打开门。继电器会被激活100毫秒(区间可以在源代码进行配置)。

该变压器让电池正好以200mA电流充电。

电池不应该被接入比它高10%以上的电流,否则寿命将被缩短。

6Ah电池需要的最大充电电流为600mA。

一个12V变压器提供12V*√2=17V的峰值电压。当连接到电池合拢时,这个电压为实际电池的电压。

该BD680是PNP达林顿晶体管,集成电阻:

在这里,该晶体管相当于一个开关。

Teensy处理器会测量模拟输入引脚(A9)的电池电压。

通过BD680频繁打开和关闭,电池电压稳定在13,5V和13,7V之间。

当处理器检测到,电压出错(<13,0V或>14,0V)红色LED会闪烁,表明出现了问题。

原因可能是一个电源故障或缺陷。

标有黄色感叹号的电阻器的作用就像一根保险丝。

在7805短路或在整流器短路就会玩完,避免超过100A流过电路的情况下,该电阻应为1/ 4W。
Parts List
元件清单

1 x Adafruit PN532(带有一张MIFARE经典卡)
1 x Teensy 3.1或3.2
1 x摩托车蓄电池12V,6Ah,MF
1 x面包板13.5厘米×11厘米(13.5或厘米×6厘米,如果您使用外部变压器)
1 x 7805
1 x BD680
2 x BC546
1 x 1N4148
1 x继电器:电磁阀12V,220V开关,16A
1 x双色LED(红/绿)
1 x整流器至少80V,1A或更好的400V,3A寿命很长
1 x变压器 12V,0,5A(12V交流,而不是更多,也不是更少,也不是提供直流电源!)
1 x保险丝30毫安
1 x保险丝座
1 x 0.22Ω,1 / 4W
2 x 820Ω,1 / 4W
3 ×10kΩ,1 / 4W
1 x 220kΩ,1%,1 / 4W
1 x 15 kΩ, 1%, 1/4W
1 x Rx (见下一章)
1 x 330 nF,63V
2 × 1μF,50V(电解电容比钽电容有更长的使用寿命)
1 × 10μF,35V(电解电容比钽电容有更长的使用寿命)
1 x接头,10针,公头,金触点
1 x牛角接头,10针,母头,金触点
1 x长扁平电缆(10芯)
1 x长2芯电缆 开门操作(2A电流)
1 x电源线带电源插头
1 x粗铜芯电缆,直径1毫米,红色(电池用)
1 x粗铜芯电缆,直径1毫米,黑色(电池用)
1 x USB细电缆
1 x热能热缩管,直径为3毫米,长20厘米(用于LED)
2 x螺丝M3 +螺母+垫圈(用于变压器)
额外的Mifare卡或令牌

如果你本地没有一个的电子商店,您可以订购此列表从DigiKey或Farnell,或者网上邮购的卖家提供了成千上万的电子零件。

重要提示:
我的电路已经只针对一个12V交流(AC),没有其他的设计。如果连接了直流电源(DC)你会缩短BD680的并且由于高电流,将当流过晶体管开关的电源的寿命。

主板布局

在zip文件中,你会找到我设计的单层线路板来手动焊接(Board1)。

这款主板对电子初学者来说也是非常容易焊接的。

我也只花了半天就全部连接起来了。

此外,您找到一个Board 2,是由Josef Krusch在Eagle 7.6上设计的。

你可以用Eagle的免费版本打开这个Eagle文件。

如果你想要一个专业的电路板,可以将这个发送到厂家,做PCB双层板。

在board 2上,你可以看到两个继电器。

上面的继电器是未来扩展用的。

也许有一天,你想单独打开两扇门。

但目前的源代码是没有为此做准备。所以省略了上继电器、BC547、1N4148、330nF和10K。

如何计算Rx

电阻Rx限制通过开门电磁铁,您在下面的图片中可以看到。

在这里,你看到的锁打开(底板被移动)。

我在门的内侧安装此锁。

我去除锁前面部分,所以不可以从门外进行操作。


首先,线包连接到可调节的直流电源上。

电压从零缓慢上升,直到锁被打开。

在我这里,这个电压在2,8V。

但是,这是太不安全。用更高的电压来确保门始终能够被打开。
我选择使用3,5V。

然后,我当前使用3,5V电压,1,3A电流。

至于我都开两扇门同时我在这两个系列电磁阀连接。

所以,我需要7V电压、1,3A电流。

Rx电压12V - 7V= 5V,这导致电阻器:
现在计算电阻的功率:
P = U*I = 5V*1,3A = 6,5W

如果您当地的电子商店不具备这个值,可以切换多个电阻并联。
例如4 *15Ω其中每个应具有2瓦特的功率。

这将导致3,75Ω用8瓦总电阻。

要计算两个电阻并联可以用公式:

R total = (R1 * R2) / (R1 + R2)

LED的含义

两色LED,应安装在门的内侧或在它是可见的任何地方。如果一切正常,它会不停地闪烁。

Green LED 连续快速闪烁         一切正常
Green LED 1s闪一次                 门被授权人打开了
Red LED 连续快速闪烁         电池电压超出范围。原因可能是一个电源故障。
Red LED 1s闪一次                 未经授权的人试图使用无效卡或令牌开门。
Red LED 闪烁很慢                 显示PN532板通信问题。这是一个严重的错误。
LED熄灭                                 这表明有缺陷。

降低功耗

已做了一切都是为了降低功耗:

最高功率消耗来自PN532板:芯片和令牌没有电池,就必须由外部电源供电。

PN532必须产生13 MHz的RF场,要通过天线的芯片卡馈送功率。

当产生射频,PN532消耗110毫安。

还有一个命令,允许把RF场关闭。

但是,如果没有RF场就不能检测卡。

那么,我的代码确实是打开RF场100ms,检查是否有卡,然后关闭RF场1秒钟。

当RF场关闭PN532仅消耗18毫安。

结果就是26毫安的平均消耗。

Teensy具有96MHz的CPU时钟频率,消耗40毫安。

作为不需要这样高的速度,所述时钟设置为24MHz的低功率消耗至20mA。

最后的总电流平均46毫安。

继电器通电的时间间隔进行了优化。

高电流流过电磁线圈。

你必须要测试的间隔适用于您的电磁阀。

你可以修改源代码。

在我这里,电磁已经可以有20毫秒的间隔来工作。但要它在我程序里的时间间隔变为100毫秒来验证。

预期寿命

今天我们所使用的电子设备只有一个短暂的生命期,尤其是那些来自中国的产品。

但它一直没有这样至今

从前,好东西是“德国制造”,它总是意味着高品质,寿命长。

我有一个根德的放大器,我在20世纪90年代初买的。

它今天仍然在工作。我在近30年只修过它一次!

但在1980年,日本第一个产品用低廉的价格、糟糕的品质打入市场。

在那些年中,客户他们宁愿选择便宜的日本产品,也不愿选择一个高品质的德国品牌。

在这些年里,高品质的产品在世界各地减少。

今天,中国正在继续这种倾向。

甚至还有人支持那些公司故意生产只有很短寿命的设备(“Planned Obsolescence”)。

但是,这直到今天也无法得到证实。

事实是,行业现在正处于一个艰难的价格战中。
公司必须让自己的产品便宜,否则客户是不会购买的。

客户是罪魁祸首,因为他不愿意为高品质支付更多。

你还记得日本便宜的VHS和德国高品质Video 2000之间的战争吗?

更坏的体制赢得了这场战争,因为客户不考虑价格的质量成本!

企业如何降低价格?

首先,使用尽可能廉价的电子零件。

其结果是,往往部分零件是不达标的。

例如一个晶体管被设计为1500伏的最大电压,但实际是用1200伏电压的来持续运行。很明显,该晶体管只有很短的寿命(约5年),因为它在超负荷运行。

另一方面的晶体管设计为100伏,但运行在5伏的状态,这明显会有更长的寿命(> 30年)。这同样适用于电流。

很多功放晶体管或集成电路为了节省资金和空间被设计过小(甚至没有)。

对于失败的另一个常见原因是插头和开关。

随着时间的推移它们会被氧化、连接失效。

好的插头需要用黄金,但黄金价格昂贵,大部分企业不会使用它们。

同时也是另一种极端的存在。想想看,高品质的电子设备不能失效:

例如在医学、卫星或军用领域。

在这里,工程师们一定不会选择最便宜的部件(让它超负荷运行),来使电子尽可能不安全。

他们甚至添加电子元件来接管其他地方失效的部件。

例如5凝汽器切换运行,其实只需要一个就足够了。

我维修电子设备好多年并且大量处理电子元件失效的经验。

这些通常是与高电压,高电流工作,会变热的半导体。

具有高电流工作的电解质凝汽器频繁失败(这是开关模式电源的供电最常见的原因)。

我已经为这扇门设计了一个长的寿命。

这里的零件是不会发烫的。

门开启线包的高电流由继电器而非晶体管切换,因为继电器更健壮(鲁棒性)。

该BD680容量高达4安培,但在这里它切换只要200毫安。

这相当于它的5%的电位。

我建议使用容量为3安培的整流器,虽然流过的电流只有200 mA。

你应该尽可能避免使用插头。

在我的照片,你看到Teensy是直接焊在电路板上只是为了避免将来发生接触问题。

扁平电缆插头应该有镀金的。

你应该若干年后更换的唯一部件是电池。

最后,我想这对电子产品的预期寿命应该是20 - - 30年,甚至更多。

加载固件到Teensy

方案A:

您可以从arduino.cc安装 Arduino的编译器和PJRC.com的Teensyduino库来编译,你会在ZIP文件中找到的草图。

您必须像这样配置编译器的设置:


方案B:

或者您没有安装任何东西,直接加载预编译的固件到Teensy3.1或3.2板。你能找到ZIP文件的HEX文件和TeensyLoader.exe。

联接Teensy

你需要一个Micro USB数据线把Teensy连接到您的计算机。

首先,你必须安装Teensy串口驱动,使Teensy出现在PC上的虚拟COM端口。

你能在ZIP文件中找到驱动程序。

您可以通过终端程序和Teensy通信。

您可以使用免费TeraTerm或内置于Arduino编译器的串行监视器。

你不必在意波特率,因为theTeensy忽略它(不像老式的Arduino板)。

数据总是能用USB速度传输的。

如果使用串行监视器必须选择COM端口(菜单“工具”,见下图),并配置它来发送换行符:

如果你使用TeraTerm你只需要选择COM端口:

重要信息:如果Teensy没有电源(如果断开电池),或者如果您按Teensy的“Program”按钮,而COM端口是在终端程序中打开你首先必须关闭的COM端口,断开USB连接线,重新连接,然后打开COM端口重新!

为了避免这种情况,你应该先关闭COM端口(TeraTerm菜单“Disconnect”),通过Teensy电源或按“程序”按钮来移除。

其原因是,Windows不会移除COM端口,而任何程序都有端口仍处于打开状态(尽管Teensy已断开)。

管理用户

在终端程序打开COM端口后,你会看不到任何东西。

如果启用密码保护你现在必须输入密码并按下回车键,否则,你直接按回车键。

在这两种情况下,主菜单会出现:


菜单显示可用的命令和实际状态。

如果你减少用户名字符长度(数量),可以存储超过64个用户在EEPROM中。

清理

你总是要在一个新的Teensy板做的第一件事就是清除EEPROM:
键入“clear”,然后按Enter。


添加

要添加访问权限的新用户,键入“添加”,后跟用户名,然后按Enter。

正如你看到的,这些卡使用一个字节7 UID(Desfire)。

除了存储在Teensy的EEPROM中ID和用户名,还要几个步在要DESFIRE卡上执行。 见下文。

恢复

以后,您可以通过执行命令RESTORE撤消DESFire卡上的所有这些变化。

RESTORE是复位PICC主密钥到出厂默认密钥和从Teensy EEPROM中删除用户。

这是为了同一用户名能存储在多张卡里。

如果以后使用DEL命令将立即在卡中删除该用户。

如果你想删除这些卡中的一个,你要给每张卡取一个唯一名称,如“约翰·希尔顿1”,“约翰·希尔顿2”,等等。

列表

要显示所有被授权的用户,使用LIST命令。用户按字母顺序排序。


重启

复位命令是把PN532的RSTPDN线拉低为400ms来复位电路板。

之后,芯片重新初始化运行,并在芯片中能够被读出。

除了此以外,还能检测到通信错误的PN532自动复位。

MAKERANDOM

此命令是配置一张Desfire卡总是发送不同的随机ID和隐藏它是真实的UID。
请参阅以下有关不同操作模式的更多细节。


测试

执行自检,测试所有Desfire命令。 (见下文)

PN532通信协议

PN532采用了非常复杂的通信协议。在ZIP压缩包中的文件手册有描述。

  1.首先主机发送单个字节(DW =数据写入),告诉PN532现在的数据将被发送。
  2.然后主机发送一个命令帧包含要执行的指令。
  3.然后主机发送单个字节(SR =状态读取),请求PN532的状态。
  4.如果PN532尚未准备,就会回复一个0×00字节。这意味着主机必须等待,当PN532准备好,就会回复一个0x01字节。
  5.然后主机发送一个单字节(DR =数据的读取),告诉PN532需要一个数据包。
  6.然后PN532发送的ACK帧(确认),其是固定字节序列(00,00,FF 00,FF,00)。这是确认该命令已被正确接收。
  7.然后主机发送一个请求的PN532的状态单个字节(SR =状态读取)。
  8.当PN532准备好了,会用0x01字节来响应。
  9.然后主机发送一个单字节(DR =数据的读取),告诉PN532需要一个数据包。
10.最后PN532发送响应帧。

数据帧
命令帧和响应帧是这样的:

前驱和后继是可选的。
接收数据包必须先搜索开始标志结构{00,FF}。
然后是数据包长度和长度校验。
帧标识符(TFI)是0xD4如果帧从主机到PN532,0xD5为相反的方向发送。
之后而来的是,数据包的校验和。

Adafruit库

库中有1000行的代码是为了和PN532通信。

从Adafruit的网站,你可以下载一个Arduino代码和例子,演示与PN532的通信。

     但是这段代码只能用于测试,代码有bug不能在产品中使用。

我不得不完全重写Adafruit代码。这里是我做的修改:
  1.移除所有编译Adafruit的代码时出现的编译器警告。
  2.Bug修复:(严重错误)Adafruit的使用strncmp()比较二进制数据(包含零)。这是完全错误的,用memcmp()取代
  3.Bug修复:(严重错误)Adafruit的代码不检查有效的响应包。校验完全被忽略。接收的字节数不会被跳过启动代码之前!
  4.Bug修复:(严重错误)Adafruit的代码中使用超时= 0(永远等待)。这是完全错误的。如果芯片不响应,代码挂到永远!我的代码是“自我复位”,这意味着,即使拔出PN532板并重新连接后,芯片将被复位,之后再次工作。
  5.Bug修复:Adafruit的代码不允许区分为什么readPassiveTargetID()返回false。 (因为没有卡或由于通信问题)
  6.增加支持块值(在Mifare.cpp中)
  7.增加内存转储(在Mifare.cpp中)
  8. IRQ线不需要任何I2C模式。现在用软件握手代替。
  9.软件SPI添加慢速(以获得10kHz的时钟)
10.正确的唤醒程序(发送PN532_WAKEUP),而不是发送getFirmwareVersion。
11.Debug输出:校验字节都显示为0xFFFFFFFC而不是0xFC。每个字节前被移除无用“0X”。
12.详细调试输出取消。
13.增加显示有效数据代替调试输出数据包内字节。
14.用getFirmwareVersion()很笨拙 - >完全重写
15.writeGPIO()重写 - >没有对错误使用的警告了。
16.AuthenticateDataBlock(),ReadDataBlock()和WriteDataBlock()重写。
17.setPassiveActivationRetries()没有做任何错误检查。
18.writecommand()里 的Ugly代码完全重写
19.Crappy里这样的代码去掉(int offset = _usingSPI ? 5 : 6;)
20库完全避免了使用new操作。

我的新PN532库中,您在ZIP文件中可以找到,支持3通信模式:

1.软件SPI:
这一个被使用因为它允许进行降低SPI总线速度到10kHz,能在长电缆上传输数据。
软件SPI的好处是,你可以选择任何Teensy引脚进行SCK,MISO,MOSI和SSEL。

2.硬件SPI:
这个也能工作,但有一个缺点是,Teensy使用硬件SCK与主板上内置LED的引脚相同。
LED不能在此模式下使用(引脚13)。此外,该Teensy库不允许设置时钟为10kHz。

3.I2C:
这也能工作,但一个开放集总线不能在长电缆上传输。
我改变了I2C代码,这样就不再需要IRQ线了。
阅读Wikipedia有关SPI和I2C。

DesFire EV1库

除了重写PN532代码,我创建了一个新的DesFire库(约2700行代码)。

目前,互联网上还没有用Ardiuno/ Teensy控制Desfire卡的代码。

这是曾经是Arduino家族写的第一个库。

你只须改变Utils.h里的几行代码,你可以在Visual Studio,Linux或其他平台编译成库文件。

使用我的库是很容易的,还集成了自检,并给出了一个鲜明的例子:如何调用函数。

该库完全避免了new 操作。

该代码是专业的C++代码,可重复使用,非常良好的结构和注释。

该库将不可用旧DesFire卡(不建议使用),因为传统的认证没有落实。你需要EV1卡。

如果你搜索一张DESFire EV1卡的数据表,你只能找到NXP网站,这是完全无用的“短版”。

要获得完整的文档,你必须做出与恩智浦非披露协议(NDA),你得答应不把这个文档给别人。

这NDA只能是公司制作的。

令人难以置信的是恩智浦并未从过去自己的错误中学习。

难道MIFARE经典卡没有清楚地表明,“security-through-obscurity”不工作?

Windows比Linux安全?是因为微软没有开源代码。

恩智浦是否真的相信,隐藏信息仍能工作在这共享文件的年代,维基解密和爱德华斯诺登?

或者是恩智浦天真到相信,一个中国公司要生产出伪卡,是不可能够获得那份文档?

无论是NDA背后的想法:任何理智的人都会同意这是纯粹是无稽之谈。

但是,我从来没有与恩智浦合作,所以我没有完整的文档。

但这份文档已经没有必要了,因为我发现,在Github上托管的一些Desfire开源项目:easypay,libfreefare和liblogicalaccess。

通过研究他们的代码,修复他们的bug,通过实验和谷歌的帮助,我写了我自己的DESFire库:

函数                                                 描述
GetCardVersion()        获得关于DESFire卡相关的硬件和软件版本,EEPROM的大小,周和生产年份,批号等详细信息..
FormatCard()               擦除卡中的所有内容除了PICC主密钥
Authenticate()               用2K3DES,3K3DES键(ISO认证),或在PICC或应用程序级别的AES密钥认证两种
ChangeKey()                更改PICC主密钥或任何应用程序密钥
GetKeyVersion()        获取密钥版本(可选值保存在钥匙里)
GetKeySettings()        获取一个Key的设置(权限)
ChangeKeySettings()        改变一个Key的设置
GetApplicationIDs()           枚举卡上的所有应用程序
SelectApplication()          选择应用程序来发送命令
DeleteApplication()           删除应用程序所有文件和密钥
CreateApplication()           创建具有2K3DES,3K3DES或AES密钥的新的应用程序。您可以在一个卡上混合使用不同的密钥类型。
GetFileIDs()                   枚举应用程序中的所有文件
GetFileSettings()           获取有关文件的信息(文件类型,加密,权限,大小等。)
DeleteFile()                   删除文件
CreateStdDataFile()           创建一个标准的数据文件(文件大小可以在创建时定义,但以后不能改变)
ReadFileData()                   从文件中读取数据
WriteFileData()             写入数据到文件中
EnableRandomIDForever()        启用随机ID模式,其中卡每次发送一个ID(!这不能颠倒!)
GetRealCardID()            获得真正的卡UID。 (有用的随机ID模式)
Selftest()                            执行,测试的空卡上的所有上面的命令自检。
你会发现在ZIP文件发送和接收的所有字节整个自检的调试输出。

写这个库是一个真正的挑战,特别是在缺乏文档的情况下。

花了我几个星期来完成这个项目。

最困难的部分是用一个加密密钥和密钥变化的验证。

在认证过程中的随机值是加密的,还在存储卡和主机认证双方共享相同的主密钥之间进行变换。

这些随机值是会话密钥生成的。

在恩智浦区分加密/解密和发送模式/接收模式时候,所有的加密经过密码块链接的。

加密的初始化向量(IV)验证时会重置一次,然后会进一步把所有命令保持为最新。

如果你的IV矢量登录不同步,卡内部计算后,你会得到一个完整性错误的。

发送到存储卡中的所有数据和从卡收到的所有数据必然会经过CMAC计算(一些像hash的东西)。

某些函数会计算CMAC,有的则没有。

当改变一个加密,二个CRC32的值必须计算和旧的密钥和新的密钥进行异或,然后用会话密钥加密。

每种类型的密钥都自己的特点:当DES使用8字节的块,密钥本身长度可能是8,16或24字节时,AES则加密16字节的块。

随机值的长度和会话密钥随密钥类型而变化。

所有这些东西是非常复杂的,你会遇到成千上万的陷阱。

而最糟糕的是,在网上找到的几乎是没有用的信息。

我觉得像是Defire EV1发展的先驱。

我选择了最小的开源加密库,我能找到的:从埃里克年轻人AES128德州仪器和3DES。

虽然整个Desfire 源代码只有大约2700行,已编译的代码已经很小:

1.编译完为MIFARE经典卡,它会消耗闪速存储器的18%
2.编译完为Mifare DesFire卡消耗闪存的27%

因此,所有的加密的东西消耗只有9%的闪存。请注意,编译的时候会忽略所有没有使用的函数。

三种操作模式

根据不同的编译器开关和卡的类型,你可以有3种不同的操作模式:
1.编译用#define USE_DESFIRE false你会得到经典模式,
2.编译用#define USE_DESFIRE true 和默认的 Desfire 卡你会得到Desfire 默认模式,
3.编译用#define USE_DESFIRE true 和随机ID Desfire 卡你会得到Desfire随机模式

如果在系统中DESFIRE默认模式或DESFIRE随机模式下工作,它只依赖卡。

所以这些两种类型的卡可以在同一时间可以混合使用。

要转换一个默认的DesFire卡到随机的DesFire卡,你必须执行命令MAKERANDOM。

注意:如果一个卡曾经被转换为使用随机ID,NXP不允许再转换。 (为什么??)



在源代码中,你还可以额外选择使用DesFire卡主密钥:

1.编译时,用#define USE_AES true,你使用128位AES密钥(最大读写距离:4,0厘米)

2.编译时,用#define USE_AES false,你使用168位3K3DES密钥(最大读写距离:5,3厘米)

在源代码中找到它包含文件Secrets.h:
1.PICC主密钥(AES或3K3DES)
2.密钥(3K3DES)查以得出的卡ID、用户名和随机数据的应用程序主密钥(DESFire非默认模式),
3.密钥(3K3DES)得出的卡ID、用户名和随机数据存储的密钥值(DESFIRE默认模式)。

第一次编译源代码的时候,您应该更改这3个密钥的。

注意:如果你已经个性化卡,然后更改源代码的PICC主密钥,你不能再认证这些卡。

因此,您首先在所有个性化卡片执行RESTORE命令后,更改代码的PICC主密钥是非常重要的。

RESTORE命令重置PICC主密钥到出厂默认,DES密钥会全部清零。

调试级别1

如果有任何通信出了问题,你可以使用我已经实现了的调试。

通过终端输入命令“debug 1”来激活基本调试。

这里你可以看到在1级的调试输出的一部分时,默认的DESFire卡个性化:

注意:您发现在ZIP文件的完整自检的调试输出。

调试级别2

输入“debug 2”,额外的数据包将被显示:

现在你看到发送到PN532的命令,并从PN532收到的答复。

字符“<”和“>”标记之间的数据字节是有效的数据包。

命令ReadPassiveTargetID接通RF场,并检查是否存在一张卡。

如果没有卡,只有3个数据字节返回(D5 4B 00)。

命令SwitchOffRfField关闭RF场以节省电量。

如果已经检测到卡的响应如下所示:


你看,现在更多的字节被传送。

它们包含卡的唯一ID和卡的附加信息。

在本例中的代码已经为MIFARE经典卡编译。

该ID是4字节长。

当卡被授权,门打开,绿灯闪烁1秒钟。

如果卡没有被授权,红色LED闪烁1秒钟,门不会打开。

如果代码编译为Mifare DESFire卡,门被打开之前会执行额外的加密操作。

调试级别3

输入“debug 3”来激活详细的调试:

现在你看到的是Teensy和PN532,包括AC包和状态字节之间传输的每一个字节。

错误

每当Teensy检测到PN532没有反应,错误会打印到终端。

这个例子显示,PN532根本没有响应的情况。

Teensy拉RSTPDN线低到复位芯片,发送WakeUp数据包(参见手册),并再次尝试与芯片进行通信。

另外让你马上看到红色LED会闪烁速度很慢,有严重的错误。

如果你使用DesFire卡,你可能会看到超时错误时。

这种情况只有当卡离PN532的天线太远。

这超时意味着PN532没有收到该卡的答复。

在这种情况下发送到卡上的任何一条命令将返回一个超时错误。该卡的任何通信停滞。唯一的方法是调用SwitchOffRfField()和ReadPassiveTargetID()重新连接。执行(GetKeyVersion()和SelectApplication())的命令,当涉及到身份验证通信会出现故障。其原因是,加密增加了卡的功率消耗。奇怪的是AES比DES使用更多的权限。当您使用AES的卡必须距离PN532 4,0厘米范围内。当使用DES的距离可达5,3厘米。

请注意,基本上有两种类型的超时:(首先Teensy等待来自PN532和第二的PN532等待来自该卡的响应)如果直接将卡放在读写器的天线上,你不应该得到一个超时错误。

开启调试,看看发生什么。

另一个Teensy项目

如果你有兴趣,看看我的第一个很小的项目,我在Codeproject上发表。它使用一个小小的模拟鼠标、键盘和触摸屏通过USB接口。

许可

本文中,连同源代码和相关文件,遵守代码项目开放许可(CPOL)

-----------------------------------------全文完---------------------------------------------------

谢谢观看

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
打赏
分享
最新回复 (7)
雪    币: 35386
活跃值: (19270)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2016-8-28 09:34
2
0
文章不错,语句方面建议优化一下。
雪    币: 133
活跃值: (233)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不追浮云的人 2016-8-28 10:21
3
0
经典卡看来已经成防君子的门了
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
mozha 2 2016-8-28 11:42
4
0
我也认为翻译成“经典卡”不好,还是Classic Cards好理解些
雪    币: 6782
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2016-8-28 11:53
5
0
这篇文章讲得非常不错,辛苦楼主,期待后续译文
雪    币: 18
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wltext 2016-8-29 15:51
6
0
也有缺点,入侵者可以不用接触受害者,读取到卡片内容。写入新卡进行伪造
雪    币: 288
活跃值: (212)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
mozha 2 2016-8-29 20:08
7
0
好的,英语不太好,这两天我再改改
雪    币: 492
活跃值: (318)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
Tee8088 2 2016-9-14 16:52
8
0
好文,看完,这防复制的MF卡难买。提醒不要买到中国的卡倒是有趣,呵呵。
游客
登录 | 注册 方可回帖
返回