La Near Field Communication (NFC) rivoluzionerà a breve il modo di effettuare pagamenti, di accedere ai servizi di trasporto e interagire con gli oggetti. Basata sullo scambio di messaggi tra dispositivi in prossimità, la tecnologia NFC è disponibile su smartphone e la disponibilità di API per i principali ambienti consente agli sviluppatori di implementare soluzioni innovative. Questo talk, dopo una presentazione dello standard, illustra alcuni esempi pratici basati su Android, JME e Arduino.
3. Agenda
• Speaker
• NFC: Near Field Communication
• Scenari applicativi
• API Android
• API JME
• Dagli smartphone agli oggetti: Arduino
• Risorse, Q&A
Emanuele Di Saverio - Stefano Sanna 3
emanuele.disaverio | gerdavax AT gmail.com
4. Speaker (“Lei non sa chi sono io!”)
• Stefano Sanna
– Head of Android Lab @ Open Reply
• Emanuele Di Saverio
– Senior Design Technologist @ frog
Insieme hanno pubblicato “Android Programmazione Avanzata” per le Edizioni FAG
Milano in collaborazione con Samsung Italia
Emanuele Di Saverio - Stefano Sanna 4
emanuele.disaverio | gerdavax AT gmail.com
6. Near Field Communication
• È una tecnologia a radiofrequenza (13.56MHz) per la
comunicazione a corto raggio tra oggetti di tipo
– attivo: smartphone con chip 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
Emanuele Di Saverio - Stefano Sanna 6
emanuele.disaverio | gerdavax AT gmail.com
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/
Emanuele Di Saverio - Stefano Sanna 7
emanuele.disaverio | gerdavax AT gmail.com
8. NFC in numeri
• 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 dotati di chip NFC
Emanuele Di Saverio - Stefano Sanna 8
emanuele.disaverio | gerdavax AT gmail.com
9. Scenari applicativi
• Pagamento
• Sicurezza, controllo
accessi
• Ticketing
• Tracking di merci
• Gaming
• Medical
Google Wallet sample image
Emanuele Di Saverio - Stefano Sanna 9
emanuele.disaverio | gerdavax AT gmail.com
10. riter
Modalità operative e r/w
read Tag by TI
peer-to-peer
Samsung Nexus S
card
emu
latio
n ACR122U
USB Reader
Samsung Galaxy Nexus
Emanuele Di Saverio - Stefano Sanna 10
emanuele.disaverio | gerdavax AT gmail.com
11. Modalità operative per piattaforma
Java Micro Windows
BlackBerry Android Symbian bada iOS
Edition Phone
reader JSR 257 2.3.x iOS 5? WP 8?
writer
API
P2P proprietarie
4.0.x iOS 5? WP 8?
card JSR 257
API privata iOS 5? WP 8?
emulation JSR 177
Emanuele Di Saverio - Stefano Sanna 11
emanuele.disaverio | gerdavax AT gmail.com
12. Alcuni tipi di tag
Emanuele Di Saverio - Stefano Sanna 12
emanuele.disaverio | gerdavax AT gmail.com
13. Si fa presto a dire tag...
Tecnologie
Tipi NFC
Prodotti
http://www.androidavanzato.it
Emanuele Di Saverio - Stefano Sanna 13
emanuele.disaverio | gerdavax AT gmail.com
14. 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
Emanuele Di Saverio - Stefano Sanna 14
emanuele.disaverio | gerdavax AT gmail.com
16. Chip NXP PN65N
NFC su Android all’interno di un Nexus S
• Prima API introdotta sulla API 2.3, Nexus S
– Reader/writer
– “prototipo” di supporto P2P
• Consolidamento API in
Ice Cream Sandwich
– NFC Push
Emanuele Di Saverio - Stefano Sanna 16
emanuele.disaverio | gerdavax AT gmail.com
17. 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
Emanuele Di Saverio - Stefano Sanna 17
emanuele.disaverio | gerdavax AT gmail.com
18. android.nfc (reader/writer)
• NfcManager
– servizio di sistema che fornisce un riferimento all'NfcAdapter
• NfcAdapter
– modella il modulo NFC del terminale. È utilizzato per l’accesso al Foreground Dispatching
System
• NdefMessage
– rappresenta l'unità elementare di comunicazione tra dispositivi NFC.
• NdefRecord
– l'informazione atomica contenuta in un NdefMessage, costituita da payload e metadati
• Tag
– modella il tag letto dal dispositivo e consente di conoscerne le technology associate
Emanuele Di Saverio - Stefano Sanna 18
emanuele.disaverio | gerdavax AT gmail.com
19. 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
Emanuele Di Saverio - Stefano Sanna 19
emanuele.disaverio | gerdavax AT gmail.com
20. 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" />
Emanuele Di Saverio - Stefano Sanna 20
emanuele.disaverio | gerdavax AT gmail.com
21. 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)
Emanuele Di Saverio - Stefano Sanna 21
emanuele.disaverio | gerdavax AT gmail.com
22. 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)
Emanuele Di Saverio - Stefano Sanna 22
emanuele.disaverio | gerdavax AT gmail.com
23. 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
Emanuele Di Saverio - Stefano Sanna 23
emanuele.disaverio | gerdavax AT gmail.com
24. Logica di dispatching dell’Intent
http://developer.android.com/guide/topics/nfc/nfc.html
Emanuele Di Saverio - Stefano Sanna 24
emanuele.disaverio | gerdavax AT gmail.com
25. 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
Emanuele Di Saverio - Stefano Sanna 25
emanuele.disaverio | gerdavax AT gmail.com
26. 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>
Emanuele Di Saverio - Stefano Sanna 26
emanuele.disaverio | gerdavax AT gmail.com
27. IntentFilter per TECH_DISCOVERED
Occorre indicare l’elenco
di tecnologie supportate
<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>
Emanuele Di Saverio - Stefano Sanna 27
emanuele.disaverio | gerdavax AT gmail.com
28. Elenco tecnologie per TECH_DISCOVERED
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
AND
<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">
AND
<tech-list>
OR
<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>
AND
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.Ndef</tech>
</tech-list>
</resources> Emanuele Di Saverio - Stefano Sanna 28
emanuele.disaverio | gerdavax AT gmail.com
29. IntentFilter per TAG_DISCOVERED
<activity android:name=".NFCReaderActivity">
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>
</activity>
Emanuele Di Saverio - Stefano Sanna 29
emanuele.disaverio | gerdavax AT gmail.com
30. Foreground Dispatching
• Un’Activity in esecuzione può chiedere al di avere
prelazione sulle notifiche NFC:
//...
mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
//... Con questi parametri è possibile specificare l’action da
ricevere e il filtro per tecnologie e metadati. Non specificare
@Override nulla equivale ad un’action TAG_DISCOVERED
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);
} Emanuele Di Saverio - Stefano Sanna 30
emanuele.disaverio | gerdavax AT gmail.com
31. È 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
}
}
Emanuele Di Saverio - Stefano Sanna 31
emanuele.disaverio | gerdavax AT gmail.com
32. 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(); Emanuele Di Saverio - Stefano Sanna 32
emanuele.disaverio | gerdavax AT gmail.com
33. 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");
}
Emanuele Di Saverio - Stefano Sanna 33
emanuele.disaverio | gerdavax AT gmail.com
34. Application Record e Android Beam
• Android 4 introduce due interessanti novità:
– Application Record: 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)
– Android Beam implementa la modalità NFC Push che
permette lo scambio di messaggi NDEF tra due terminali. È
supportata nativamente da alcune app di sistema
DEMO BROWSER
Emanuele Di Saverio - Stefano Sanna 34
emanuele.disaverio | gerdavax AT gmail.com
36. 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
Emanuele Di Saverio - Stefano Sanna 36
emanuele.disaverio | gerdavax AT gmail.com
37. Arduino MEGA + MFRC522
Emanuele Di Saverio - Stefano Sanna 37
emanuele.disaverio | gerdavax AT gmail.com
38. Lettura dell’ID di un tag MIFARE
int count = 0;
Imposta il chip RFID in modalità
void setup() { lettura automatica dell’ID del tag
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(":");
}
}
Emanuele Di Saverio - Stefano Sanna 38
} emanuele.disaverio | gerdavax AT gmail.com
40. Alcuni dei terminali NFC venduti in Italia
Nokia 603 (JME)
Nokia 6131 NFC (JME)
Nokia N9 (MeeGo)
Samsung
Galaxy S II NFC
Sony Xperia S
(Android)
Samsung Samsung Galaxy
BlackBerry 9380 BlackBerry 9900 Samsung S5230N (JME)
Nexus S (Android) Nexus (Android)
Emanuele Di Saverio - Stefano Sanna 40
emanuele.disaverio | gerdavax AT gmail.com
41. Dove acquistare tag e lettori
• SmartCardFocus
– http://www.smartcardfocus.com
• ebay!
Emanuele Di Saverio - Stefano Sanna 41
emanuele.disaverio | gerdavax AT gmail.com
42. Bibliografia
• Near Field Communication:
from theory to practice
Vedat Coskun, Kerem Ok, Busra Ozdenizci
Wiley
• Android Programmazione Avanzata
Emanuele Di Saverio, Stefano Sanna
Edizioni FAG Milano
Emanuele Di Saverio - Stefano Sanna 42
emanuele.disaverio | gerdavax AT gmail.com
43. Contatti
• Emanuele Di Saverio
– emanuele.disaverio AT gmail DOT com
– @hazam
• Stefano Sanna
– gerdavax AT gmail DOT com
– @gerdavax
– http://www.gerdavax.it
Emanuele Di Saverio - Stefano Sanna 43
emanuele.disaverio | gerdavax AT gmail.com