NFC Emulator

A Flutter plugin to emulate the NFC tag. Supported only on Android (Apple is being Apple).

This NFC Emulator plugin was written mainly for the CIDRON reader (the AID is in the example): http://www.civintec.com/info_22.aspx?itemid=35

This kind of reader is using peer-to-peer mode to exchange data, which includes the AES encrypted card UID.

Note: It is impossible for Android to emulate an NFC tag with constant UID in host card emulation mode, please refer to stackoverflow.com/questions/46484272/emulate-nfc-card-with-selected-uid-on-android and stackoverflow.com/questions/9662979/how-to-fix-uid-in-nfc.

Installing

Add to pubspec.yaml:

dependencies:
  nfc_enumator: <latest version>

Android Setup

Add NFC permissions to Android package's manifest file AndroidManifest.xml:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
<uses-feature android:name="android.hardware.nfc.hce" android:required="false" />
<uses-permission android:name="android.permission.VIBRATE" />

And aid_list.xml to the android/app/src/main/res/xml folder (create if not exist). See example project

File: aid_list.xml ``` ```

Add emulator service with such metadata to AndroidManifest.xml:

<service
	android:name="io.flutter.plugins.nfc_emulator.NfcEmulatorService"
	android:exported="true"
	android:permission="android.permission.BIND_NFC_SERVICE">

	<!-- Intent filter indicating that we support card emulation. -->
	<intent-filter>
		<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
		<category android:name="android.intent.category.DEFAULT" />
	</intent-filter>
	<!--
			Required XML configuration file, listing the AIDs that we are emulating cards
			for. This defines what protocols our card emulation service supports.
	-->
	<meta-data
		android:name="android.nfc.cardemulation.host_apdu_service"
		android:resource="@xml/aid_list" />
</service>

Example of Usage

Check NFC Status:

// Check NFC Status
int nfcStatus = await NfcEmulator.nfcStatus;

Start NFC Emulator

// Start NFC emulator with AID, cardUid, and optional AES key:
await NfcEmulator.startNfcEmulator("666B65630001", "cd22c716", "79e64d05ed6475d3acf405d6a9cd506b");

Stop NFC Emulator

// Stop NFC emulator:
await NfcEmulator.stopNfcEmulator();

See more at: example project

Libraries

nfc_emulator