arduino门禁系统卡uid默认多少
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arduino门禁系统卡uid默认多少相关的知识,希望对你有一定的参考价值。
1、序言先说下简单门禁系统的原理:
(1)IC卡激活:门禁卡管理员将卡片放到读卡器、这时软件读取到IC卡的UID序列号信息(相当于身份证号码),将这个UID录入数据库激活IC卡。
(2)刷卡:刷卡时读卡器读取到UID,查询数据库,如果数据库中存在这个UID则表示有效用户,继而控制继电器断电,此时电磁锁开门。
不亦买的RC522模块采用SPI通信、据说也有串口通信的不过成本较高。大家可以看看这个模块的主要配件:卡和读卡器。
2、加载RC522库文件
Arduino本身有个操作RC5200的库,如下图所示,打开Arduino开发工具中管理库
搜索"RC522",选择"MFRC522"安装即可
点击"More info"可以跳转到github地址https://github.com/miguelbalboa/rfid ,下文会有提及。
安装完毕后,可以看到关于MFRC522的库示例,有读取UID、获取区块信息、修改UID、卡片信息复制等
注:一般而言IC卡是不能修改0扇区0区块的UID和厂商信息数据,这些是生产时就确定下来的的(关于IC卡的存储结构有空再发文介绍,小伙伴们可以去网上查阅这方面资料也挺多的),能够全扇区修改的俗称UID卡才支持修改UID,一些不负责的门禁系统厂家仅根据UID来判断用户身份是不可靠的,一个简单的方法是在读之前先写UID操作,如果可写那么这张卡就是UID卡即复制卡,判断无效,系统也可记录是哪张IC卡被复制了用于追溯非法行为,仅供交流与学习,请勿用于非法用途哦
3、模块引脚接线
此处是网络上大部分相关文章没有提及的,只告诉了如何接线,却不告诉我们为什么这样接,甚至连Arduino版本都不说清楚。
我们打开ReadNUID的示例里面有各种版本Arduino与RC522的引脚连接图,我们按照这个接线即可。在上文提及的github项目主页也有介绍。
RC522一共8个引脚,如图所示:
3.3V供电、GND接地不用多说,IRQ是中断才用到的此处没有用到可以不接,其余5个引脚接法如下表所示:
/* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
*/
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
4、程序代码
此处测试的Arduino型号是Arduino Nano V3.0,其他型号请结合上表修改引脚号。
示例代码读取UID,并将其分别以十进制和十六进制输出到串口,简化版如下:
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
// 初始化数组用于存储读取到的NUID
byte nuidPICC[4];
void setup()
Serial.begin(9600);
SPI.begin(); // 初始化SPI总线
rfid.PCD_Init(); // 初始化 MFRC522
void loop()
// 找卡
if ( ! rfid.PICC_IsNewCardPresent())
return;
// 验证NUID是否可读
if ( ! rfid.PICC_ReadCardSerial())
return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 检查是否MIFARE卡类型
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K)
Serial.println("不支持读取此卡类型");
return;
// 将NUID保存到nuidPICC数组
for (byte i = 0; i < 4; i++)
nuidPICC[i] = rfid.uid.uidByte[i];
Serial.print("十六进制UID:");
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print("十进制UID:");
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
// 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
rfid.PICC_HaltA();
// 停止读卡模块编码
rfid.PCD_StopCrypto1();
void printHex(byte *buffer, byte bufferSize)
for (byte i = 0; i < bufferSize; i++)
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], HEX);
void printDec(byte *buffer, byte bufferSize)
for (byte i = 0; i < bufferSize; i++)
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], DEC);
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
5、运行结果
依次将卡A、卡B、卡A放到RC522读卡区,串口打印信息如下 参考技术A 默认:
(1)IC卡激活:门禁卡管理员将卡片放到读卡器、这时软件读取到IC卡的UID序列号信息(相当于身份证号码),将这个UID录入数据库激活IC卡。 (2)刷卡:刷卡时读卡器读取到UID,查询数据库,如果数据库中存在这个UID则表示有效用户,继而控制继电器断电,此时电磁锁开门。 不亦买的RC522模块采用SPI通信、据说也有串口通信的不过成本较高。大家可以看看这个模块的主要配件:卡和读卡器。 2、加载RC522库文件 Arduino本身有个操作RC5200的库,如下图所示,打开Arduino开发工具中管理库 搜索"RC522",选择"MFRC522"安装即可 点击"More info"可以
如果您有 IClass 卡的 UID,则读取卡上的卡号
【中文标题】如果您有 IClass 卡的 UID,则读取卡上的卡号【英文标题】:Reading Card Number on card given you have UID of IClass Card 【发布时间】:2015-09-16 14:06:05 【问题描述】:我有 HID Class Reader USB Device 5427 CK 。我已成功读取卡的 ATR 和 UID。问题是卡片上印有一个数字。
即 2x01966 21093771-1
我在使用 java API 读取卡片时得到的输出。
PC/SC card in HID OMNIKEY 5427 CK 0, protocol T=1, state OK
ATR = 0x3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 1C 00 00 00 00 7E
Card UID = 0xB6 A9 0E FB FF 12 E0
Card type: PicoPass 16KS (8x2)
如何从 UID 中获取相同的数字
【问题讨论】:
【参考方案1】:请参阅OMNIKEY Contactless Smart Card Readers Developer Guide 可用的here。第 9 章和第 10 章讲述了如何与 iClass 卡进行通信。
Select Page
和 P2=0x04
(请求 8 字节卡序列号)命令可能有效(第 38 页)。
编辑>
请先阅读上述手册。
下载“用于 OMNIKEY 非接触式智能卡读卡器的同步 API”here(如第 6 章所述)。
安装下载的包并研究“C:\Program Files\HID Global\Sync-API”下提供的示例iClassExplorer。
如果您坚持从 java 调用它,您可能会发现 JNA 很有用。
javax.smartcardio
方法可能不起作用,因为您需要使用 scardsyn.dll
中的 SCardCLICCTransmit
函数(第 9.1 章)。
【讨论】:
SmartCardReader.main(SmartCardReader.java:78) sun.security.smartcardio.ChannelImpl.transmit(Unknown Source) 处 sun.security.smartcardio.ChannelImpl.doTransmit(Unknown Source) 处的未知错误 0x8010002f原因:sun.security.smartcardio.PCSCException:unknown error 0x8010002f at sun.security.smartcardio.PCSC.SCardTransmit(Native Method) ... 3 更多 使用这个 apdu cmd 80 A6, 00 04 00, 02, 00 得到这个错误 没有任何好处 :( 重试没有好处 仍然有相同的错误 用于 UID 的 apdu 命令正在返回数据,ATR 也只返回序列号。读取这个扇区是否有任何安全原因 第 9.1 节:通过符合 ISO7816 的 APDU 交换支持 iCLASS 卡。命令和响应 APDU 通过驻留在 OMNIKEY 同步 API 中的 OMNIKEY 专有 API 函数 SCardCLICCTransmit 进行交换。 已经试过它给出错误...所以使用java智能卡io libray【参考方案2】:SCardCLICCTransmit() 是驻留在 OMNIKEY 同步 API DLL 中的专有 API 调用。 将此阅读器与本机 CCID 驱动程序一起使用,并通过 FFCA0000 访问 UID。如果没有额外的包装器,这应该可以很好地工作。此 APDU 适用于所有 PC/SC 第 3 部分兼容的非接触式智能卡读卡器。
【讨论】:
以上是关于arduino门禁系统卡uid默认多少的主要内容,如果未能解决你的问题,请参考以下文章