65.9K
CodeProject 正在变化。 阅读更多。
Home

DIY 电子 RFID 门锁带电池备份

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (161投票s)

2016年4月29日

CPOL

52分钟阅读

viewsIcon

1299562

downloadIcon

8921

一款用RFID卡或RFID令牌取代机械钥匙的电子门锁。

新内容:这是有史以来为Arduino/Teensy编写的第一个Desfire项目!
只需稍作修改,您也可以在Windows、Linux或其他平台上编译代码。

关于窃贼

Burglar

最近,《明镜周刊》发表了一篇关于德国窃贼的文章

  • 窃贼偏爱天黑的月份。12月份保险公司报告的入室盗窃案数量是7月份的3倍。
     
  • 警方报告称,很难找到罪犯。大多数情况下没有目击者,也没有痕迹。只有2.6%的入室盗窃案罪犯能被定罪。
     
  • 窃贼并非只闯入富人的住宅。任何人都可能成为受害者。在几乎每栋房子里,他们都能找到手机、笔记本电脑或现金。特别是吸毒者会选择他们附近环境的房屋。
     
  • 根据警方的经验,最好的预防措施是门窗的机械保护和警惕的邻居。大多数情况下,窃贼只尝试2-3分钟闯入房屋。但在60%的情况下,他们会成功。
     
  • 这篇文章提到,德国警方观察到越来越多的入室盗窃案是由来自塞尔维亚、罗马尼亚、土耳其、阿尔巴尼亚和格鲁吉亚的专业团伙组织的。这些人申请庇护,并穿越欧洲不同国家只为做一件事:偷窃。
     
  • 还有另一篇文章,其中有一张德国地图,显示了大部分入室盗窃案发生的城市。警方在2015年统计了152,000起案件——呈上升趋势。

大多数门锁都非常不安全

你的门锁能保护你免受窃贼侵害吗?
如果你的钥匙长这样

那它肯定不能。
你的门可以在几秒钟内被打开,而你甚至不会注意到有人在你不在家时进来过,因为门和锁上都没有损坏。你的邻居也听不到任何声音,因为撬锁是完全无声的。

你不相信吗?
那就看看这个视频

Lockpicking

正如你所见:撬锁非常容易。
小偷甚至不需要特殊工具。他可以用两个发夹打开你的锁!
当你在Youtube上搜索“lockpicking”时,你会找到169,000个结果。

使用电动振动器(开锁枪),打开一个锁只需不到10秒,如这个视频所示。

即使是十字锁,也有专门的开锁工具,可以在10秒内打开,如这个视频所示。

更好的机械锁

有更好的锁,钥匙上有圆孔而不是锯齿,就像这把KESO 2000钥匙。

这些锁非常昂贵。然而,它们也可以被撬开,尽管可能需要3分钟才能打开,如这个视频所示。

最后,锁可以用大钳子弄坏,或者用钻头打开,如这个视频所示。

结论:你找不到一把真正安全的机械锁。

复制钥匙

如果你出租公寓,你的租客可以复制钥匙并将其交给其他人。这样他就可以转租你的公寓。如果他某天搬走,你想重新出租公寓时,你必须更换锁,否则前租客仍然可以进入公寓。

电子门锁

电子门锁的优点是上述安全问题都不适用。
拥有一个安全的门锁,防止小偷进入,比拥有一个在小偷已经进来时才发出噪音的报警系统要好得多。等到警察赶到,他早就走了,可能一些贵重物品也丢失了。安全的锁总是比报警系统或摄像头更好。

市场上有哪些选择?
我寻找了一个电子替代方案,但我找到的都不令我满意。

  • 有指纹识别器,但我没有找到防水的,所以不适合户外安装。此外,你将一个电子设备暴露在街上,恶意的人可能会轻易破坏它。
  • 有你在酒店可能见过的那些用卡开门的电子门锁。
    但这些只适用于室内安装,并且它们依赖于锁内的小电池,很快就会耗尽。
  • 我找到的所有电子解决方案在停电时都无法工作,因为它们都缺少一个强大的备用电池。一个在停电时打不开的锁是无用的。
  • 大多数电子解决方案都太贵了。

我的项目

所以我设计了自己的解决方案,具有以下特点

  1. 专为建筑物主门设计:没有任何电子设备暴露在街道或雨中。你只需将RFID读卡器安装在门的内侧,它可以通过关着的门读取RFID卡。
  2. 从门外看不到任何可能被入侵者操纵的东西。
  3. 一个强大的备用电池确保设备即使在停电超过一周的情况下也能工作。
  4. 处理器检查电池电压,如果超出范围就会发出警报。
  5. 处理器检查电池是否老化,并在需要更换电池时发出警报。
  6. 提供一个非常易于使用的界面,通过USB线和一个终端程序访问,让你可以在几秒钟内添加或删除用户。即使是电脑初学者也能快速管理用户授权。
  7. 你可以在微处理器的EEPROM中存储64个用户及其卡片。通过修改源代码可以支持超过64个用户。
  8. 对终端界面的访问可以用密码保护。
  9. 如果你或你的租客丢失了RFID卡,你可以轻松地从EEPROM中删除该卡,而无需更换机械门锁。
  10. 我为电路板设计了一个布局,电子初学者也可以焊接。
  11. 与商业解决方案相比,整个解决方案便宜
  12. 假设你有一个安全的门,不能用撬棍打开,这个解决方案比你终生支付的任何保险都便宜得多。我再也不买任何保险了。
  13. 整个项目由一位经验非常丰富的硬件和软件工程师设计和测试。

RFID卡和令牌

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

Mifare RFID cards

卡片对弯曲很敏感,所以你不应该把它们放在口袋里,因为它们可能会折断。
令牌的其他名称是“标签”和“钥匙扣”。

每个RFID卡或令牌都有一个唯一的ID号,由工厂分配,之后无法修改。有些卡(如Mifare Classic)有4字节ID,允许2^32个可能的ID,而其他卡(如MIFARE Desfire)使用7字节ID,允许2^56个可能的ID:远比任何机械钥匙都多。

我的项目支持任何符合智能卡标准ISO 14443 A和B,或ISO 18092的13.56 MHz卡。更多详情请见维基百科

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

  1. 用于Mifare Classic卡:在此模式下,仅使用卡的ID来识别用户并开门。(不推荐)
  2. 用于Mifare Desfire卡:在此模式下,一个128位或168位的加密密钥保护你的门禁。

但即使在Mifare Classic模式下,暴力破解也是不可能的,因为攻击者不知道你的卡ID,这意味着他必须尝试2^32甚至2^56个可能的卡ID。这是不可能的,因为Teensy中运行的代码会在一次无效的开门尝试后延迟1秒。攻击者活不了那么久来测试所有可能性,因为这将需要140年。

Mifare Classic卡

在Mifare Classic卡上存储一个秘密值并用密钥保护是可能的。但这没有意义,因为Mifare Classic的加密已经被破解。当飞利浦设计Classic卡时,他们犯了一个错误,实现了一个弱加密算法(Crypto-1)并相信“通过模糊实现安全”。这些卡如此广泛传播(售出超过40亿张)的原因是该算法被保密了14年。但在2008年,一个研究团队在显微镜下分析了芯片,并推导出了硬件中实现的算法。他们发现密钥是一个48位的密钥,并存在多个设计缺陷。你可以在ZIP文件中的Reverse Engineering Mifare Classic cards.pdf中找到更多细节。结果是,今天Mifare Classic卡可以在几秒钟内被克隆,包括存储在EEPROM中的所有数据,即使数据受密钥保护。

通常,RFID卡的唯一ID是在工厂分配的,之后无法修改。但在eBay上你可以买到中国克隆品,允许向卡中写入任何ID。(搜索“UID changeable card”)

因此,理论上恶意的人可能会通过你的口袋读取你的Mifare Classic卡并克隆它以进入你的房子。这可以通过与RFID卡通信的Android NFC应用程序完成。还有像Tastic RFID Thief这样的设备,可以从半米远的距离读取RFID卡。所以如果你决定使用Mifare Classic卡,你应该买一个不锈钢钱包,它有一个金属屏蔽层,可以阻止任何外部射频频率到达你的卡,从而使克隆你的卡变得不可能。

Stainless Steel Wallet

旧的Mifare Desfire卡

2002年,飞利浦推出了Desfire卡,它不再依赖于专有算法。Desfire使用(如其名所示)DES加密。然而,对于第一代Desfire卡,已经发布了一种攻击方法,可以通过侧信道攻击从EEPROM中获取加密数据。通过复杂的硬件,在加密过程中测量卡的功耗。但这种攻击比Mifare Classic攻击要困难得多,大约需要7个小时。

你可以在Youtube上找到一个视频,德国波鸿鲁尔大学的Timo Kaspar(用英语)解释了他们如何破解旧的Desfire卡。在18分20秒时,他开始谈论Desfire攻击以及他们如何从卡中提取了所有的加密密钥,但视频的其余部分也很有趣。

你不应该再使用旧的Desfire卡了。我的项目不支持它们,因为它们需要旧版认证,而这并未实现。

Mifare Desfire EV1卡

2009年,下一代产品上市了:Mifare Desfire EV1卡,它再次得到了改进,至今没有已知的攻击方法。所以如果你使用Desfire EV1卡,你就不需要不锈钢钱包了。

购买Desfire EV1卡比较困难。报价不多,而且便宜的那些要求你购买50、100甚至500张的数量。我找到了这两家也销售少量卡的公司:RyscCorpSmartcard Focus。你也可以从Smartcard America订购,他们通过eBay销售,但他们到其他国家的运费非常昂贵。

小心eBay上来自中国的假冒产品:无法保证中国的克隆品能满足与原始NXP卡相同的安全标准。

Mifare Desfire EV2卡

EV2卡是EV1卡的改进版。它们具有扩展功能和更低的功耗。我没有亲自测试过EV2卡。但有用户报告说他们使用来自KarteoZutrittsShop的EV2卡,并且使用来自ElchouseParadisetronic的读卡器,甚至可以读取长达8厘米的距离,该读卡器的天线比Adafruit读卡器小。Elchouse的V4版本改进了PCB设计,以获得更远的读取距离。
注意:Elchouse读卡器附带的卡不是Desfire卡。

钥匙扣

我在亚马逊上从Yarongtech订购了MIFARE Desfire EV3钥匙扣,因为它们相对便宜(10个钥匙扣30美元)。但它们没用。距离超过2厘米就无法读取。唯一好用的钥匙扣是Desfile Classic,但这些不安全。

Mifare Classic 与 Desfire 对比

  Mifare Classic Mifare Desfire EV1
唯一标识符 4 字节
UID总是可以无需加密读取
7字节
在普通模式下,UID总是可以无需加密读取,但在随机ID模式下需要PICC主密钥。
EEPROM存储 在1kB内存的卡上
16个扇区,每个扇区4个块,每个块16字节
(块和扇区大小固定)
最多28个应用程序,每个应用程序最多可包含32个可变大小的文件
密钥 每个扇区可以用两个密钥(密钥A和密钥B)保护,每个密钥有不同的权限 每个应用程序最多可以用14个不同的密钥保护,每个密钥有不同的权限
加密 专有算法(Crypto-1, 48位) DES(56位)、2K3DES(112位)、3K3DES(168位)、AES(128位)
安全 加密已于2008年被破解 至今无已知攻击

Classic卡是完全静态的,而Desfire卡将数据存储在“应用程序”中包含的动态大小的“文件”中。什么是应用程序?应用程序只不过是文件的容器。

想象一下发给大学学生的RFID卡。
用同一张卡,学生可以在食堂吃饭,也可以停车。
在这个例子中,卡上会有两个独立的应用程序:一个食堂应用程序和一个停车应用程序。
学生可以为午餐和停车充值,这些钱存储在相应应用程序的文件中。
每个应用程序有一个或多个加密密钥(应用程序密钥),允许更改存储在相应应用程序中的值。
每个密钥可能只有读权限、只有写权限或两者都有。

此外,卡还有一个重要的密钥:PICC主密钥,也就是“上帝密钥”。
PICC主密钥允许创建和删除应用程序,为每个应用程序分配密钥,甚至格式化整张卡。但有趣的是,PICC主密钥不能访问存储在应用程序中的数据。

食堂和停车场都不知道PICC主密钥。
它们只能访问其相应的应用程序,而不能访问其外部。

RFID读卡器

来自AdafruitPN532 breakout板(40美元)有一个来自NXP(前飞利浦)的芯片。
当你订购这块板时,它已经附带了一张白色的MIFARE卡。
这块板的尺寸是12厘米 x 5厘米,厚度是3毫米。
它内部工作电压为3.3V,但可以用5V供电。

这块板不仅可以读取Mifare卡。它还可以读取你的生物识别护照、FeliCa卡并进行NFC(近场通信)。它还与集成了RFID的万事达卡和维萨卡(PayPass, PayWave, ExpressPay)、Calypso等等进行通信。

这块板相对于其他硬件的主要优势是天线(印刷在板上)非常大(RFID卡的大小)。这使得读取距离比其他天线较小的硬件更远。
Adafruit说天线可以从最远10厘米的距离检测到卡片。
对于随板附送的白色Mifare Classic卡来说,这是真的。
但我有另一张卡(来自公共交通),需要7.5厘米才能被检测到。
我还有一个令牌,需要5.5厘米才能被检测到。(令牌中的天线比卡的天线小)

对于Desfire EV1卡,最大距离取决于加密方式,因为加密会增加卡的功耗。

  • 如果以Classic模式编译(不使用加密),距离可达6.3厘米。
  • 如果以Desfire模式编译并使用DES加密,距离可达5.3厘米。
  • 如果以Desfire模式编译并使用AES加密,距离可达4.0厘米。

更新:请阅读关于EV2卡的内容。

此外,我测量到卡的内存越大,功耗也越大。
4kB的卡可以比8kB的卡从更远的距离读取。差异大约是5毫米。
由于我的项目只占用卡EEPROM的几个字节,你应该购买你能找到的最小的卡。

你把breakout板安装在门的内侧。
你可以在它上面安装一个塑料或木制的盒子来保护它免受机械损伤。
在那个盒子里,你还要安装一个双色LED(红/绿),它总是显示系统是否正常工作。

一根长扁平电缆将它与主板连接起来。
这里你看到一张breakout板的照片,上面连接着扁平电缆和双色LED。

PN532 board

首先,你必须在板上焊接两个跳线来定义通信模式。
I2C在较长的电缆上太弱了,因为I2C是一个带有上拉电阻的开漏总线。
我使用SPI通信,速度很低,为10 kHz。
所以你必须设置跳线:SEL0 = OFFSEL1 = ON
阅读维基百科关于SPII2C的内容。

我故意不在这里使用任何插头,因为在可能会被猛烈关上的门上,焊接连接要安全得多。

注意
如果你认为可以通过购买像右边那样来自中国的便宜得多的PN532板来省钱,那你就错了。这些板在很多地方都有售,但不能与Desfire卡一起工作。

这些板的天线太小了(4厘米 x 4厘米),无法向卡发送足够的高频能量。结果是,在认证时你会看到超时错误


如果你使用EV1卡,你必须从Adafruit订购PN532板,否则你会浪费时间和金钱。只有在使用EV2卡时,你才可以尝试使用小型的中国板,但我没有这方面的经验。

请阅读关于EV2卡的内容。

使用I2C总线

PN532也可以通过I2C总线而不是SPI来控制。
一位用户报告说,在使用I2C认证时,他会遇到超时错误
他说原因是Arduino库定义了一个只有32字节的缓冲区,这太小了。
我无法证实这是否正确,但我在这里公布他的信息。
在你的Arduino安装文件夹中搜索文件Wire.hTwi.h。可能有多处。

In Wire.h change
#define BUFFER_LENGTH 32
into
#define BUFFER_LENGTH 64

In Twi.h change
#define TWI_BUFFER_LENGTH 32
into
#define TWI_BUFFER_LENGTH 64

电路板之间的电缆连接

在breakout板(安装在门内侧)和主板(你放在门附近安全的地方)之间需要一根较长的电缆。我使用一根10芯的扁平电缆
如果你不想使用扁平电缆,你也可以使用网线。但网线只有8芯。在这种情况下,你可以把LED安装在另一个地方(不在门上),这样你只需要8根线。

SPI总线通常以几兆赫兹的速度运行。这无法通过长电缆传输。所以我以10kHz的速度使用SPI。即使通过3米长的电缆,信号在示波器上看起来也绝对干净。我猜想即使10米也能正常工作。

当使用Defire卡时,你甚至可以在电缆上附加一个SPI嗅探器,但你永远不会看到加密密钥在电缆上传输。在认证期间,只传输加密的随机值,而在密钥更改期间,新密钥会用从不离开Teensy的秘密会话密钥加密后发送。

Teensy 3.2

主板的核心是微处理器。我使用来自PJRC.com的Teensy 3.2。
与其它类似Arduino的板子相比,Teensy有几个优点

  1. 它非常快(32位ARM处理器,运行频率96MHz)
  2. 它非常小(3.5厘米 x 1.5厘米)
  3. 它比其他板子有更多的RAM(64 kB)和闪存程序存储(260 kB),并且它有一个EEPROM。
    较新的Arduino板(Due, Zero, 101)根本没有EEPROM,这使它们变得无用。
  4. 它很便宜(20美元)
  5. 功耗低。
  6. 它内部工作电压为3.3V,但可以用5V供电。
  7. Teensy库(TeensyDuino)比官方Arduino库有更多更好的功能。

首先,你必须用美工刀破坏Teensy底面的一个小跳线。
否则,来自USB电缆的5V电压将直接与主板的5V电源连接。
如果主板开着而电脑关着,或者反之,这会导致电流流动。

Teensy 3.2

注意:
如果你认为可以通过购买更便宜的Arduino板来省钱,那你就错了。这些板没有足够的内存。

当你为Teensy编译sketch时,你会从编译器得到这个输出

 

这意味着sketch仅全局变量就需要11%的64kByte = 7.6kB的RAM。此外,还需要更多的RAM用于存储局部变量的堆栈。这部分额外的RAM是动态的,无法预先计算。Arduino Uno只有可笑的2kB RAM。这个sketch甚至无法在有8kB RAM的Arduino Mega上运行。你必须购买一个有64kB RAM的Teensy 3.2,否则你会浪费你的钱和时间。当你在RAM不足的板子上运行代码时,后果可能是错误、终端中出现残缺信息,甚至崩溃。当板子不再响应时,你会注意到崩溃。LED停止闪烁。

电池

为了确保即使在停电期间门也能打开,我使用一个12V的铅酸固定式电池(深循环电池)。电池提供开门所需的大电流(1..2安培)。

如果发生停电,电池可以维持系统工作超过一周。

电子设备将电池电压永久保持在13.6V。在这个电压(所谓的“浮充”)下,电池寿命最长。如果电池以较长的间隔充电和放电,寿命会缩短。
过高的电压(> 14.4V)会导致正极板栅腐蚀。
过低的电压会导致负极板硫化。

在13.6V时,电池具有非常高的阻抗。当你拔掉电源时,你会看到电压迅速(在2分钟内)从13.6V降至12.8V,然后非常非常缓慢地降至12.0V(在几天内)。这是正常的。

Lead Acid Battery charge curve

这张图显示了铅酸电池的充电状态,可以直接从电压推断出来。
你可以看到在12.8V时,电池是100%满的。

有不同类型的铅酸电池

  • 启动电池,带有薄极板,如踏板车中所用。
  • 深循环电池,带有厚极板,如轮椅、UPS、报警系统或用于存储太阳能电池板能量。

有不同技术的铅酸电池

如果你想了解更多关于电池的知识,请访问batteryuniversity.com

我使用一个15Ah的固定式深循环AGM电池(30美元)。12Ah也足够了。尺寸是94 x 151 x 98毫米。这种电池是MF(免维护)的,这意味着永远不需要像过去那样往里面加蒸馏水。当你买到它时,它已经是充电并密封好的。

由于电池内容物不是液体,所以可以任何位置安装电池。你可以把电池平放,然后把主板安装在上面以节省空间。

铅酸电池不喜欢高温,你应该只在充电状态下存放它们,否则它们的寿命会缩短。

对电池要非常小心!如果你造成短路,流过的电流将超过100安培!两极之间的任何东西都会化为一缕青烟!

重要提示:铅是有毒的。旧电池必须回收

主板

RFID Door Access System
 

RFID Door access system

继电器切换时,门会打开。继电器会激活100毫秒(时间间隔可以在源代码中配置)。
第二个继电器是可选的,为了简化图表而没有显示。但你可以在电路板布局中找到它(见下文)。

变压器的功率刚好能给电池充电。电池充电电流不应高于其容量的10%,否则会缩短寿命。对于一个12Ah的电池,这意味着最大充电电流为1.2A,这比7815的最大电流还要大,所以永远不会达到。一个16V的变压器提供16V * √2 = 22.5V的峰值电压。当电池电量很低时,这个电压可能会下降。

7815是一个具有以下特性的电压调节器

最小输入电压 17.5V
最大输入电压 35V
输出电压 15V
最大电流 1A
电压降(在1A时) 2V
短路保护
过热保护

当电池充满时,7815只为Teensy和PN532提供电流(平均46 mA)。只有在长时间停电后,才会有更多电流流入电池。所以通常7815不会变热,不需要散热器。如果你所在的国家经常长时间停电,建议使用散热器。在上面的照片中,你看到一个散热器(铝板),它同时用于7805和7815。

当处理器检测到电压有问题(< 13.0V 或 > 14.0V)时,红色LED会闪烁以表示存在问题。原因可能是停电或故障。

当处理器检测到开门时电池电压下降超过1伏特,这意味着电池老化,需要尽快更换。新电池可以在没有电压下降的情况下提供数安培的电流。但电池越老,其内阻就越高。当需要更换电池时,红色和绿色LED会交替闪烁。

标有黄色感叹号的电阻器起着保险丝的作用。在发生短路(例如在7805中)的情况下,它会烧毁,避免超过100A的电流流过电路。这个电阻器应该是1/4W。

零件清单

  • 1 x Adafruit PN532(附带一张Mifare Classic卡)
  • 1 x Teensy 3.2
  • 1 x 固定式电池 12V, 12Ah 或 15Ah(参见关于电池的章节)
  • 1 x 万能板 13.5 厘米 x 11 厘米
  • 1 x 7805
  • 1 x 7815    (如果你的国家有长时间停电,可选配散热器)
  • 1 x BC546
  • 1 x 1N4148
  • 2 x BY255
  • 1 x 继电器:线圈 12V,开关 220V, 16A
  • 1 x 三脚双色LED(红/绿)
  • 1 x 整流桥,至少80V, 1A,或者为了超长寿命,400V, 3A更好
  • 1 x 变压器 16V(或15V)和0.25A(最高0.5A)
  • 1 x 保险丝 30 mA
  • 1 x 保险丝座
  • 1 x 0.22 Ω, 1/4W    (不多不少
  • 2 x 820 Ω, 1/4W
  • 1 x 10 kΩ, 1/4W
  • 1 x 220 kΩ, 1%, 1/4W
  • 1 x 15 kΩ, 1%, 1/4W
  • 1 x Rx(见下一章)
  • 1 x 100 nF, 63V    (不要更大!
  • 1 x 330 nF, 63V
  • 2 x 1 µF, 50V       (电解电容比钽电容寿命更长)
  • 1 x 10 µF, 35V     (电解电容比钽电容寿命更长)
  • 1 x 1000 µF, 50V
  • 1 x 10针排针,公头,带镀金触点
  • 1 x 10针带护套盒式排母,母头,带镀金触点
  • 1 x 10芯长扁平电缆
  • 1 x 用于开门器的长双芯电缆(用于2A电流)
  • 1 x 带电源插头的电源线
  • 1 x 粗铜线,直径1毫米,红色(用于电池)
  • 1 x 粗铜线,直径1毫米,黑色(用于电池)
  • 1 x USB micro 数据线
  • 1 x 热缩管,直径3毫米,长度20厘米(用于LED)
  • 2 x M3螺丝 + 螺母 + 垫圈(用于变压器)
  • 额外的Mifare卡或令牌

如果你想独立打开2扇门,你还需要

  • 1 x 继电器:线圈 12V,开关 220V, 16A
  • 1 x 1N4148
  • 1 x BC546
  • 1 x 10k Ω
  • 1 x 330 nF, 63V

如果你想从内部不用卡开门,你还需要

  • 1 x 1 µF, 50V
  • 1 x 1kΩ, 1/4W
  • 1 x 按钮

如果你当地没有电子商店,你可以从DigiKeyFarnellTMENewark订购清单上的所有东西,它们都是非常好的在线邮购销售商,提供数十万种电子元件。

电路板布局

在ZIP文件中,你可以找到我为手动焊接设计的单层万能板。这块板即使对电子初学者来说也很容易焊接。我只花了半天时间就把所有东西连接好了。

在板上你看到两个继电器。上面的继电器是可选的。它允许独立打开两扇门。如果你不需要,可以省略绿色的部分。

如何计算Rx

电阻Rx限制了通过开门器电磁线圈的电流,如下图所示。
这里你看到锁打开的样子(底板已移除)。
我把这个锁安装在门的内侧顶部。我移除了原来的钥匙锁,所以从外面没有任何东西可以被操纵。

Scanavini doorlock

首先,你将电磁线圈连接到一个可调直流电源。从零开始缓慢升高电压,直到锁打开。
在我的例子中,这发生在2.8V。
但这太不安全了。必须施加更高的电压以确保它总能打开。
我选择施加3.5V。
然后我测量在3.5V时流过的电流,是1.3A。

因为我需要同时打开两扇门,我把两个电磁线圈串联起来。
所以我需要7V的电压,电流为1.3A。

在Rx上会有12V - 7V = 5V的电压,这导致电阻为

R = U/I = 5V/1,3A = 3,8 Ohm

现在计算电阻的功率

P = U*I = 5V*1,3A = 6,5W

如果你当地的电子商店没有这个阻值的电阻,你可以并联多个电阻。
例如,4个15Ω的电阻,每个功率应为2瓦。
这将得到一个总电阻为3.75Ω,功率为8瓦。

要计算两个并联电阻,你可以使用公式

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

LED的含义

双色LED应安装在门的内侧或任何可见的地方。
它会持续显示一切是否正常工作。

绿色LED持续快速闪烁 一切正常
绿色LED闪烁一次,持续1秒 正在为授权人员开门
红色LED持续快速闪烁 电池电压超出范围。原因可能是停电或故障。
红色LED闪烁一次,持续1秒 未经授权的人试图用无效的卡或令牌开门。
红色LED持续非常缓慢地闪烁 显示与PN532板的通信问题。这是一个严重错误。
绿色LED红色 LED交替闪烁 电池老化,需要尽快更换。
LED一直不亮 这表示有故障。

优化功耗

已尽一切努力降低功耗

最高的功耗来自PN532板:由于芯片卡和令牌没有电池,它们必须由外部供电。
PN532必须产生一个13 MHz的射频场,通过天线为芯片卡供电。在产生该场时,PN532消耗110mA。有一个命令可以关闭射频场。但没有射频场就无法检测到卡。所以我的代码所做的是打开射频场100毫秒来检查是否有卡,然后关闭射频场1秒。当射频场关闭时,PN532只消耗18mA。结果是平均功耗为26mA。

Teensy在96MHz的CPU时钟下功耗为40mA。由于不需要这么高的速度,时钟被设置为24MHz,这将功耗降低到20mA。

最后,总电流平均为46mA。

继电器通电的时间间隔已优化。大电流流过电磁线圈。你必须测试哪个时间间隔适合你的电磁线圈。你可以在源代码中修改。在我的例子中,电磁线圈在20毫秒的间隔下已经可以工作。但为了万无一失,我编程为100毫秒。

预期寿命

今天我们习惯了电子设备寿命短,尤其是那些来自中国的。
但并非一直如此。

曾几何时,有“德国制造”的美誉,它总是意味着高质量和长寿命。我有一台根德(Grundig)功放,是90年代初买的。它今天还在工作。近30年来我只修理过一次!

但早在80年代,第一批日本产品就进入了市场,它们只是更便宜但质量更差。在那些年里,客户选择了为更便宜的日本产品支付更少的钱,而不是为高质量的德国品牌买单。这些年全球质量大幅下降。今天中国正在延续这些趋势。

甚至有人怀疑公司故意制造寿命短的设备(“计划性报废”)。但至今未能证实。事实是,工业界正处于一场激烈的价格战中。公司必须廉价设计他们的产品,否则客户不会购买。罪魁祸首是客户,因为他不愿意为更高的质量支付更多的钱。你还记得廉价的日本VHS和好得多的德国Video 2000之间的战争吗?更差的系统赢得了战争,因为客户不想支付质量所应有的价格!

公司如何降低价格?首先是使用最便宜的电子元件。结果是元件常常设计不足。例如,如果一个晶体管设计的最大电压为1500伏,而它长期在1200伏的电压下运行,很明显这个晶体管的寿命会很短(约5年),因为它长期在极限状态下运行。另一方面,一个为100伏设计的晶体管,但在5伏下运行,其寿命会显著更长(> 30年)。同样适用于电流

此外,功率晶体管或IC的散热器通常设计得太小(甚至没有),以节省金钱和空间。

另一个常见的故障原因是插头和开关。随着时间的推移,它们的触点会氧化,连接可能会完全丢失。好的插头有镀金触点,但由于黄金昂贵,公司通常不使用它们。

但也存在另一个极端。想想那些绝不能出故障的高质量电子产品
例如在医疗、卫星或军用飞机中。
在这里,工程师肯定不会选择最便宜的零件(那些在极限状态下运行的)来使电子设备尽可能安全可靠。他们甚至可能添加一些电子元件,在其他元件故障时接管控制。例如,并联5个电容器,而一个就足够了。

我修理电子设备多年,对哪些电子元件最先失效有丰富经验。这些通常是工作在高电压、大电流下并发热的半导体。工作在大电流下的电解电容也经常失效(这是开关电源损坏的最常见原因)。

我为这个开门器设计了长寿命。在正常操作下没有会发热的部件。开门器电磁线圈的大电流由继电器而不是晶体管切换,因为继电器更坚固。

我建议使用一个能承受3安培的整流桥,尽管在电池充满时只有几毫安的电流流过。

不要用直流电源(如笔记本电脑用的那种)替换变压器和整流桥。中国的开关电源内部有廉价的电子元件,暴露在220V电压下,很快就会损坏。另一方面,常规变压器有永恒的寿命。在几十年的修理各种电子产品的经历中,我从未更换过一个坏掉的电源变压器。开关电源的唯一优点是它们更小、更轻,但除此之外,它们是寿命短的最差解决方案。

你应该尽可能避免使用插头。在我的照片中,你看到Teensy是直接焊接在板上的,就是为了避免未来的接触问题。扁平电缆的插头应该有镀金触点。我也把电缆直接焊接到电池上以避免插头。为了更容易断开电池,我加了2个螺丝接头。其他型号的电池已经带有螺丝夹。

唯一几年后必须更换的部件是电池。当你看到LED以绿红交替闪烁时,电池就快不行了。

最后,我推测电子设备的预期寿命应该是20-30年甚至更长。

将固件加载到Teensy中

  1. 选项A:
    你可以从arduino.cc安装Arduino编译器,并从PJRC.com安装Teensyduino库,然后编译你在上面的ZIP文件中找到的sketch。你必须像这样配置编译器设置


     
  2. 选项B:
    或者你什么都不安装,直接将预编译的固件加载到Teensy 3.1或3.2板上。你可以在ZIP文件中找到HEX文件和TeensyLoader.exe。

与Teensy通信

你需要一根Micro USB数据线来连接你的电脑和Teensy。
首先你必须安装Teensy串行驱动程序,它使Teensy在你的电脑上显示为一个虚拟COM端口。
你可以在ZIP文件中找到驱动程序。

你可以用一个终端程序与Teensy通信。
你可以使用免费软件TeraTerm或Arduino编译器内置的串口监视器。

你不必关心波特率,因为Teensy会忽略它(不像旧的Arduino板)。数据总是以USB速度传输。

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

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

TeraTerm

重要提示:如果Teensy没有电源(如果你断开电池)或者当COM端口在终端程序中打开时你按下了Teensy上的“Program”按钮,你首先必须关闭COM端口,断开USB电缆,重新连接它,然后再重新打开COM端口!
为避免这种情况,你应该在从Teensy移除电源或按下“Program”按钮之前,先关闭COM端口(在TeraTerm中选择“Disconnect”菜单)。
原因是Windows不会在任何程序仍然打开COM端口的情况下移除它(即使Teensy已经断开连接)。

管理用户

在终端程序中打开COM端口后,你首先什么也看不到。
如果启用了密码保护,你现在必须输入密码并按回车键,否则你只需按回车键

两种情况下都会出现主菜单

菜单显示了可用的命令和当前状态。
如果你减少用户名的字符数,你可以在EEPROM中存储超过64个用户。

CLEAR
在一块新的Teensy板上,你总是要做的第一件事是清除EEPROM
输入 "clear" 并按回车键。

ADD
要为新用户添加访问权限,输入“add”后跟用户名并按回车键。

如你所见,这些卡使用7字节的UID(Desfire)。
除了在Teensy的EEPROM中存储卡ID和用户名外,还会在Desfire卡上执行几个步骤。见下文。

可以为同一个用户名存储多张卡。
如果你稍后用DEL命令删除该用户,他的所有卡将一次性被删除。
如果你希望能够单独删除卡片,你可以给每张卡一个唯一的名字,如“John Hilton 1”、“John Hilton 2”等...

DOOR1, DOOR2, DOOR12
默认情况下,新用户只能打开门1。你可以给用户权限打开其中一扇门或两扇门。

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

DEL
此命令从EEPROM中删除一个用户和他的卡,这样他就不能再开门了。
DEL命令不需要卡在场,所以对卡所做的更改不会被撤销。
如果用户丢失了他的卡,请使用此命令。

RESTORE
RESTORE命令也从EEPROM中删除一张卡及其用户,但它还会撤销卡上的所有更改。
RESTORE将PICC主密钥重置为出厂默认密钥,并删除在Desfire默认卡上创建的应用程序。

RESET
RESET命令将PN532的RSTPDN线拉低400毫秒,从而重置该板。
之后,芯片初始化会重新运行,并读取芯片的能力。

除了这个命令,当检测到通信错误时,PN532会自动复位。

MAKERANDOM
此命令配置Desfire卡始终发送一个不同的随机ID并隐藏其真实UID。
有关不同操作模式的更多详细信息,请参见下文。



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

PN532通信协议

PN532使用一个非常复杂的通信协议。你可以在ZIP文件的手册中找到描述。

PN532 communication

  1. 首先,主机发送一个字节(DW = Data Write),告诉PN532现在将发送数据。
  2. 然后主机发送一个命令帧,其中包含要执行的指令。
  3. 然后主机发送一个字节(SR = Status Read),询问PN532的状态。
  4. 如果PN532尚未准备好,它会响应一个0x00字节。这意味着主机必须等待。当PN532准备好时,它会响应一个0x01字节。
  5. 然后主机发送一个字节(DR = Data Read),告诉PN532它期望一个数据包。
  6. 然后PN532发送一个ACK帧(Acknowledge),这是一个固定的字节序列(00, 00, FF, 00, FF, 00)。这确认了命令已正确接收。
  7. 然后主机发送一个字节(SR = Status Read),询问PN532的状态。
  8. 当PN532准备好时,它会响应一个0x01字节。
  9. 然后主机发送一个字节(DR = Data Read),告诉PN532它期望一个数据包。
  10. 最后PN532发送响应帧

数据帧

命令帧和响应帧如下所示

PN532 command

前同步码和后同步码是可选的。
数据包的接收方必须首先搜索起始序列{00, FF},它标记了数据包的开始。
然后是数据长度,后面跟着一个长度校验和。
帧标识符(TFI)如果是从主机发送到PN532的帧,则为0xD4,反之则为0xD5。
数据包数据之后是一个校验和。

Adafruit库

与PN532通信需要一个1000行代码的库。

从Adafruit网站,你可以下载一个Arduino代码和示例,展示与PN532的通信。但遗憾的是,这段代码只能用于测试,代码草率且有bug,不能用于生产环境。
我不得不完全重写Adafruit的代码。这是我的更改列表

  1. 移除了编译Adafruit代码时出现的所有编译器警告。
  2. Bug修复:(严重bug)Adafruit使用strncmp()来比较二进制数据(其中包含零)。这是完全错误的 -> 替换为memcmp()
  3. Bug修复:(严重bug)Adafruit代码不检查有效的响应包。校验和完全被忽略。起始码之前接收到的字节没有被跳过!
  4. Bug修复:(严重bug)Adafruit代码使用了一个timeout = 0(永远等待)。这是完全错误的。如果芯片不响应,代码将永远挂起!我的代码是“自愈”的,这意味着即使拔掉PN532板再重新连接,芯片也会被重置,之后又能正常工作。
  5. Bug修复:Adafruit代码无法区分readPassiveTargetID()返回false的原因。(是因为没有卡还是因为通信问题?)
  6. 添加了对值块的支持(在Mifare.cpp中)
  7. 添加了内存转储(在Mifare.cpp中)
  8. 在I2C模式下不再需要IRQ线。现在改用软件握手。
  9. 添加了软件SPI低速模式(以获得10kHz时钟)
  10. 实现了正确的唤醒过程(发送PN532_WAKEUP),而不是发送getFirmwareVersion。
  11. 调试输出有bug:校验和字节显示为0xFFFFFFFC而不是0xFC。移除了每个字节前无用的“0x”。
  12. 缺少详细的调试输出。
  13. 在调试输出中添加了数据包内有效数据字节的显示。
  14. 使用getFirmwareVersion()非常笨拙 -> 完全重写
  15. 重写了writeGPIO() -> 不再有关于错误用法的警告。
  16. 重写了AuthenticateDataBlock()ReadDataBlock()WriteDataBlock()
  17. setPassiveActivationRetries()完全没有任何错误检查。
  18. writecommand()中丑陋的代码完全重写
  19. int offset = _usingSPI ? 5 : 6;这样的垃圾代码已被移除
  20. 该库完全避免了new操作符。

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

  1. 软件SPI
    使用这个模式是因为它允许将SPI总线速度降至10kHz,以便通过长电缆传输。
    软件SPI的优点是你可以为SCK、MISO、MOSI和SSEL选择任何Teensy引脚。
  2. 硬件SPI
    这个也能工作,但一个缺点是Teensy用于硬件SCK的引脚与板载LED的引脚相同(引脚13)。所以在这个模式下不能使用LED。此外,Teensy库不允许设置10kHz的时钟。
  3. I2C
    这个也能工作,但开漏总线不能通过长电缆传输。我更改了I2C代码,使得不再需要IRQ线。

阅读维基百科关于SPII2C的内容。

Desfire EV1库

除了重写PN532代码,我还创建了一个新的Desfire库(约2700行代码)。目前互联网上没有可用于Ardiuno/Teensy控制Desfire卡的代码。

这是有史以来为Arduino家族编写的第一个库你只需要在Utils.h中更改几行,就可以在Visual Studio、Linux或其他平台上编译该库。

使用我的库非常容易,集成的自检提供了一个如何调用函数的活生生的例子。
该库完全避免了new操作符。
代码是专业的C++代码,可重用,结构良好,注释清晰。

该库不适用于旧的Desfire卡(已弃用),因为没有实现旧版身份验证。你真的需要EV1卡。

如果你搜索Desfire EV1卡的数据手册,你在NXP网站上只会找到“简短版”,这相当无用。

要获得完整的文档,你必须与NXP签订一份保密协议(NDA),在协议中你承诺不将此文档提供给任何人。这份NDA只与公司签订。令人难以置信的是,NXP没有从过去的错误中吸取教训。Mifare Classic的灾难难道没有清楚地表明“通过模糊实现安全”是行不通的吗?难道Windows比Linux更安全是因为微软保密了源代码吗?难道NXP真的相信在文件共享、维基解密和爱德华·斯诺登的时代,隐藏信息仍然有效吗?或者NXP天真地认为,一个想要生产伪造卡的中国公司无法获得那份文档吗?不管这份NDA背后的想法是什么:任何心智健全的人都会同意这纯属无稽之谈。
然而,我从未与NXP签订过那份合同,所以我没有完整的文档。

但这份文档根本不需要,因为我找到了一些托管在Github上的Desfire开源项目:easypaylibfreefareliblogicalaccess。通过研究他们的代码,修复他们的bug,对卡进行实验,并在谷歌的帮助下,我编写了自己的Desfire库。

函数 描述
GetCardVersion() 获取关于Desfire卡的详细信息,如硬件和软件版本、EEPROM大小、生产周和年份、批号等。
FormatCard() 擦除卡中除PICC主密钥外的所有内容
Authenticate() 在PICC级别或应用程序级别使用2K3DES、3K3DES密钥(ISO认证)或AES密钥进行认证
ChangeKey() 更改PICC主密钥或任何应用程序密钥
GetKeyVersion() 获取密钥版本(存储在密钥中的一个可选值)
GetKeySettings() 获取密钥的设置(权限)
ChangeKeySettings() 更改密钥的设置
GetApplicationIDs() 枚举卡上的所有应用程序
SelectApplication() 选择一个应用程序,后续命令将发送给该应用程序
DeleteApplication() 删除一个应用程序及其所有文件和密钥
CreateApplication() 使用2K3DES、3K3DES或AES密钥创建一个新应用程序。您可以在一张卡上混合使用不同类型的密钥。
GetFileIDs() 枚举一个应用程序中的所有文件
GetFileSettings() 获取有关文件的信息(文件类型、加密、权限、大小等)
DeleteFile() 删除一个文件
CreateStdDataFile() 创建一个标准数据文件(文件大小可在创建时定义,但之后不能更改)
ReadFileData() 从数据文件中读取数据
WriteFileData() 向数据文件中写入数据
ReadFileValue() 从值文件中读取值
EnableRandomIDForever() 启用随机ID模式,此模式下卡每次都会发送不同的ID(!此操作不可逆!)
GetRealCardID() 获取真实的卡UID。(在随机ID模式下很有用)
GetFreeMemory() 返回卡EEPROM中的剩余可用内存。
Selftest() 在一张空卡上执行自检,测试以上所有命令。
您可以在ZIP文件中找到整个自检的调试输出,包括所有发送和接收的字节。

编写这个库确实是一个挑战,特别是由于缺乏文档。我花了好几周的时间才完成这个项目。最困难的部分是使用加密密钥进行认证和密钥更改。在认证过程中,随机值在卡和主机之间进行加密和交换,以证明双方共享相同的主密钥。根据这些随机值生成一个会话密钥。所有加密都通过密码块链接(Cipher Block Chaining)进行,其中NXP区分了加密/解密和发送模式/接收模式。加密初始化向量(IV)仅在认证时重置一次,之后所有后续命令都必须保持其更新。如果您的IV向量与卡内部计算的向量不同步,您将收到一个完整性错误。所有发送到卡的数据和从卡接收的所有数据都必须经过CMAC计算(类似于哈希)。有些函数计算CMAC,有些则不计算。更改密钥时,必须计算两个CRC32值,并将旧密钥和新密钥进行异或、填充,然后用会话密钥加密。每种类型的密钥都有其自身的特性:AES加密16字节的块,而DES使用8字节的块,密钥本身的长度可能是8、16或24字节。因此,随机值和会话密钥的长度也随密钥类型而变化。所有这些东西都非常复杂,有成千上万个陷阱。最糟糕的是,在互联网上几乎找不到有用的信息。我感觉自己是Desfire EV1开发的先驱。

我选择了能找到的最小的开源加密库:德州仪器(Texas Instruments)的AES128和Eric Young的3DES。尽管整个Desfire源代码大约有2700行,但编译后的代码体积很小。

  1. 为Mifare Classic卡编译时,它消耗18%的闪存。
  2. 为Mifare Desfire卡编译时,它消耗27%的闪存。

所以所有的加密部分只消耗了9%的闪存。请注意,编译器会省略所有未使用的函数。

三种操作模式

根据编译器开关和卡类型,可以有3种不同的操作模式

  1. 使用#define USE_DESFIRE false编译,您将得到Classic模式,
  2. 使用#define USE_DESFIRE true和默认Desfire卡编译,您将得到Desfire默认模式,
  3. 使用#define USE_DESFIRE true和随机ID Desfire卡编译,您将得到Desfire随机模式。

系统是在Desfire默认模式还是Desfire随机模式下工作,仅取决于卡的类型。因此,这两种类型的卡可以同时混合使用。

要将默认Desfire卡转换为随机Desfire卡,您必须执行MAKERANDOM命令。
注意一旦卡被转换为使用随机ID,NXP就不允许再将其逆转。(为什么??)

  Classic模式 Desfire默认模式 Desfire随机模式
支持的卡 Classic卡,
具有默认ID的Desfire卡
Desfire卡 Desfire卡
不支持的卡 具有随机ID的Desfire卡 Classic卡 Classic卡
访问卡UID UID总是可以获取。 UID总是可以获取。 卡发送一个随机ID。获取真实的UID需要加密认证。
用户身份验证 仅通过卡的UID。 通过卡的UID和应用程序主密钥。 通过卡的UID和PICC主密钥。
安全 不安全,因为卡很容易被克隆。在中国,您可以买到允许写入任何UID的卡。您需要一个不锈钢钱包来防止这种情况。 非常安全,因为目前没有已知的对Desfire EV1卡的攻击。克隆卡需要保密的应用程序主密钥(AES或3K3DES)。 非常安全,因为目前没有已知的对Desfire EV1卡的攻击。克隆卡需要保密的PICC主密钥(AES或3K3DES)。
卡个人化 Classic卡没有个人化。(虽然可以在Classic卡上存储秘密数据,但由于其加密已被破解,这样做并不安全。) 当卡被个人化时(使用ADD命令),PICC主密钥被更改为秘密密钥,并在卡上创建一个新应用程序中的新文件,该文件存储一个16字节的秘密存储值。该文件和应用程序受秘密应用程序主密钥保护。应用程序主密钥被冻结,因此以后无法更改。16字节的秘密存储值和应用程序主密钥都是通过从卡UID、用户名和存储在Teensy的EEPROM中的附加随机数据派生出来的。 当卡被个人化时(使用ADD命令),PICC主密钥被更改为秘密密钥。
门禁 卡的UID与存储在Teensy的EEPROM中的UID进行比较。 卡的UID与存储在Teensy的EEPROM中的UID进行比较。在使用派生的应用程序主密钥进行认证后,从文件中读取秘密存储值,并与期望值进行比较。 在使用PICC主密钥进行认证后,读取真实的卡UID,并与存储在Teensy的EEPROM中的UID进行比较。

在源代码中,您还可以选择要用于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”以激活基本调试。
这里您看到的是当一张默认Desfire卡被个人化时,级别1的部分调试输出

注意:您可以在ZIP文件中找到整个自检的调试输出。

调试级别2

输入“debug 2,数据包也将被显示出来

现在您可以看到发送到PN532的命令和从PN532接收的响应。
在每个有效的数据包中,数据字节都用“<”和“>”字符标记。

命令ReadPassiveTargetID会打开射频场并检查是否有卡存在。
如果没有卡,只返回3个数据字节(D5 4B 00)。
命令SwitchOffRfField会关闭射频场以节省电池。

如果检测到一张卡,响应如下所示

您可以看到现在传输了更多的字节。它们包含卡的唯一ID和关于卡的附加信息。
在这个例子中,代码是为Mifare Classic卡编译的。ID为4字节长。
当卡被授权时,门会打开,绿色LED灯闪烁1秒。
如果卡未被授权,红色LED灯闪烁1秒,门不会打开。

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

调试级别3

输入“debug 3”以激活详细调试

现在您可以看到Teensy和PN532之间传输的每一个字节,包括ACK包和状态字节。

错误

每当Teensy检测到PN532没有按预期响应时,终端会打印一个错误。

这个例子显示了PN532完全没有响应的情况。Teensy将RSTPDN线拉低以重置芯片,发送唤醒包(见手册),然后再次尝试与芯片通信。

此外,红色LED灯会非常缓慢地闪烁,这样您就能立即看到存在严重错误。


如果您使用Desfire卡,您可能会不时看到超时错误。这只在卡离PN532天线太远时发生。这个超时意味着PN532没有收到卡的响应。在这种情况下,发送到卡的任何后续命令都将返回另一个超时错误。与卡的所有通信都会停滞。唯一的出路是调用SwitchOffRfField()并再次使用ReadPassiveTargetID()连接。首先执行的命令(GetKeyVersion()SelectApplication())工作正常,但当涉及到认证时,通信就会中断。原因是加密会增加卡的功耗。奇怪的是,AES比DES消耗更多的电量。当您使用AES时,卡必须在离PN532 4.0厘米的距离内。当使用DES时,距离可以达到5.3厘米。

请注意,基本上有两种类型的超时:(首先是Teensy等待PN532的响应,其次是PN532等待卡的响应)如果您将卡直接放在读卡器的天线上,您应该永远不会遇到超时错误。打开调试功能以查看发生了什么。

更多使用 Teensy 的项目

这是我用 Teensy 制作并发布在 Codeproject 上的第三个电子项目。您可能也对以下项目感兴趣:

 

© . All rights reserved.