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.
1. Introduzione ad NFC
Stefano Sanna
Guest seminar del corso “Applicazioni per dispositivi mobili”
L’Aquila, 11 Giugno 2012
2. Agenda
• Presentazioni :-)
• Near Field Communication
• Breve panoramica sull’application model di Android
• NFC API di Android
• Bibliografia
• Contatti
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
3. 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 :-)
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
4. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
5. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
6. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
7. 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/
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
8. 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)
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
9. Modalità operative
Tag by TI
r/w riter
e
read
peer-to-peer
Samsung Nexus S
card
emu
latio
n
Samsung Galaxy Nexus
ACR122U
USB Reader
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
10. 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”
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
11. Modalità operative
Java Micro Windows
BlackBerry Android Symbian bada iOS
Edition 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 JSR 257
OS7 API privata iOS 6? WP 8?
emulation JSR 177
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
12. Scenari applicativi
• Pagamento
• Sicurezza e controllo
accessi
• Ticketing
• Tracking di merci
• Gaming
• Social
• Medical
Google Wallet sample image
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
13. Alcuni tipi di tag
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
14. Si fa presto a dire tag...
Tecnologie
Tipi NFC
Prodotti
http://www.androidavanzato.it
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
15. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
17. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
18. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
19. 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); Apre il browser
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "http://www.repubblica.it");
startActivity(intent);
Consente di scegliere con quale app “inviare” il testo
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
20. NFC su Android
• Prima API introdotta sulla API 2.3, Nexus S
- Reader/writer Chip NXP PN65N
all’interno di un Nexus S
- “prototipo” di supporto P2P
• Consolidamento API in
Ice Cream Sandwich
- NFC Push
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
21. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
22. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
23. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
24. 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" />
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
25. 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)
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
26. 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)
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
27. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
28. Logica di dispatching dell’Intent
http://developer.android.com/guide/topics/nfc/nfc.html
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
29. 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 stack
NFC 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
30. 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>
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
31. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
32. Elenco tecnologie per TECH_DISCOVERED
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
AND
<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>
AND
OR
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
</tech-list>
</resources> 32
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
AND
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources>
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
33. IntentFilter per TAG_DISCOVERED
<activity android:name=".NFCReaderActivity">
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>
</activity>
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
34. Foreground Dispatching
• Un’Activity in esecuzione può chiedere al sistema di
avere prelazione sulle notifiche NFC:
//...
mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
//...
@Override
public 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 Guest seminar “Introduzione ad NFC”
Corso “Applicazioni per dispositivi mobili”- TAG_DISCOVERED
35. È ora di leggere un tag!
@Override
public 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
}
}
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
36. 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();
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
37. 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");
}
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
38. 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();
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
39. 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]
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
41. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
42. Arduino MEGA + MFRC522
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
43. Lettura dell’ID di un tag MIFARE
int count = 0; Imposta il chip RFID in modalità
lettura automatica dell’ID del tag
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(":");
}
}
}
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
45. X
La tecnologia si diffonde...
Questa slide è già
obsoleta! Tre nuovi
importanti terminali
sono ora disponibili
sul mercato italiano!!!
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
46. Alcuni dei terminali NFC venduti in Italia
Nokia 603
(Symbian)
Sony
Samsung Galaxy Xperia S Nokia N9 (MeeGo)
Samsung S III (Android) (Android)
Galaxy Nexus
Nokia 6131 Samsung (Android)
NFC (JME) Galaxy S II NFC
Samsung S5230N
(JME)
Samsung Galaxy
BlackBerry 9380 BlackBerry 9900
HTC One X Mini 2 (Android)
Samsung
Nexus S
(Android) Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
47. Dove acquistare tag e lettori
• SmartCardFocus
- http://www.smartcardfocus.com
• ebay!
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
48. 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
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
49. Contatti
• gerdavax AT gmail DOT com
• @gerdavax
• http://www.gerdavax.it
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”
50. 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/
Corso “Applicazioni per dispositivi mobili”- Guest seminar “Introduzione ad NFC”