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

DIY 电子 RFID 门锁带电池备份

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (161投票s)

2016年4月29日

CPOL

52分钟阅读

viewsIcon

1299391

downloadIcon

8920

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

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

关于窃贼

Burglar

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

  • 窃贼偏爱天黑的月份。据保险公司报告,十二月的入室盗窃案是七月的三倍。
     
  • 警方报告称,找到罪犯非常困难。大多数情况下没有目击者,也没有留下任何痕迹。只有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厘米的距离上就无法读取了。唯一好用的是Desfire 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分线板(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的几个字节,你应该购买你能找到的最小的卡片。

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

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

PN532 board

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

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

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

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


如果你使用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

电路板之间的电缆连接

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

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

当使用Desfire卡时,你甚至可以在电缆上附加一个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编译草图时,你会从编译器得到这个输出

 

这意味着该草图仅全局变量就需要11%的64kByte RAM,即7.6kB。此外,还需要更多的RAM用于存储局部变量的堆栈。这部分额外的RAM是动态的,无法预先计算。Arduino Uno只有可笑的2kB RAM。该草图甚至无法在拥有8kB RAM的Arduino Mega上运行。你必须购买一块拥有64kB RAM的Teensy 3.2,否则你会浪费你的钱和时间。当你在内存不足的板子上运行代码时,后果可能是错误、终端中出现乱码信息,甚至崩溃。当板子不再响应时,你就知道它崩溃了。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,带3个引脚(红/绿)
  • 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 Micro USB 数据线
  • 1 x 热缩管,直径3毫米,长度20厘米(用于LED)
  • 2 x M3螺丝 + 螺母 + 垫圈 (用于变压器)
  • 额外的Mifare卡或令牌

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

  • 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。有一个命令可以关闭射频场。但没有射频场就无法检测到卡。所以我的代码做法是打开射频场100ms以检查是否有卡,然后关闭射频场1秒。当射频场关闭时,PN532只消耗18mA。结果是平均消耗26mA。

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

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

继电器通电的时间间隔被优化了。有大电流流过电磁线圈。你需要测试哪个时间间隔对你的电磁线圈有效。你可以在源代码中修改。在我的情况下,电磁线圈在20毫秒的间隔下就已经可以工作了。但为了万无一失,我编程为100毫秒。

预期寿命

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

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

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

甚至有人怀疑公司故意制造寿命短的设备(“计划报废”)。但这至今无法证实。事实是,工业界正处于一场激烈的价格战中。公司必须廉价设计他们的产品,否则客户不会购买。罪魁祸首是客户,因为他不愿意为更高的质量支付更多的钱。你还记得廉价的日本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文件中找到的草图。你必须这样配置编译器设置


     
  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端口(菜单“工具”,见上图)并配置它发送换行符(LineFeeds)

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

TeraTerm

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

管理用户

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

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

菜单显示可用命令和当前状态。
如果你减少用户名的字符数量,你可以在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 = 数据写入),告诉PN532现在将要发送数据。
  2. 然后主机发送一个命令帧,其中包含要执行的指令。
  3. 然后主机发送一个单字节(SR = 状态读取),询问PN532的状态。
  4. 如果PN532尚未准备好,它会响应一个0x00字节。这意味着主机必须等待。当PN532准备好时,它会响应一个0x01字节。
  5. 然后主机发送一个单字节(DR = 数据读取),告诉PN532它期望一个数据包。
  6. 然后PN532发送一个ACK帧(确认),这是一个固定的字节序列(00, 00, FF, 00, FF, 00)。这确认了命令已正确接收。
  7. 然后主机发送一个单字节(SR = 状态读取),询问PN532的状态。
  8. 当PN532准备好时,它会响应一个0x01字节。
  9. 然后主机发送一个单字节(DR = 数据读取),告诉PN532它期望一个数据包。
  10. 最后,PN532发送响应帧

数据帧

命令帧和响应帧如下所示

PN532 command

前导码和后导码是可选的。
数据包的接收方必须首先搜索起始序列 {00, FF},它标志着数据包的开始。
然后是数据长度,后面跟着一个长度校验和。
如果帧是从主机发送到PN532,则帧标识符(TFI)为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. 调试输出有问题:校验和字节显示为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行代码)。目前互联网上没有可用于Arduino/Teensy控制Desfire卡的代码。

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

使用我的库非常简单,集成的自检提供了一个如何调用函数的生动示例。
该库完全避免使用new运算符。
该代码是专业的C++代码,可重用,结构良好且注释清晰。

该库不适用于旧的Desfire卡(已弃用),因为未实现旧式身份验证。您确实需要EV1卡。

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

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

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

函数 描述
GetCardVersion() 获取有关Desfire卡的详细信息,如硬件和软件版本、EEPROM大小、生产周和年份、批号等。
FormatCard() 擦除卡上除PICC主密钥外的所有内容
Authenticate() 使用2K3DES、3K3DES密钥(ISO认证)或AES密钥在PICC级别或应用程序级别进行认证
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文件中找到整个自检过程的调试输出,包括所有发送和接收的字节。

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

我选择了能找到的最小的开源加密库:来自德州仪器的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就不允许再改回去了。(为什么??)

  经典模式 Desfire默认模式 Desfire随机模式
支持的卡 经典卡,
带默认ID的Desfire卡
Desfire 卡 Desfire 卡
不支持的卡 带有随机ID的Desfire卡 经典卡 经典卡
访问卡UID UID总是可以获取。 UID总是可以获取。 卡片发送一个随机ID。获取真实的UID需要加密认证。
用户身份验证 仅通过卡的UID。 通过卡的UID和应用主密钥。 通过卡的UID和PICC主密钥。
安全 不安全,因为卡片很容易被克隆。在中国你可以买到允许写入任何UID的卡。你需要一个不锈钢钱包来防止这种情况。 非常安全,因为目前没有已知的针对Desfire EV1卡的攻击。克隆该卡需要秘密的应用程序主密钥(AES或3K3DES)。 非常安全,因为目前没有已知的对Desfire EV1卡的攻击。克隆该卡需要秘密的PICC主密钥(AES或3K3DES)。
卡片个人化 经典卡没有个人化。(虽然可以在经典卡上存储秘密数据,但由于加密已被破解,这并不安全。) 当卡片被个性化(使用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 命令会打开射频场(RF field)并检查是否有卡片存在。
如果没有卡片,则只返回 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 线拉低以重置芯片,发送 WakeUp(唤醒)数据包(参见手册),然后再次尝试与芯片通信。

此外,红色 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.