UNPKG

@stealify/connect-nfc-pcsc

Version:

Easy reading and writing NFC tags and cards

155 lines (130 loc) 3.71 kB
// Loading Config import importJson from '@stealify/import-json'; let MESSAGE; const CONFIG = importJson('/etc/connect.json') || importJson('/etc/connect-nfc-pcsc') || { data:{ WEBSOCKET_SERVER_ADDRESS: process.env.WEBSOCKET_SERVER_ADDRESS, CHANNEL: process.env.CHANNEL }, path:'ENVIRONMENT' }; let WEBSOCKET_SERVER_ADDRESS, CHANNEL; if (CONFIG) { MESSAGE = 'Using config '+CONFIG.path; WEBSOCKET_SERVER_ADDRESS = CONFIG.data.WEBSOCKET_SERVER_ADDRESS; CHANNEL= CONFIG.data.CHANNEL; } else { console.log('Create a config read the README.md'); process.exit(1); } console.log(MESSAGE); console.log(`Starting at ${WEBSOCKET_SERVER_ADDRESS} on ${CHANNEL}`); // Rest Code import makeDebug from 'debug'; import NFC from './NFC'; import Reader, { TAG_ISO_14443_3, TAG_ISO_14443_4, KEY_TYPE_A, KEY_TYPE_B, CONNECT_MODE_CARD, CONNECT_MODE_DIRECT } from './Reader'; import ACR122Reader from './ACR122Reader'; import { UNKNOWN_ERROR, FAILURE, CARD_NOT_CONNECTED, OPERATION_FAILED, BaseError, TransmitError, ControlError, ReadError, WriteError, LoadAuthenticationKeyError, AuthenticationError, ConnectError, DisconnectError, GetUIDError } from './errors'; import io from 'socket.io-client'; const socket = io(WEBSOCKET_SERVER_ADDRESS); import socketio from '@feathersjs/socketio-client'; const connection = socketio(socket, { timeout: 2000 }); import feathers from '@feathersjs/feathers'; const client = feathers() .configure(connection); const cardService = client.service('cards'); const nfc = new NFC(); // optionally you can pass logger nfc.on('reader', (reader) => { makeDebug('connect-nfc-pcsc')(reader.reader.name, 'device connected'); // needed for reading tags emulated with Android HCE // custom AID, change according to your Android for tag emulation // see https://developer.android.com/guide/topics/connectivity/nfc/hce.html reader.aid = 'F222222222'; reader.on('card', toggleCard); reader.on('card.off', toggleCard); reader.on('error', err => { makeDebug('connect-nfc-pcsc')(reader.reader.name,'error =>',err); process.exit(err); }); reader.on('end', () => { makeDebug('connect-nfc-pcsc')(reader.reader.name, 'device disconnected'); }); }); nfc.on('error', err => { makeDebug('connect-nfc-pcsc')('error =>',err); process.exit(err); }); function toggleCard(card) { // card is object containing following data // [always] String type: TAG_ISO_14443_3 (standard nfc tags like Mifare) or TAG_ISO_14443_4 (Android HCE and others) // [always] String standard: same as type // [only TAG_ISO_14443_3] String uid: tag uid // [only TAG_ISO_14443_4] Buffer data: raw data from select APDU response cardService.get(card.uid) // Automatic Register the Card for Usage. .then((existingCard)=>{ if (!existingCard) { existingCard = cardService.create(card) .then(()=>{ return cardService.get(card.uid); }); } return existingCard; }) // Update the card to reflect Channel .then((existingCard)=>{ if (existingCard.channel === CHANNEL) { existingCard.channel = ''; } else { existingCard.channel = CHANNEL; } cardService.update(existingCard); }); } export { NFC, Reader, TAG_ISO_14443_3, TAG_ISO_14443_4, KEY_TYPE_A, KEY_TYPE_B, CONNECT_MODE_CARD, CONNECT_MODE_DIRECT, ACR122Reader, UNKNOWN_ERROR, FAILURE, CARD_NOT_CONNECTED, OPERATION_FAILED, BaseError, TransmitError, ControlError, ReadError, WriteError, LoadAuthenticationKeyError, AuthenticationError, ConnectError, DisconnectError, GetUIDError };