NFC: tecnologia e applicazioni

Post on 13-May-2015

3.217 views 2 download

Tags:

Transcript of NFC: tecnologia e applicazioni

NFC: tecnologia e applicazioni

Stefano Sanna

gerdavax AT gmail DOT com

Emanuele Di Saverio

emanuele.disaverio AT gmail DOT com

DEMO

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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 Sannaemanuele.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

NFCNear Field Communication

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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.org6

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Principio di funzionamentoIl componente attivo emette uncampo 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

7

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

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

8

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Scenari applicativi• Pagamento• Sicurezza, controllo

accessi• Ticketing• Tracking di merci• Gaming• Medical

9

Google Wallet sample image

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Modalità operative

10

reader/writer

card emulation

peer-to-peer

Samsung Nexus S

Tag by TI

ACR122U USB Reader

Samsung Galaxy Nexus

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Modalità operative per piattaforma

11

Java Micro Edition BlackBerry Android Symbian bada iOS Windows

Phone

reader writer JSR 257 2.3.x iPhone 5? WP 8?

P2P API proprietarie 4.0.x iPhone 5? WP 8?

card emulation

JSR 257

JSR 177API privata iPhone 5? WP 8?

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Alcuni tipi di tag

12

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Si fa presto a dire tag...

13

http://www.androidavanzato.it

Tecnologie

Tipi NFC

Prodotti

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

14

API Android

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

16

Chip NXP PN65N all’interno di un Nexus S

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Android NFC APIL’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

17

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

18

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

19

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

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

20

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

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

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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)

21

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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)

22

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

23

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Logica di dispatching dell’Intent

24

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

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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 leggetutti i manifest per individuare l'Activitypiù adatta a gestirlo; se più di di una è candidata, viene mostrata la finestra dell'Activity Chooser

25

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

26

<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 Sannaemanuele.disaverio | gerdavax AT gmail.com

IntentFilter per TECH_DISCOVERED

27

<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

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Elenco tecnologie per TECH_DISCOVERED

28

<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

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

IntentFilter per TAG_DISCOVERED

29

<activity android:name=".NFCReaderActivity">

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

</activity>

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

prelazione sulle notifiche NFC:

30

//...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 ad un’action TAG_DISCOVERED

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

È ora di leggere un tag!

31

@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 }}

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Lettura di un NDEF Message

32

// [...]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();

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

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Decodifica del payload RTD_TEXT

33

// [...]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 Sannaemanuele.disaverio | gerdavax AT gmail.com

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 BROWSER34

Dagli smartphone agli oggetti(extra)

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

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

36

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Arduino MEGA + MFRC522

37

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

Lettura dell’ID di un tag MIFARE

38

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

RISORSE

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

40

Alcuni dei terminali NFC venduti in Italia

Nokia 6131 NFC (JME)

Samsung S5230N (JME)Samsung

Nexus S (Android)Samsung Galaxy Nexus (Android)

Nokia 603 (JME)

Sony Xperia S (Android)

BlackBerry 9380 BlackBerry 9900

Nokia N9 (MeeGo)Samsung

Galaxy S II NFC

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

41

Dove acquistare tag e lettori• SmartCardFocus

– http://www.smartcardfocus.com

• ebay!

Emanuele Di Saverio - Stefano Sannaemanuele.disaverio | gerdavax AT gmail.com

42

Bibliografia• Near Field Communication:

from theory to practiceVedat Coskun, Kerem Ok, Busra OzdenizciWiley

• Android Programmazione AvanzataEmanuele Di Saverio, Stefano SannaEdizioni FAG Milano

Emanuele Di Saverio - Stefano Sannaemanuele.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

GRAZIE :-)