使用NFC模拟校园卡门禁功能 【Mac, Windows, Android, 手环】

COVID-19期间,我们学校实行通行证制度,只有具有通行证的同学的卡才可以自由进出校园,他而没有通行证的人下人出校只能是一种奢望。在这种无理取闹的制度之下,我试想通过NFC模拟出那些可以自由进出的同学的校园卡,从而实现自由进出校园。其实这个想法已经有人做了,使用手机自带的nfc模拟校园卡,是可以实现门禁进出功能的。经过实际测试,一下方案是可行的:

  • 使用带NFC功能手机模拟
  • NFC读卡器 + 白卡
  • 带NFC功能手机+手环 or NFC 读卡器+白卡+手环

首先第一种,使用带nfc功能的手机模拟,这个是最简单的,只需要打开手机的钱包/卡包app然后模拟门禁卡读取需要复制的卡即可,这样每次进学校大门的时候直接刷手机进来就行。
然而对于手机不带NFC功能的手机,譬如我的就是,就比较难搞了。此外,使用手机NFC模拟不具有可拓展性,一台手机只能当作一张卡片使用,如果需要多张卡片就需要多个手机了。因此我们的解决方案是通过复制白卡来实现制作门禁卡,白卡复制不存在可拓展性这个问题。首先自己购买白卡,然后先读校园卡,再将其写入白卡。我们知道每一张卡都有唯一的ID,这个ID在门禁识别的时候用到。接下里本文的所有操作遵循1.读卡获取卡片ID ;2.将ID写入白卡。通过这两步,就得到了和原来的卡ID一模一样的卡,这个卡就可以拿来刷进校门了。
根据读卡,写卡的媒介不同,可以分为三种平台,win,mac,和手机&手环这些。根据卡片的类型不同,可以分为UID,CUID,M1,CPU卡。
卡片类型介绍:

  • M1卡:全称Mifare classic 1K,普通IC卡,0扇区不可修改,其他扇区可以反复擦写。通常我们使用的门禁卡、电梯卡都是M1卡。M1卡是NXP(恩智浦半导体)公司研发的IC卡,执行标准是ISO/IEC14443 Type A,读写频率是13.56MHz。目前大多数手机厂商使用的NFC芯片都是NXP,另一部分则是BRCM(博通)方案,均执行同一标准,这是手机读写M1卡的技术基础。
  • UID卡:普通复制卡,可以反复擦写所有扇区,门禁有防火墙则失效。
  • CUID:升级复制卡,可以反复擦写所有扇区,可以穿透大部分防火墙。【我们的白卡是购买此种类型的卡
  • CPU卡:有操作系统,可存储数据,也有自己的ID号,CPU卡发一串数据给设备,设备与SAM卡进行运算,设备再发一串数据回CPU卡确认,然后进行交易或身份认证;跟M1卡的区别在于一个算法在空中,一个算法在设备里面;无论是卡商,设备商,运营商,都不知道其中的算法,所以这个系统的安全性会高很多。【校园卡等大多数具有金融功能的卡属于此种类型】

目前,大多数校园卡为CPU卡ÿ

  • 5
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要实现NFC门禁功能,需要遵循以下步骤: 1. 在AndroidManifest.xml中添加NFC权限。 ``` <uses-permission android:name="android.permission.NFC" /> ``` 2. 在应用程序中创建一个Activity,并在该Activity中添加以下Intent过滤器,以便当用户将NFC卡片放在设备上时,该Activity能够接收到通知。 ``` <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED" /> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> ``` 3. 创建一个XML文件nfc_tech_filter.xml,其中包含要过滤的NFC技术类型。 ``` <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech> <tech>android.nfc.tech.NfcV</tech> </tech-list> </resources> ``` 4. 实现onNewIntent()方法,该方法在用户放置NFC卡片时被调用。在该方法中,可以获取卡片ID并将其与已注册的卡片进行比较,以确定用户是否有权限进入。 ``` @Override protected void onNewIntent(Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); byte[] tagId = tag.getId(); // 将tagId与已注册的卡片进行比较 // 如果匹配,允许用户进入 // 如果不匹配,显示错误消息 } } ``` 5. 在Activity的onResume()方法中启用前台分派系统,以便在用户将NFC卡片放在设备上时,该Activity能够接收到通知。 ``` @Override protected void onResume() { super.onResume(); enableForegroundDispatchSystem(); } private void enableForegroundDispatchSystem() { Intent intent = new Intent(this, getClass()); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); IntentFilter[] intentFilters = new IntentFilter[]{}; nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, null); } ``` 6. 在Activity的onPause()方法中禁用前台分派系统。 ``` @Override protected void onPause() { super.onPause(); disableForegroundDispatchSystem(); } private void disableForegroundDispatchSystem() { nfcAdapter.disableForegroundDispatch(this); } ``` 这样就可以实现NFC门禁功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值