From 9ded22e905e3a678128b25916b2d08c26a936aa3 Mon Sep 17 00:00:00 2001 From: Sucareto <28331534+Sucareto@users.noreply.github.com> Date: Sun, 13 Mar 2022 00:02:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BA=86banapass=EF=BC=8C?= =?UTF-8?q?=E6=84=9F=E8=B0=A2=20Lee=20=E5=92=8C=20LTC=20=E7=9A=84=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Arduino-Aime-Reader.ino | 9 ++++++--- README.md | 14 +++++++------- cmd.h | 21 ++++++++++++++++++--- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Arduino-Aime-Reader.ino b/Arduino-Aime-Reader.ino index df046bc..ef3be0c 100644 --- a/Arduino-Aime-Reader.ino +++ b/Arduino-Aime-Reader.ino @@ -132,8 +132,11 @@ void SerialCheck() { case SG_NFC_CMD_FELICA_ENCAP: sg_nfc_cmd_felica_encap(); break; - case SG_NFC_CMD_MIFARE_AUTHENTICATE: - sg_nfc_cmd_mifare_authenticate(); + case SG_NFC_CMD_AIME_AUTHENTICATE: + sg_nfc_cmd_aime_authenticate(); + break; + case SG_NFC_CMD_BANA_AUTHENTICATE: + sg_nfc_cmd_bana_authenticate(); break; case SG_NFC_CMD_MIFARE_SELECT_TAG: sg_nfc_cmd_mifare_select_tag(); @@ -142,7 +145,7 @@ void SerialCheck() { sg_nfc_cmd_mifare_set_key_aime(); break; case SG_NFC_CMD_MIFARE_SET_KEY_BANA: - sg_res_init(); + sg_nfc_cmd_mifare_set_key_bana(); break; case SG_NFC_CMD_RADIO_ON: sg_nfc_cmd_radio_on(); diff --git a/README.md b/README.md index 832f871..f4114a8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Arduino-Aime-Reader -使用 Arduino + PN532 + WS2812B 制作的 Aime 兼容读卡器。支持 Felica,Aime。 +使用 Arduino + PN532 + WS2812B 制作的 Aime 兼容读卡器。 +支持 [FeliCa](https://zh.wikipedia.org/wiki/FeliCa)(Amusement IC、Suica、八达通等)和 [MIFARE](https://zh.wikipedia.org/wiki/MIFARE)(Aime,Banapassport)。 实现逻辑为官方读卡器串口数据对比 + 脑补,不保证正确实现。 通信数据格式参考了 [Segatools]() 和官方读卡器抓包数据,可在 [Example.txt](doc/Example.txt) 和 [nfc.txt](doc/nfc.txt) 查看。 @@ -19,11 +20,11 @@ ### 支持列表: -- SDBT:COM12,支持读取 Felica 和 Aime -- SDDT/SDEZ:COM1,支持读取 Felica 和 Aime -- SBZV/SDDF:COM10,支持读取 Felica 和 Aime -- SDEY:COM2,仅支持读取 Aime -- SDHD:COM4,支持读取 Felica 和 Aime +- SDBT:COM12,支持读取 FeliCa 和 MIFARE +- SDDT/SDEZ:COM1,支持读取 FeliCa 和 MIFARE +- SBZV/SDDF:COM10,支持读取 FeliCa 和 MIFARE +- SDEY:COM2,仅支持读取 MIFARE +- SDHD:COM4,支持读取 FeliCa 和 MIFARE 有使用 amdaemon 的,可以参考 config_common.json 内 aime > unit > port,high_baudrate 来确定 COM 号和波特率。 @@ -36,7 +37,6 @@ ### 已知问题: - Felica 在非 amdaemon 游戏可能无法正常工作,因为 NDA_06 未正确回复 -- banapassport 卡因为没有数据参考,所以没有支持 - 未确定`res.status`的意义,因此`res.status = 1;`可能是错误的 - 因为`get_fw`和`get_hw`返回的是自定义版本号,启动时可能触发 amdaemon 的固件升级,可以将 aime_firm 文件夹重命名或删除 - 未实现`mifare_select_tag`,未支持多卡选择,只会读到最先识别的卡片 diff --git a/cmd.h b/cmd.h index dd39d48..141504a 100644 --- a/cmd.h +++ b/cmd.h @@ -9,7 +9,7 @@ CRGB leds[NUM_LEDS]; PN532_I2C pn532i2c(Wire); PN532 nfc(pn532i2c); -uint8_t AimeKey[6]; +uint8_t AimeKey[6], BanaKey[6];; enum { SG_NFC_CMD_GET_FW_VERSION = 0x30, @@ -22,7 +22,7 @@ enum { SG_NFC_CMD_BANA_AUTHENTICATE = 0x51, SG_NFC_CMD_MIFARE_READ_BLOCK = 0x52, SG_NFC_CMD_MIFARE_SET_KEY_AIME = 0x54, - SG_NFC_CMD_MIFARE_AUTHENTICATE = 0x55, + SG_NFC_CMD_AIME_AUTHENTICATE = 0x55, SG_NFC_CMD_UNKNOW0 = 0x60, /* maybe some stuff about AimePay*/ SG_NFC_CMD_UNKNOW1 = 0x61, SG_NFC_CMD_RESET = 0x62, @@ -159,6 +159,11 @@ static void sg_nfc_cmd_mifare_set_key_aime() { memcpy(AimeKey, req.key, 6); } +static void sg_nfc_cmd_mifare_set_key_bana() { + sg_res_init(); + memcpy(BanaKey, req.key, 6); +} + static void sg_led_cmd_reset() { sg_res_init(); FastLED.clear(); @@ -214,7 +219,7 @@ static void sg_nfc_cmd_mifare_select_tag() { sg_res_init(); } -static void sg_nfc_cmd_mifare_authenticate() { +static void sg_nfc_cmd_aime_authenticate() { sg_res_init(); //AuthenticateBlock(uid,uidLen,block,keyType(A=0,B=1),keyData) if (nfc.mifareclassic_AuthenticateBlock(req.uid, 4, req.block_no, 1, AimeKey)) { @@ -224,6 +229,16 @@ static void sg_nfc_cmd_mifare_authenticate() { } } +static void sg_nfc_cmd_bana_authenticate() { + sg_res_init(); + //AuthenticateBlock(uid,uidLen,block,keyType(A=0,B=1),keyData) + if (nfc.mifareclassic_AuthenticateBlock(req.uid, 4, req.block_no, 0, BanaKey)) { + return; + } else { + res.status = 1; + } +} + static void sg_nfc_cmd_mifare_read_block() {//读取卡扇区数据 if (nfc.mifareclassic_ReadDataBlock(req.block_no, res.block)) { sg_res_init(0x10);