Introduzione ad NFC

51
Introduzione ad NFC Stefano Sanna Guest seminar del corso “Applicazioni per dispositivi mobili” L’Aquila, 11 Giugno 2012

description

Guest seminar del corso "Applicazioni per dispositivi mobili" tenuto presso l'Università degli Studi dell'Aquila. Giugno 2012. Il seminario introduce i concetti fondamentali della tecnologia NFC e mostra l'utilizzo della modalità reader/writer in ambiente Android.

Transcript of Introduzione ad NFC

Page 1: Introduzione ad NFC

Introduzione ad NFCStefano Sanna

Guest seminar del corso “Applicazioni per dispositivi mobili”L’Aquila, 11 Giugno 2012

Page 2: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Agenda

• Presentazioni :-)

• Near Field Communication

• Breve panoramica sull’application model di Android

• NFC API di Android

• Bibliografia

• Contatti

Page 3: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Speaker

• Head of Android Lab @ Open Reply

• Mobile app developer (10+ years)- First app: 1999 on PSION 5MX!

• Technical Writer- Android Programmazione Avanzata (con E. Di Saverio; Ed. FAG)- Java Micro Edition (Hoepli)

• Pizza & Pasta lover :-)

Page 4: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Near Field Communication

• È una tecnologia a radiofrequenza (13.56MHz) per la comunicazione a corto raggio tra oggetti di tipo

- attivo: smartphone con chip ed API NFC o lettore USB connesso ad un computer

- passivo: tag (superficiale o embedded) associato ad un oggetto fisico

• NFC Forum: http://www.nfc-forum.org

Page 5: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

NFC vs Bluetooth• Bluetooth

- consente la comunicazione a corto raggio (pochi metri) ma ha una tempo di setup medio lungo (specie con pairing)

- permette il trasferimento dati ad alta velocità in modalità streaming

• NFC- NFC non richiede setup o pairing: la comunicazione è pressoché

istantanea- è orientato al trasferimento dati “one-shot”: in caso di necessità di

stream continuo si può passare ad un altro trasporto (Bluetooth o WiFi)

• NFC può essere utilizzato per automatizzare il pairing di due dispositivi Bluetooth

Page 6: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

NFC vs QR Code• QR Code

- sono praticamente “a costo zero” perché utilizzano tecnologie esistenti e diffusissime (stampa per la produzione e fotocamera dello smartphone per la lettura)

- l’utente “deve prendere la mira” verso l’oggetto da inquadrare

- non offrono alcuna protezione (crittografia asimmetrica) essendo totalmente passivi

- sono read-only

• NFC- richiede una tecnologia nuova (soprattutto sugli smartphone)

- la comunicazione non richiede setup particolare (touch&go)

- i tag possono avere funzionalità crittografiche

- i tag possono essere letti e scritti

Page 7: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Principio di funzionamento

• Il componente attivo emette un campo elettromagnetico che induce una corrente sul circuito del componente passivo. Tale corrente è sufficiente ad alimentare il microcontrollore a bordo, ricevere il dato, effettuare l’elaborazione e trasmettere una risposta

http://www.scienceprog.com/how-does-rfid-tag-technology-works/

Page 8: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Qualche numero

• Comunicazione a corto raggio- Distanza teorica: 10 cm - Distanza “pratica”: < 4 cm

• Velocità di comunicazione- Min: 106 Kbit/s - Max: 424 Kbit/s

• Diffusione:- 3.5 miliardi di smartcard MIFARE- oltre 40 milioni di reader desktop- circa 50 modelli di telefono/smartphone più diffusi dotati di

funzionalità NFC (hardware + software)

Page 9: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Modalità operative

reader/writer

card emulation

peer-to-peer

Samsung Nexus S

Tag by TI

ACR122U USB Reader

Samsung Galaxy Nexus

Page 10: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Modalità operative

• Reader/writer- lo smartphone legge e scrive un tag passivo, che può svolgere

funzioni di semplice identificazione, memorizzazione di dati o protezione di contenuti attraverso crittografia

• Peer-to-peer- due smartphone comunicano tra loro scambiando piccole quantità di

dati: una URL, un biglietto da visita, la configurazione Bluetooth

• Card emulation- lo smartphone è riconosciuto da un lettore esterno (collegato a PC

o un altro smartphone in modalità reader/writer) come un tag dotato di identificativo, memoria e funzioni crittografiche. In modalità Card Emulation lo smartphone può svolgere funzioni di carta di credito o di “mobile wallet”

Page 11: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Modalità operative

Java Micro Edition BlackBerry Android Symbian bada iOS Windows

Phone

reader writer JSR 257 OS7 2.3.x iOS 6? WP 8?

P2P API proprietarie OS7 4.0.x iOS 6? WP 8?

card emulation

JSR 257JSR 177

OS7 API privata iOS 6? WP 8?

Page 12: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Scenari applicativi

• Pagamento

• Sicurezza e controllo accessi

• Ticketing

• Tracking di merci

• Gaming

• Social

• MedicalGoogle Wallet sample image

Page 13: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Alcuni tipi di tag

Page 14: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Si fa presto a dire tag...

http://www.androidavanzato.it

Tecnologie

Tipi NFC

Prodotti

Page 15: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

NDEF: NFC Data Exchange Format• Formato di dati standard basato su dei NDEF

Message contenenti uno o più NDEF Record

• Per consentire alle app di gestire automaticamente il contenuto dei record, sono definiti alcuni tipi standard attraverso gli NFC RTD (Record Data Type):- Text e URI- Smart Poster- vCard

Page 16: Introduzione ad NFC

Android API

Page 17: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Android application model• Activity

- rappresenta(va) una unità di interazione utente di un’app

• Fragment- introdotti in Android 3, rappresentano unità atomiche di interazione

con l’utente. Più Fragment costituiscono la vista di una Activity

• Service- sono moduli applicativi indipendenti privi di UI. Sono eseguiti in

background e possono servire più applicazioni

• Broadcast Receiver- Ricevono messaggi broadcast inviati dal sistema o da altre app

• Content Provider- Forniscono accesso condiviso a sorgenti di dati

Page 18: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Intent

• Sono rappresentazioni astratte di:- azioni che l’utente vuole intraprendere (visualizzare una foto o

inviare un’email)- funzionalità che una applicazione vuol avviare (una Activity, un

Service...)- eventi propagati nel sistema operativo (è arrivato un SMS, lo stato

della batteria è cambiato)

• Sono costituiti da ACTION da compiere su DATA inviati come attributi

Page 19: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Intent• In base alla Action e ai dati associati all’Intent, il sistema

decide qual è il componente più adatto a svolgere l’azione richiesta

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.repubblica.it"));

startActivity(intent);

Intent intent = new Intent(Intent.ACTION_SEND);

intent.setType("text/plain");

intent.putExtra(Intent.EXTRA_TEXT, "http://www.repubblica.it");

startActivity(intent);

Apre il browser

Consente di scegliere con quale app “inviare” il testo

Page 20: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

NFC su Android

• Prima API introdotta sulla API 2.3, Nexus S- Reader/writer- “prototipo” di supporto P2P

• Consolidamento API inIce Cream Sandwich- NFC Push

Chip NXP PN65N all’interno di un Nexus S

Page 21: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Android NFC API

• L’API è organizzata in due package:

• android.nfc- contiene le classi di interfacciamento al chip NFC e di gestione di

messaggi e record NDEF

• android.nfc.tech- contiene le classi che modellano i singoli tipi di tag e tecnologie

supportate dalla piattaforma

Page 22: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

android.nfc (reader/writer)

• NfcManager- servizio di sistema che fornisce un riferimento all'NfcAdapter

• NfcAdapter- modella il modulo NFC del terminale

• NdefMessage- rappresenta l'unità elementare di comunicazione tra dispositivi NFC

• NdefRecord- l'informazione atomica contenuta in un NdefMessage, costituita da

payload e metadati

• Tag- rappresentazione generica del tag letto dal dispositivo

Page 23: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

android.nfc (P2P)

• NfcAdapter.CreateNdefMessageCallback- callback invocata quando la piattaforma chiede all'app di predisporre

un messaggio NDEF da inviare via NFC Push ad un altro terminale NFC

• NfcAdapter.OnNdefPushCompleteCallback- callback invocata quando l'invio di un messaggio NDEF è andato a

buon fine

• NfcEvent- incapsula (per ora) solo un riferimento all’NfcAdapter che ha

generato la richiesta di evento push

Page 24: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Permission• Per poter utilizzare l’API NFC è necessario dichiarare

la permission e richiedere la feature hardware sull’AndroidManifest dell’applicazione:

<uses-permission android:name="android.permission.NFC" />

<uses-feature android:name="android.hardware.nfc" android:required="true" />

Page 25: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

android.nfc.tech• TagTechnology

- È l'interfaccia comune a tutti i tipi di tag che espone i metodi per aprire e chiudere la connessione (necessaria per effettuare tutte le successive operazioni di lettura e di scrittura)

• Ndef, NdefFormatable (opzionale)- Forniscono accesso a tag (formattati e formattabili) conformi alla

specifica NDEF, indipendente dal tipo di tag e SCOS sottostante

• IsoDep, MifareClassic (opzionale), MifareUltralight (opzionale), NfcA, NfcB, NfcF, NfcV- Forniscono accesso a specifiche tecnologie di tag ed esportano

funzionalità di basso livello (ad esempio, authenticateSectorWithKeyA() su MifareClassic o getAtqa() su NfcA)

Page 26: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Note sul dispatching degli eventi NFC

• Gli eventi di lettura di tag NFC sono propagati attraverso Intent

• Tali Intent sono inviati esclusivamente alle Activity (no Service, no BroadcastReceiver)

• La scelta del target avviene attraverso Intent Filter

• Gli eventi NFC sono generati e propagati solo se il device ha lo schermo sbloccato (no “silent NFC” con lo smartphone in standby)

Page 27: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Tipi di eventi (ACTION) di lettura di tag

• NDEF_DISCOVERED- Il tag appena letto è conforme alla specifica NDEF e contiene dati al

proprio interno opportunamente formattati

• TECH_DISCOVERED- Il tag appena letto espone una o più tecnologie supportate da una

applicazione installata sul terminale

• TAG_DISCOVERED- Nessuna app è registrata su tag NDEF o su specifiche tecnologie: si

cerca di propagare l’evento generico

Page 28: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Logica di dispatching dell’Intent

http://developer.android.com/guide/topics/nfc/nfc.html

Page 29: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

IntentFilter sul manifest

• A seconda del tipo di evento a cui è interessata, una Activity dichiara nel manifest uno o più IntentFilter per una o più action tra NDEF_DISCOVERED, TECH_DISCOVERED e TAG_DISCOVERED.

• Alla lettura di un tag lo stackNFC legge tutti i manifest per individuare l'Activity più adatta a gestirlo; se più di di una è candidata, viene mostrata la finestra dell'Activity Chooser

Page 30: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

IntentFilter per NDEF_DISCOVERED

È necessario specificare il MIME Type del record desiderato (text/plain, application/vnd.myapp.feat, ...):

<activity android:name=".NFCReaderActivity">

<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <data android:mimeType="text/plain"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter>

</activity>

Page 31: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

IntentFilter per TECH_DISCOVERED

<activity android:name=".NFCReaderActivity">

<intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> </intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" />

</activity>

Occorre indicare l’elenco di tecnologie supportate

Page 32: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Elenco tecnologie per TECH_DISCOVERED

32

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NdefFormatable</tech> </tech-list> </resources>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>

OR

AN

DA

ND

AN

D

Page 33: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

IntentFilter per TAG_DISCOVERED

<activity android:name=".NFCReaderActivity">

<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>

</activity>

Page 34: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Foreground Dispatching• Un’Activity in esecuzione può chiedere al sistema di

avere prelazione sulle notifiche NFC:

//...mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);//...

@Overridepublic void onResume() { super.onResume();

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

mNfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);

}

Con questi parametri è possibile specificare l’action da ricevere e il filtro per tecnologie e metadati. Non specificare nulla equivale registrarsi per un’Action TAG_DISCOVERED

Page 35: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

È ora di leggere un tag!

@Overridepublic void onNewIntent(Intent intent) { Bundle bundle = intent.getExtras();

Tag tag = bundle.getParcelable(NfcAdapter.EXTRA_TAG); byte[] tagID = tag.getId(); // ID String id = byteToHex(tagID); // convertiamo l’ID in stringa...

// tech String[] techList = tag.getTechList(); for (String tech : techList) { addToUI(tech); // aggiungiamo la technology alla lista in UI }}

Page 36: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Lettura di un NDEF Message

// [...]Bundle bundle = intent.getExtras();Tag tag = bundle.getParcelable(NfcAdapter.EXTRA_TAG);

Ndef ndefTag = Ndef.get(tag); ndefTag.connect();

NdefRecord[] records = ndefTag.getNdefMessage().getRecords();

ArrayList<String> strings = new ArrayList<String>();

for (NdefRecord record : records) { byte[] payload = record.getPayload();

strings.add(decodeTextPayload(payload));}

ndefTag.close();

Page 37: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Decodifica del payload RTD_TEXT

• Il primo byte del payload contiene informazioni sull’encoding (UTF-8 o UTF-16) e sulla lunghezza del codice IANA della lingua del testo:

// [...]private String decodeTextPayload(byte[] payload) throws Exception { byte status = payload[0];

int languageCodeLenght = status & 0x3f;

return new String(payload, 1 + languageCodeLenght, payload.length - 1 - languageCodeLenght, "UTF-8");}

Page 38: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Scrittura di un tag con TNF_ABSOLUTE_URI

// [...]Bundle bundle = intent.getExtras();Tag tag = bundle.getParcelable(NfcAdapter.EXTRA_TAG);

Ndef ndefTag = Ndef.get(tag);

NdefRecord record = new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI , "http://www.repubblica.it".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]);

NdefMessage message = new NdefMessage(new NdefRecord[] { record });

ndefTag.connect();ndefTag.writeNdefMessage(message);ndefTag.close();

Page 39: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Application Record e Android

• Android 4 introduce due interessanti novità in ambito NFC:

- Android Application Record (AAR): consente di scrivere su un tag un record riconosciuto dal sistema operativo che consente di avviare automaticamente un’app (anche priva di funzionalità NFC) o scaricarla del Play Store (se non già installata)[DEMO: APPTAG]

- Android Beam: implementa la modalità NFC Push che permette lo scambio di messaggi NDEF tra due terminali. È supportata nativamente da alcune app di sistema e da un numero crescente di app di terze parti[DEMO BROWSER]

Page 40: Introduzione ad NFC

Dagli smartphone agli oggetti

Page 41: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Dagli smartphone agli oggetti: Arduino

• La disponibilità di chip NFC/RFID a basso costo compatibili con la specifica MIFARE consente di realizzare interessanti prototipi di “Internet of Things” in cui tag scritti da uno smartphone possono essere letti e riconosciuti da oggetti fisici

• Hardware “comodo” per sperimentare:- Arduino MEGA (1280 o 2560)- Elechouse SSRFID basato su MFRC522

Page 42: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Arduino MEGA + MFRC522

Page 43: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Lettura dell’ID di un tag MIFARE

int count = 0;

void setup() {Serial.begin(9600);Serial1.begin(9600);Serial1.write(0x02);pinMode(13, OUTPUT);

}

void loop() {if (Serial1.available()) {

Serial.print(Serial1.read(),HEX); //Display the Serial Number in HEX

count++;

if (count == 4) {Serial.println();count = 0;

} else {Serial.print(":");

}}

}

Imposta il chip RFID in modalità lettura automatica dell’ID del tag

Page 44: Introduzione ad NFC

Risorse

Page 45: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

La tecnologia si diffonde...

X Questa slide è già obsoleta! Tre nuovi importanti terminali sono ora disponibili

sul mercato italiano!!!

Page 46: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Alcuni dei terminali NFC venduti in Italia

Nokia 6131 NFC (JME)

Samsung S5230N (JME)

SamsungNexus S (Android)

Samsung Galaxy Nexus

(Android)

Nokia 603 (Symbian)

Sony Xperia S (Android)

BlackBerry 9380 BlackBerry 9900

Nokia N9 (MeeGo)

SamsungGalaxy S II NFC

Samsung Galaxy Mini 2 (Android)HTC One X

Samsung Galaxy S III (Android)

Page 47: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Dove acquistare tag e lettori

• SmartCardFocus- http://www.smartcardfocus.com

• ebay!

Page 48: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Bibliografia

• Near Field Communication: from theory to practice- Vedat Coskun, Kerem Ok, Busra Ozdenizci - Wiley Publishing 2011

• Android Developers- http://developer.android.com

• Android Programmazione Avanzata- E. Di Saverio, S. Sanna - Edizioni FAG Milano, 2012

Page 49: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Contatti

• gerdavax AT gmail DOT com

• @gerdavax

• http://www.gerdavax.it

Page 50: Introduzione ad NFC

Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”

Licenza

• Questo seminario è un adattamento del talk “NFC: tecnologia e applicazioni” di Emanuele Di Saverio e Stefano Sanna presentato al Codemotion 2012 a Roma

• Alcune immagini sono tratte dal libro “Android Programmazione Avanzata”; altre immagini sono di proprietà dei rispettivi titolari

• I contenuti originali di questa presentazione sono distribuiti su licenza Creative Commons - Attribution -NonCommercial - ShareAlike- http://creativecommons.org/licenses/by-nc-sa/3.0/

Page 51: Introduzione ad NFC

Grazie