DIY 电子 RFID 门锁带电池备份
一款用RFID卡或RFID令牌取代机械钥匙的电子门锁。
- 下载包含源代码、电路板布局和数据手册的Zip文件 - 3.3 MB
最新版文章和Zip文件:2018年5月7日
新内容: 这是有史以来第一个为 Arduino/Teensy 编写的 Desfire 项目! 只需稍作修改,您就可以在Windows、Linux或其他平台上编译代码。 |
关于窃贼
最近《明镜周刊》(Spiegel)发表了一篇关于德国窃贼的文章
- 窃贼偏爱天黑的月份。据保险公司报告,十二月的入室盗窃案是七月的三倍。
- 警方报告称,找到罪犯非常困难。大多数情况下没有目击者,也没有留下任何痕迹。只有2.6%的入室盗窃案罪犯能被定罪。
- 窃贼不仅闯入富人的住宅。任何人都可能成为受害者。几乎每家每户都有手机、笔记本电脑或现金。特别是吸毒者会选择在他们附近的环境中作案。
- 根据警方的经验,最好的预防措施是在门窗上安装机械防护装置以及保持警惕的邻居。大多数窃贼只尝试2-3分钟闯入房屋。但在60%的情况下他们会成功。
- 这篇文章提到,德国警方观察到越来越多的入室盗窃案是由来自塞尔维亚、罗马尼亚、土耳其、阿尔巴尼亚和格鲁吉亚的专业团伙组织的。这些人申请庇护,穿越欧洲不同国家,只为做一件事:偷窃。
- 还有另外一篇文章附有一张德国地图,显示了大部分入室盗窃案发生的城市。警方在2015年统计了152,000起案件——并且有增加的趋势。
大多数门锁都非常不安全
你的门锁能保护你免受窃贼侵害吗?
如果你的钥匙长这样
那它肯定不行。
你的门可以在几秒钟内被打开,而你甚至不会注意到有人在你不在家时进来过,因为门和锁都没有损坏。你的邻居也听不到任何声音,因为撬锁是完全无声的。
你不相信吗?
那就看看这个视频
如你所见:撬锁非常容易。
小偷甚至不需要特殊工具。他可以用两根发夹打开你的锁!
当你在Youtube上搜索“lockpicking”(撬锁)时,你会找到169,000个结果。
使用电动振动器(开锁枪),打开一个锁不到10秒钟,正如你在这个视频中看到的那样。
即使是十字锁,也有专门的撬锁工具可以在10秒内打开,正如你在这个视频中看到的那样。
更好的机械锁
有一些更好的锁,它们的钥匙上有圆孔而不是锯齿,比如这种 KESO 2000 钥匙。
这些锁非常昂贵。尽管如此,它们也可以被撬开,虽然可能需要3分钟才能打开,正如你在这个视频中看到的那样。
最后,锁可以用大钳子弄坏,或者用钻头打开,正如你在这个视频中看到的那样。
结论:你找不到一把真正安全的机械锁。
复制钥匙
如果你出租公寓,你的租户可以复制钥匙并将其交给其他人。这样他就可以转租你的公寓。如果有一天他搬走了,你想重新出租公寓,你就必须更换锁,否则前租户仍然可以进入公寓。
电子门锁
电子门锁的优点在于上述安全问题都不适用。
拥有一个安全的门锁,防止小偷进入,远比安装一个在小偷已经进屋后才发出警报的报警系统要好。等警察赶到时,他早就跑了,而且可能一些贵重物品已经不见了。安全的锁总是比报警系统或摄像头更好。
市场上有哪些选择?
我寻找了一种电子替代方案,但我找到的方案都不能让我满意。
- 有指纹识别器,但我没有找到防水的,所以不适合户外安装。此外,你将一个电子设备暴露在街上,恶意的人可能会轻易破坏它。
- 还有一些你可能在酒店见过的电子门锁,可以用卡片开门。
但这些仅适用于室内安装,并且它们依赖于锁内的一块很快就会耗尽的小电池。 - 我找到的所有电子解决方案在停电时都无法工作,因为它们都缺少一个强大的备用电池。一个在停电时无法打开的锁是无用的。
- 大多数电子解决方案都太贵了。
我的项目
因此,我设计了自己的解决方案,具有以下特点
- 专为大楼正门设计:没有任何电子设备暴露在街道或雨水中。你只需在门内侧安装一个RFID读卡器,它可以通过关闭的门读取RFID卡。
- 从门外看不到任何可能被入侵者操纵的东西。
- 强大的备用电池确保设备在停电超过一周的情况下也能正常工作。
- 处理器检查电池电压,并在电压超出范围时发出警报。
- 处理器检查电池是否老化,并在电池需要更换时发出警报。
- 提供一个非常易于使用的界面,可通过USB电缆和终端程序访问,让您在几秒钟内添加或删除用户。即使是计算机新手也能快速管理用户授权。
- 您可以在微处理器的EEPROM中存储64个用户及其卡片。通过修改源代码可以支持超过64个用户。
- 访问终端界面可以用密码保护。
- 如果您或您的租户丢失了RFID卡,您可以轻松地从EEPROM中删除该卡,而无需更换机械门锁。
- 我为电路板设计了一个布局,电子初学者也能焊接。
- 与商业解决方案相比,整个解决方案价格便宜。
- 假设你有一扇无法用撬棍打开的安全门,这个解决方案比你终生支付的任何保险都要便宜得多。我已经不再支付任何保险了。
- 整个项目由一位经验非常丰富的硬件和软件工程师设计和测试。
RFID卡和令牌
什么将取代你的机械钥匙?
你可以选择RFID卡或像这样的令牌
卡片对弯曲很敏感,所以你不应该把它们放在口袋里,因为它们可能会断裂。
令牌的其他名称是“标签”和“钥匙扣”。
每张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卡。更多细节请参见 维基百科。
你可以为两种可能的操作模式编译源代码
- 用于Mifare Classic卡:在此模式下,仅使用卡的ID来识别用户并开门。(不推荐)
- 用于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卡,你应该购买一个不锈钢钱包,它有一个金属屏蔽层,可以阻止任何外部射频频率到达你的卡,从而使克隆你的卡变得不可能。
旧的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张卡。我找到了这两家也销售少量卡的公司:RyscCorp和Smartcard Focus。你也可以从Smartcard America订购,他们通过eBay销售,但运往其他国家的运费非常昂贵。
小心来自中国在eBay上的假冒产品:无法保证中国的仿制品能满足与原装NXP卡相同的安全标准。
Mifare Desfire EV2 卡
EV2卡是EV1卡的改进版。它们具有扩展功能和降低的功耗。我没有亲自测试过EV2卡。但有用户报告说他们使用来自Karteo或ZutrittsShop的EV2卡,并且使用来自Elchouse或Paradisetronic的读卡器甚至可以在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 读卡器
来自Adafruit的PN532分线板(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灯。
首先,您必须在板上焊接两个跳线,以定义通信模式。
I2C在较长的电缆上太弱了,因为I2C是一个带有上拉电阻的开漏总线。
我使用SPI通信,速度较低,为10 kHz。
所以你必须设置跳线:SEL0 = OFF 和 SEL1 = ON。
请阅读维基百科关于SPI和I2C的内容。
我特意不在这里使用任何插头,因为在可能会被猛烈关上的门上,焊接连接要安全得多。
注意:
如果你认为通过购买右边这种来自中国的便宜得多的PN532板可以省钱,那你就错了。这些板在很多地方都有售,但它们不能与Desfire卡一起工作。
这些板子的天线太小了(4cm x 4cm),无法向卡片发送足够的高频能量。结果将是你在认证时会看到超时错误。
如果你使用EV1卡,你必须从Adafruit订购PN532板,否则你会浪费你的时间和金钱。只有在你使用EV2卡的情况下,你可以尝试使用那些小的中国板,但我没有使用它们的经验。
请阅读关于EV2卡的内容。
使用I2C总线
PN532也可以通过I2C总线而不是SPI来控制。
一位用户报告说,他在使用I2C进行身份验证时遇到了超时错误。
他说原因是Arduino库定义的缓冲区只有32字节,太小了。
我无法证明这是否正确,但我在这里公布他的信息。
在你的Arduino安装文件夹中搜索文件Wire.h和Twi.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有几个优势
- 它速度非常快(32位ARM处理器,运行频率为96MHz)
- 它非常小巧(3.5厘米 x 1.5厘米)
- 它比其他板子有更多的RAM(64 kB)和闪存程序存储(260 kB),并且它有一个EEPROM。
较新的Arduino板(Due、Zero、101)根本没有EEPROM,这使它们毫无用处。 - 价格便宜(20美元)
- 功耗低。
- 它内部工作电压为3.3V,但可以用5V供电。
- Teensy库(TeensyDuino)比官方Arduino库功能更多更好。
首先你必须用美工刀破坏Teensy底面的一个小跳线。
否则,来自USB电缆的5V电压将直接连接到主板的5V电源。
如果主板开着而电脑关着,或者反过来,这会导致电流流动。
注意:
如果你认为购买更便宜的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。这是正常的。
该图显示了铅酸电池的充电状态,可以直接从电压推断出来。
你可以看到,在12.8V时,电池是100%充满的。
铅酸电池有不同类型
铅酸电池有不同的技术
- 富液式电池(必须不时地加注蒸馏水)
- 胶体电池(免维护)
- 吸附式玻璃纤维隔板(AGM)电池(免维护)
如果你想了解更多关于电池的信息,请访问 batteryuniversity.com。
我使用一块15Ah的固定式深循环AGM电池(30美元)。12Ah也足够了。尺寸是94 x 151 x 98毫米。这种电池是MF(免维护)的,这意味着永远不需要像过去那样往里面加蒸馏水。当你购买它时,它已经是充电并密封好的。
由于电池的内容物不是液体,所以可以任何姿势安装电池。你可以把电池平放,然后把主板安装在上面以节省空间。
铅酸电池不喜欢高温,你应该只在充电状态下存放它们,否则会缩短它们的寿命。
请非常小心对待电池!如果发生短路,流过的电流将超过100安培!两极之间的任何东西都会化为一缕青烟!
重要提示:铅是有毒的。旧电池必须回收。
主板
当继电器切换时,门会打开。继电器会激活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 按钮开关
如果你没有本地的电子商店,你可以从DigiKey、Farnell、TME或Newark订购清单上的所有东西,它们都是非常好的在线邮购销售商,提供数十万种电子零件。
电路板布局
在ZIP文件中,你可以找到我为单层面包板设计的手工焊接方案。即使是电子初学者也很容易焊接这块板。我只花了半天时间就连接好了所有东西。
在板上你看到两个继电器。上面的继电器是可选的。它允许独立打开两扇门。如果你不需要这个功能,可以省略绿色的部分。
如何计算Rx
电阻Rx限制了流过开门器电磁线圈的电流,如下图所示。
这里您看到锁打开了(底板已移除)。
我把这个锁安装在门的内侧顶部。我移除了原来的钥匙锁,所以从外面没有任何东西可以被操纵。
首先,将电磁阀连接到可调直流电源。从零开始缓慢升高电压,直到锁打开。
在我的情况下,这发生在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中
- 选项A:
你可以从arduino.cc安装Arduino编译器,从PJRC.com安装Teensyduino库,然后编译你在上面的ZIP文件中找到的草图。你必须这样配置编译器设置
- 选项 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端口
重要提示:如果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文件中的手册里找到描述。
- 首先,主机发送一个单字节(DW = 数据写入),告诉PN532现在将要发送数据。
- 然后主机发送一个命令帧,其中包含要执行的指令。
- 然后主机发送一个单字节(SR = 状态读取),询问PN532的状态。
- 如果PN532尚未准备好,它会响应一个0x00字节。这意味着主机必须等待。当PN532准备好时,它会响应一个0x01字节。
- 然后主机发送一个单字节(DR = 数据读取),告诉PN532它期望一个数据包。
- 然后PN532发送一个ACK帧(确认),这是一个固定的字节序列(00, 00, FF, 00, FF, 00)。这确认了命令已正确接收。
- 然后主机发送一个单字节(SR = 状态读取),询问PN532的状态。
- 当PN532准备好时,它会响应一个0x01字节。
- 然后主机发送一个单字节(DR = 数据读取),告诉PN532它期望一个数据包。
- 最后,PN532发送响应帧。
数据帧
命令帧和响应帧如下所示
前导码和后导码是可选的。
数据包的接收方必须首先搜索起始序列 {00, FF},它标志着数据包的开始。
然后是数据长度,后面跟着一个长度校验和。
如果帧是从主机发送到PN532,则帧标识符(TFI)为0xD4,反方向则为0xD5。
数据包数据之后是一个校验和。
Adafruit 库
与PN532通信需要一个1000行代码的库。
在Adafruit网站上,你可以下载一个Arduino代码和示例,展示与PN532的通信。但遗憾的是,这段代码只能用于测试,代码草率且有bug,不能用于生产环境。
我不得不完全重写Adafruit的代码。以下是我的修改列表
- 移除了编译Adafruit代码时出现的所有编译器警告。
- Bug修复:(严重bug)Adafruit使用
strncmp()
来比较二进制数据(其中包含零)。这完全是错误的 -> 替换为memcmp()
- Bug修复:(严重bug)Adafruit代码不检查有效的响应包。校验和被完全忽略。起始码之前的接收字节没有被跳过!
- Bug修复:(严重bug)Adafruit代码使用了一个timeout = 0(永远等待)。这完全是错误的。如果芯片不响应,代码会永远挂起!我的代码是“自愈”的,这意味着即使在拔掉PN532板并重新连接后,芯片也会被重置,然后再次工作。
- Bug修复:Adafruit代码无法区分
readPassiveTargetID()
返回false的原因。(是因为没有卡还是因为通信问题?) - 添加了对值块的支持(在Mifare.cpp中)
- 添加了内存转储(在 Mifare.cpp 中)
- 在I2C模式下不再需要IRQ线。现在改用软件握手。
- 增加了软件SPI慢速模式(以获得10kHz时钟)
- 实现了正确的唤醒程序(发送PN532_WAKEUP),而不是发送getFirmwareVersion。
- 调试输出有问题:校验和字节显示为0xFFFFFFFC而不是0xFC。移除了每个字节前无用的“0x”。
- 缺少详细的调试输出。
- 在调试输出中增加了包内有效数据字节的显示。
- 使用
getFirmwareVersion()
非常笨拙 -> 完全重写 writeGPIO()
重写 -> 不再有关于错误用法的警告。AuthenticateDataBlock()
,ReadDataBlock()
和WriteDataBlock()
已重写。setPassiveActivationRetries()
完全没有任何错误检查。writecommand()
中丑陋的代码已完全重写- 移除了类似这样的垃圾代码:
int offset = _usingSPI ? 5 : 6;
- 该库完全避免使用
new
运算符。
我的新PN532库,你可以在ZIP文件中找到,支持3种通信模式
- 软件SPI
使用这个是因为它允许将SPI总线速度限制在10kHz,以便在长电缆上传输。
软件SPI的优点是你可以为SCK、MISO、MOSI和SSEL选择任何Teensy引脚。 - 硬件SPI
这个也能用,但一个缺点是Teensy的硬件SCK引脚与板载LED使用的引脚相同(引脚13)。所以在这个模式下不能使用LED。此外,Teensy库不允许设置10kHz的时钟。 - I2C
这个也能用,但是开漏总线不能通过长电缆传输。我修改了I2C代码,使得不再需要IRQ线。
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开源项目:easypay、libfreefare和liblogicalaccess。通过研究他们的代码,修复他们的错误,用卡片进行实验,并在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行,但编译后的代码大小很小
- 为Mifare Classic卡编译时,它消耗18%的闪存。
- 为Mifare Desfire卡编译时,它消耗27%的闪存。
所以所有加密相关的东西只消耗了9%的闪存。请注意,编译器会从编译中省略所有未使用的函数。
三种操作模式
根据编译器开关和卡片类型,你可以有3种不同的操作模式
- 使用
#define USE_DESFIRE false
编译,您将得到 Classic 模式, - 使用
#define USE_DESFIRE true
和默认Desfire卡编译,您将得到 Desfire 默认 模式, - 使用
#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卡使用的主密钥。
- 使用
#define USE_AES true
编译,您将使用128位AES密钥(最大读卡器距离:4.0厘米) - 使用
#define USE_AES false
编译,您将使用168位3K3DES密钥(最大读卡距离:5.3厘米)
在源代码中,您可以找到 Secrets.h 文件,其中包含:
- PICC 主密钥(AES 或 3K3DES),
- 一个加密密钥(3K3DES),用于从卡片 ID、用户名和随机数据派生出应用程序主密钥(适用于 Desfire 默认模式),
- 一个加密密钥(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 上的第三个电子项目。您可能也对以下项目感兴趣:
- 红外遥控您的电脑
它使用一个 Teensy 和一个红外接收器来控制您电脑上的音乐播放器/视频播放器。 - 一个 USB HID 键盘鼠标触摸屏模拟器
它使用一个 Teensy 通过 USB 模拟鼠标、键盘和触摸屏。