Share This Post

實作紀錄

  1. iPhone Native NFC 可開啟有連結之 215(詢問打開連結),但 215 的執行不太穩定,有時候讀得到有時不行
  2. NFC 不能重複刷,會有 Duplicate 問題,所以要記得 cleanup nfc regitstration
  3. Apple 官方可支援格式如下: A reader session for detecting ISO7816, ISO15693, FeliCa, and MIFARE tags. Types [NFCTagTypeISO15693](<https://developer.apple.com/documentation/corenfc/nfctagtype/nfctagtypeiso15693?language=objc>) An NFC tag of type ISO 15693. [NFCTagTypeISO7816Compatible](<https://developer.apple.com/documentation/corenfc/nfctagtype/nfctagtypeiso7816compatible?language=objc>) An NFC tag of type ISO 7816. [NFCTagTypeFeliCa](<https://developer.apple.com/documentation/corenfc/nfctagtype/nfctagtypefelica?language=objc>) An NFC tag of type FeliCa. [NFCTagTypeMiFare](<https://developer.apple.com/documentation/corenfc/nfctagtype/nfctagtypemifare?language=objc>) An NFC tag of type MIFARE. Apple Developer Documentation Apple Developer Documentation
// Pre-step, call this before any NFC operations
async function initNfc() {
  await NfcManager.start();
}

readMifare

  1. iPhone 無法讀取
import NfcManager, { NfcTech } from "react-native-nfc-manager";

async function readMifare() {
    try {
      // 0. Request Mifare technology
      let reqMifare = await NfcManager.requestTechnology(
        NfcTech.MifareUltralight
      );
      if (reqMifare !== "MifareUltralight") {
        throw new Error(
          "[NFC Read] [ERR] Mifare technology could not be requested"
        );
      }
  
      // 1. Get NFC Tag information
      const nfcTag = await NfcManager.getTag();
      console.log("[NFC Read] [INFO] Tag: ", nfcTag);
  
      // 2. Read pages
      const readLength = 60;
      let mifarePages = [];
      const mifarePagesRead = await Promise.all(
        [...Array(readLength).keys()].map(async (_, i) => {
          const pageOffset = i * 4; // 4 Pages are read at once, so offset should be in steps with length 4
          let pages =
            await NfcManager.mifareUltralightHandlerAndroid.mifareUltralightReadPages(
              pageOffset
            );
          mifarePages.push(pages);
          console.log(`[NFC Read] [INFO] Mifare Page: ${pageOffset}`, pages);
          //await wait(500); // If Mifare Chip is to slow
        })
      );
  
      // 3. Success
      console.log("[NFC Read] [INFO] Success reading Mifare");
  
      // 4. Cleanup
      _cleanup();
    } catch (ex) {
      console.warn("[NFC Read] [ERR] Failed Reading Mifare: ", ex);
      _cleanup();
    }
  }
  
  function _cleanup() {
    NfcManager.cancelTechnologyRequest().catch(() => 0);
  }

readNdef

  1. iPhone 可讀取有資料之標籤
import NfcManager, { NfcEvents } from "react-native-nfc-manager";

function readNdef() {
    const cleanUp = () => {
      NfcManager.setEventListener(NfcEvents.DiscoverTag, null);
      NfcManager.setEventListener(NfcEvents.SessionClosed, null);
    };
  
    return new Promise((resolve) => {
      let tagFound = null;
  
      NfcManager.setEventListener(NfcEvents.DiscoverTag, (tag) => {
        tagFound = tag;
        resolve(tagFound);
        NfcManager.setAlertMessageIOS("NDEF tag found");
        NfcManager.unregisterTagEvent().catch(() => 0);
      });
  
      NfcManager.setEventListener(NfcEvents.SessionClosed, () => {
        cleanUp();
        if (!tagFound) {
          resolve();
        }
      });
  
      NfcManager.registerTagEvent();
    });
  }

知識補充

手機NFC隱含攻擊弱點 掌握原理避免無線盜刷

MIFARE Classic 上配置 NDEF

NTAG215是最新的NFC Forum Tag類型2產品,主要面向電子產品應用(如連接切換、藍牙簡單配對、WiFi保護設置、設備認證、遊戲等),支援所有符合NFC標準的手機。

504位元組超大型存放區空間,用於NFC名片再也不用無法存儲完整資訊而煩惱了。

  • 封裝晶片:NTAG215
  • 除了提供大容量使用者記憶體(NTAG215為504位元組)
  • 工作頻率:13.56 MHz
  • 資料傳輸:106 kb/s
  • 資料完整性:16位元CRC、同位、位元編碼、位元數目
  • 工作距離:最遠100 mm(取決於不同參數,如場強和天線幾何尺寸)
  • 7位元組序號(ISO/IEC 14443-3 cascade level 2)
  • 基於ECC的原創簽名
  • 快速讀取命令
  • 用於自動序列化NDEF消息的UID ASCII鏡像
  • 讀取命令觸發自動NFC計數器
  • NFC計數器的ASCII鏡像可自動將實際讀取計數器值與NDEF消息相加
  • 開漏部署下具有可配置的現場檢測針腳
  • 睡眠模式可從相連的電子器件側禁用或重新使能NTAG21xF器件
  • EEPROM
  • 504位元組使用者可自由讀/寫區(222頁)
  • 4位元組已初始化功能性容器,具有一次可程式設計訪問位
  • 前16頁具有每頁現場可程式設計唯讀鎖定功能
  • 前16頁之後具有每兩頁(NTAG213F)或每16頁(NTAG216F)現場可程式設計唯讀鎖定功能
  • 可配置密碼保護具有可選失敗嘗試限值功能
  • 防修改支援功能性容器(CC)和鎖定位
  • 原創性檢驗支援ECC
  • 資料保存期為10年
  • 寫入操作耐受程度為100.000個週期

重點節錄

  1. 最近買了一堆NFC 的智能卡拿來測試,其中一張MIFARE Classic 的總是在iOS 上讀不出來,無論是以 Tag 模式還是NDEF 模式。於是通過一系列的研究,終於知道上怎麼一回事,然後成功地把一個MIFARE Classic 卡配置成了NDEF。
  2. 背景知識 NFC 有很多協議,其中MIFARE Classic 基於ISO 14443-3 Type A 標準,裡面有一些MIFARE 的命令。通過這些命令,就可以控制MIFARE Classic 卡的內容。
  3. MIFARE 命令 為了向MIFARE Classic 卡發送命令,首先需要一個ISO 14443-3 Type A 的接口,Android 的NfcA 或者libnfc 都提供了接口。這裡發送的命令實際上會再經過一層解析、用CRYPTO1 算法加密(猜測是讀卡器做的?不是很確定),不過對應用程序來說是透明的。
  4. NDEF 是什麼 NDEF 實際上是比較高層次的數據,就像HTML ,表示了一個格式化的數組數據,數組的元素可能是文本、URI 等等。它是由若干個Record 組成的。一個Record 如下: 03 0B 01 07 54 02 65 6E 61 62 63 64 首先是一個03 表示類型,然後是長度0x0B(11,從下一個字節開始數),接著是0x01 0x07 表示這似乎一個Well Known 類型的Record,內容的長度為7,0x54(ASCII T)表示這是文本格式,0x02 表示編碼是UTF-8,0x65 0x6E (ASCII “en”) 表示語言是英語,之後的0x61 0x62 0x63 0x64 (ASCII “abcd”) 就是文本內容。 很多個record 連起來,最終一個0xFE 表示結束,這就是完整的NDEF 信息了。
  5. NFC Information Technology
    1. NDEF(NFC Data Exchange Format)技術規格- 制訂合乎NFC論壇定義、規範的NFC裝置(Device)、NFC標籤(Tag)的共通資料格式(common data format)。

NFC Tags

‼️要製作 Amiibo 只能使用 Ntag215款‼️ NFC 標籤貼紙,可使用手機讀取寫入(型號需支援NFC)。要自製 Amiibo 可以使用,需搭配下載 tagmo (使用說明網路上查得到)。也可以搭配 iPhone 設定捷徑時使用。

抗金屬款可以貼在金屬表面使用,較不易受到干擾。(普通款在金屬表面容易受到干擾,不一定感應的到)

Ntag213:144位元組 Ntag215:504位元組

215晶片可以比213晶片寫入更多資料喔。

訂閱研究文章

Get updates and learn from the best

More To Explore

Scroll to Top

hurry up !

軟體工程師培訓

限時免費報名中

藉由與「真實世界軟體專案」相同的技術、工具與開發流程,化簡成與商業機密無關、門檻較低更容易上手的「模擬專案」,讓你有機會在職場前輩的陪伴下,完成真槍實彈的練習,動手解決真實的問題,快速累積個人的經驗與作品,而不只是「學習技術」而已。