NFC Type A Emulator is an Android application for emulating NFC Type A cards (ISO 14443-3A / ISO 14443-4A) using compatible devices. It lets developers, researchers, and hobbyists test NFC readers without requiring the original physical card. The app exposes an HTTP API that can be driven from the device itself or from the included Node.js external server, and both accept a single request containing multiple command groups.
- Android device with NFC capability (Android 5.0 or higher).
- Android Studio or the Android SDK with Java 11+.
./gradlew assembleDebugThe generated APK will be located in app/build/outputs/apk/debug/.
You can also open the project in Android Studio and run it directly on a connected device.
- Install the app on an NFC-capable Android device.
- Enter up to two Application Identifiers (AIDs) in the provided fields.
- Toggle NFC emulation from the Communication screen when you need to disable or re-enable all NFC communication (including Android's native wait frames).
- Tap Save AIDs and hold the device near an NFC reader.
- The communication log at the bottom shows APDU requests (red) and responses (green), along with scenario state changes and NFC activation or deactivation events.
The app exposes a lightweight HTTP API that allows remote control over AIDs,
logging and scenarios. Enable the server from the Server screen and note
the device's IP address and chosen port. Commands are sent as POST requests
with a JSON body to http://<DEVICE_IP>:<PORT>/.
The current application status can be queried with GET /STATUS, which
returns one of IDLE, READY, RUNNING, FINISHED, STOPPED, SILENCED
or ERROR.
Commands are grouped by top-level keys. A request may include any combination of
the following objects: Aid, Comm, Scenarios, Filters, and Reset.
Each object mirrors the fields described below. For compatibility, older
payloads that use a single Type field are still accepted.
Example combining AID registration and log clearing:
curl -X POST http://<DEVICE_IP>:<PORT>/ -H "Content-Type: application/json" \
-d '{"Aid":{"Add":"A0000002471001"},"Comm":{"Clear":true}}'For a broader example that registers AIDs, adds a scenario, applies a filter and
clears the log in one request, see
example-server/multi-command-request.json
and post it with:
curl -X POST http://<DEVICE_IP>:<PORT>/ -H "Content-Type: application/json" \
-d @example-server/multi-command-request.jsonManage registered Application Identifiers.
{
"Aid": {
"Add": ["A0000002471001", "A0000002471002"], // optional AIDs to add
"Remove": ["A0000002471003"], // optional AIDs to remove
"Clear": false, // set true to unregister all AIDs
"Enabled": true // set false to block all NFC comms
}
}Add and Remove accept either a single string or an array of strings.
Enabled toggles whether the phone responds to NFC readers. Disabling it removes the
registered AIDs until it is re-enabled.
Control the communication log and scenarios.
{
"Comm": {
"Clear": false, // clear the log when true
"Save": true, // save log to file when true
"Mute": false, // mute/unmute communication
"NfcEnabled": true, // toggle NFC emulation on the device
"CurrentScenario": "Start" // "Start", "Stop" or "Clear"
}
}NfcEnabled mirrors the toggle available on the Communication screen. When set
to false, the device will stop responding to NFC readers and log the change in
the server communication feed.
Requests receive a simple 200 OK response. Additional command types may be
introduced in future versions.
Create or manage scenarios.
Steps may be of type Select, which waits for an AID selection, or
RequestResponse, which returns a predefined response when a matching APDU
request is received. Use needsSelection to require that a Select step has
completed before the request is matched.
{
"Scenarios": {
"Add": [
{
"name": "MyScenario",
"steps": [
{
"name": "Select",
"type": "Select",
"aid": "F0010203040506",
"singleSelect": false
},
{
"name": "Ping",
"type": "RequestResponse",
"request": "00B0950000",
"response": "6A82",
"needsSelection": true
}
]
}
],
"Remove": ["OldScenario"], // optional names to remove
"Clear": false, // clear all scenarios when true
"Current": "MyScenario" // set current scenario
}
}Add and Remove accept arrays; Add may also be a single scenario object and Remove a single name.
A minimal Node.js implementation of this HTTP API is provided in
example-server/. POST / requests queue command payloads
and the app retrieves them by polling GET /. The server logs each request to
stdout so you can see when commands are queued and dispatched.
MainActivity– Compose UI and AID configuration.TypeAEmulatorService– Handles APDU commands from the NFC reader.CommunicationLog– Stores APDU exchanges for display.
Verbose debug logs are written to Logcat using tags like AidManager, ScenarioManager,
ServerConnMgr, InternalServer, ServerJsonHandler, TypeAEmulatorService,
CommunicationLog, and MainActivity. Use adb logcat to observe AID
registration, scenario execution, server traffic, and NFC APDU flow in real time.