Successfully reported this slideshow.

WEBdeBS NFC Presentation

0

Share

Upcoming SlideShare
Whymca nfc presentation
Whymca nfc presentation
Loading in …3
×
1 of 67
1 of 67

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

WEBdeBS NFC Presentation

  1. 1. NFC Programming in Android Ishan Fernando @ifdo i.fernando@myti.it Myti s.r.l. www.myti.it
  2. 2. NFC • Comunicazione contactless • Nuova interazione utente • Sicurezza
  3. 3. NFC (Near Field Communication)
  4. 4. NFC (Near Field Communication) • E' una tecnologia wireless a corto raggio (< 10cm) • Si opera alla frequenza di 13,56MHz • Può raggiungere una velocità di trasmissione massima di 424 kbit/s
  5. 5. NFC (Near Field Communication) E' una evoluzione di RFID (Radio Frequency Identification)
  6. 6. RFID vs NFC RFID NFC estenzione di RFID distanze lunghe (3 ~ 100m) distanze corte (< 10cm) qualsiasi frequenza 13.56 MHz usa nei vari ambiti usa nellʼambito di sicurezza nei celluari
  7. 7. Storia
  8. 8. NDEF (NFC Data Exchange Format) NDEF è un formato di incapsulamento dei messaggi (dati) per scambiare informazioni via NFC.
  9. 9. NDEF (NFC Data Exchange Format) passive mode active mode Questo formato consente di scambiare informazioni  • tra due NFC Forum Devices  • tra un NFC Forum Device e un NFC Forum Tag.
  10. 10. NDEF (NFC Data Exchange Format) Message = n * Records Records =  Type + Size +  Payload (binary data)
  11. 11. NDEF (NFC Data Exchange Format) I messaggi NDEF possono essere di tre tipi :  URI  il contenuto è un link MIME  il contenuto è specificato da un mime type NFC-specific types  utilizzi specifici per diverse tecnologie http://www.nfc-forum.org/specs/spec_list/
  12. 12. NFC e NDEF summary NFC è una tecnologia NDEF è un formato di wireless a corto raggio che encapsulamento dei dati consente di creare una comunicazione bidirezionale
  13. 13. NFC Technology summary • NFC o Wireless a corto raggio (< 10cm) o Frequenza : 13,56MHz  o Velocità di trasmissione massima : 424 Kbit/s. o  E' una evoluzione di RFID • NDEF o Incapsulamento dei messaggi o NFC Forum Device <=> NFC Forum Device  o NFC Forum Device <=> NFC Forum Tag o Message = n * Records o Records = Type + Size + Payload (binary data) o Types: URI, MIME o NFC-specific types
  14. 14. Android
  15. 15. Android
  16. 16. Android Application Android Application AndroidManifest.xml Intents Activities Services Broadcast receivers Content providers
  17. 17. AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest ... >     <application android:icon="@drawable/app_icon.png" ... >         <activity android:name="com.example.project.ExampleActivity"                   android:label="@string/example_label" ... >         </activity>         ...     </application> </manifest> • Lʼapplicazione deve dichiarare tutti i suoi componenti in questo file. • Permessi, API level, caratteristiche hardware o software usate, altre libererie API.
  18. 18. Activities • Ogni Activity rappresenta un unico schermo con una interfaccia utente. • Ognuna è indipendente dalle altre. • UnʼActivity deve definire come main. • Ogni Activity puo far partire unʼaltra Activity. • Quando parte una nuova Activity quella precedente si ferma e si conserva dentro uno Stack. • Per creare un Activity dobbiamo estendere classe astratto Activity e suoi metodi.
  19. 19. Activities
  20. 20. Intents Intent Component name Action Data Category Extra Flags • Componenti di una applicazione (Activities, Services e Broadcast receivers) vengono attivati attraverso messaggi, chiamate Intents.
  21. 21. Intent Filters • Explicit vs Implicit • Per definire quali Intents (impiciti) deve accettare un componente.
  22. 22. Services • Per gestire operazioni lunghe in background senza intefaccia utente. • Servizi hanno due formi: Started e Bound
  23. 23. Services • Per gestire operazioni lunghe in background senza intefaccia utente. • Servizi hanno due formi: Started e Bound
  24. 24. Services • Per gestire operazioni lunghe in background senza intefaccia utente. • Servizi hanno due formi: Started e Bound
  25. 25. Services • Per gestire operazioni lunghe in background senza intefaccia utente. • Servizi hanno due formi: Started e Bound
  26. 26. Summary • AndroidManifest.xml definice tutti i componenti dellʼapplicazione. • Ogni schermata dellʼapplicazione è unʼActivity. • Intents sono i messaggi che avviano i componenti. • Usando Intents Filters si possono filtrare Intents non desiderati. • Se ci sono operazioni lunghe che non richiedono interfaccia utente si possono usare i Services.
  27. 27. NFC e Android
  28. 28. NFC e Android summary • Dichiarazione permessi, Intents e Intent filters in Manifest • Dispatch systems o Intent Dispatch System o Foreground Dispatch System • Codice: lettura di un tag NDEF • Codice: scrittura di un tag NDEF • Codice: Foreground dispatch system • Codice: Device to Device (Beam)
  29. 29. AndroidManifest • Dichiarazione Activities • Dichiarazione Intents • Dichiarazione Intent filters • Permessi • API level • Caratteristiche hardware
  30. 30. Discover NDEF Tag - Intent filter AndroidManifest.xml ... <activity>   ...   <intent-filter>     <action          android:name="android.nfc.action.NDEF_DISCOVERED"/>     <category          android:name="android.intent.category.DEFAULT"/>     <data          android:mimeType="text/plain" />   </intent-filter>   ... </activity> ...
  31. 31. Discover NDEF Tag - Permessi AndroidManifest.xml ... <uses-permission         android:name="android.permission.NFC" /> <uses-sdk          android:minSdkVersion="10"/> <uses-feature          android:name="android.hardware.nfc"          android:required="true" /> ...
  32. 32. NFC e Android - dispatch system • Maggior parte delle APIs sono basate su NDEF • The tag dispatch system
  33. 33. NFC e Android - dispatch system • Maggior parte delle APIs sono basate su NDEF • The tag dispatch system
  34. 34. Intent e Foreground Dispatch Systems Intent Dispatch System • dichiara i filtri nel Manifest • fa partire l'applicazione anche se è spenta Foreground Dispatch System • dichiara i filtri mentre in esecuzione • gestione esclusiva per i tag richiesti
  35. 35. NDEF Tag - Reading public class MyNFCActivity extends Activity {    @Override    public void onNewIntent(Intent intent) {      Parcelable[] raw = intent.getParcelableArrayExtra(         1         NfcAdapter.EXTRA_NDEF_MESSAGES);     NdefMessage message = (NdefMessage) raw[0];  2     NdefRecord record = message.getRecords()[0];      byte[] payload = record.getPayload();      ...   } }
  36. 36. NDEF Tag - Reading 1 Parcelable[] raw = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); • Prendiamo il tag toccato dallʼIntent ricevuto.
  37. 37. NDEF Tag - Reading 2 NdefMessage message = (NdefMessage) raw[0];  NdefRecord record = message.getRecords()[0];  byte[] payload = record.getPayload(); • Prendiamo il primo record del primo messaggio. • Leggiamo il payload del record.
  38. 38. NDEF Tag - Writing public class MyNFCActivity extends Activity {   @Override   public void onNewIntent(Intent intent) {     Tag t = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 1     Ndef ndef = Ndef.get( t );     ndef.connect();     final byte[] data = …;     NdefRecord record = new NdefRecord(             NdefRecord.TNF_MIME_MEDIA, 2             "text/plain".getBytes(),             new byte[0],             data);     NdefRecord[] records = new NdefRecord[]{record}; 3     NdefMessage message = new NdefMessage( records );         ndef.writeNdefMessage(message);   } }
  39. 39. NDEF Tag - Writing 1 Tag t = intent.getParcelableExtra( NfcAdapter.EXTRA_TAG); Ndef ndef = Ndef.get( t ); ndef.connect();      • Prendiamo il tag toccato dallʼIntent ricevuto. • Creiamo una istanza Ndef usando quel tag.
  40. 40. NDEF Tag - Writing 2 final byte[] data = …; NdefRecord record = new NdefRecord( NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), new byte[0], data); • Creiamo un record Ndef inserendo i nostri dati come MIME type text/plain.
  41. 41. NDEF Tag - Writing 3 NdefRecord[] records =  new NdefRecord[]{record}; NdefMessage message = new NdefMessage( records );     ndef.writeNdefMessage(message); • Incapsuliamo il record appena creato dentro un messaggio Ndef. • Scriviamo il nostro messaggio sul tag usando lʼinstanza di Ndef che abbiamo creato prima.
  42. 42. Foreground dispatch public class MyNFCActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ Intent i = new Intent(this, getClass()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[] {ndef}; techListsArray = new String[][] { new String[] { NfcF.class.getName() } }; } @Override public void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } @Override public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); } @Override public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //do something with tagFromIntent } }
  43. 43. Foreground dispatch public class MyNFCActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ Intent i = new Intent(this, getClass()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[] {ndef}; techListsArray = new String[][] { new String[] { NfcF.class.getName() } }; } @Override public void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); } @Override public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); } @Override public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //do something with tagFromIntent } }
  44. 44. Foreground dispatch public void onCreate(Bundle savedInstanceState){ Intent i = new Intent(this, getClass()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 1 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); 2 } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[] {ndef}; 3 techListsArray = new String[][] { new String[] { NfcF.class.getName() } }; }
  45. 45. Foreground dispatch 1 Intent i = new Intent(this, getClass()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); • Usando questo sistema popola i dati del tag quando viene scansionato.
  46. 46. Foreground dispatch 2 IntentFilter ndef = new IntentFilter( NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } • Filtro che accetta tutti i Mime types.
  47. 47. Foreground dispatch 3 intentFiltersArray = new IntentFilter[] {ndef}; techListsArray = new String[][] { new String[] { Ndef.class.getName() } }; • Teniamo i filtri salvati in una variabile globale per usarli quando abilitiamo dispatch system. • Impostiamo anche unʼarray con le technologie tag che lʼapplicazione vuole gestire.
  48. 48. Foreground dispatch public class MyNFCActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ Intent i = new Intent(this, getClass()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[] {ndef}; techListsArray = new String[][] { new String[] { NfcF.class.getName() } }; } @Override public void onPause() { 1 super.onPause(); mAdapter.disableForegroundDispatch(this); } @Override public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); } 2 @Override public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //do something with tagFromIntent 3 } }
  49. 49. Foreground dispatch public class MyNFCActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState){ Intent i = new Intent(this, getClass()); i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0); IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[] {ndef}; techListsArray = new String[][] { new String[] { NfcF.class.getName() } }; } @Override public void onPause() { 1 super.onPause(); mAdapter.disableForegroundDispatch(this); } @Override public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray); } 2 @Override public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //do something with tagFromIntent 3 } }
  50. 50. Foreground dispatch 1 @Override public void onResume() { super.onResume(); NfcAdapter.getDefaultAdapter(this) .enableForegroundDispatch( this, pendingIntent, intentFiltersArray, techListsArray); } • Abilitiamo foreground dispatch system quando lʼActivity prende il controllo.
  51. 51. Foreground dispatch 2 @Override public void onPause() { super.onPause(); NfcAdapter.getDefaultAdapter(this) .disableForegroundDispatch(this); } • Disabilitiamo foreground dispatch system quando lʼActivity perde il controllo.
  52. 52. Foreground dispatch 3 @Override public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra( NfcAdapter.EXTRA_TAG); //do something with tagFromIntent } • Riceviamo lʼIntent allo stesso modo di intent dispatch system.
  53. 53. Device to Device • Scambiare dati tra due device Android. • Entrambi i dispositivi deve avere lʼActivity in foreground e schermo sbloccato. • Un messaggio NDEF alla volta. • Basta utilizzare uno dei metodi – setNdefPushMessage() – setNdefPushMessageCallback()
  54. 54. Device to Device setNdefPushMessage() public class MyNFCActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { NdefMessage msg = new NdefMessage(...); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcAdapter.setNdefPushMessage(msg, this); } }
  55. 55. Device to Device setNdefPushMessageCallback() public class MyNFCActivity extends Activity implements CreateNdefMessageCallback { @Override public void onCreate(Bundle savedInstanceState) { 1 mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcAdapter.setNdefPushMessageCallback(this, this); } @Override public NdefMessage createNdefMessage(NfcEvent event) { 2 NdefMessage msg = new NdefMessage(...); return msg; } }
  56. 56. Device to Device 1 @Override public void onCreate( Bundle savedInstanceState) { mNfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcAdapter.setNdefPushMessageCallback( this, this); } Abilitiamo Beam usando il metodo setNdefPushMessageCallback passando come parametri lʼActivity ed una implementazione di NfcAdapter.CreateNdefMessageCallback.
  57. 57. Device to Device 2 @Override public NdefMessage createNdefMessage( NfcEvent event) { NdefMessage msg = new NdefMessage(...); return msg; } Creiamo un messaggio da spedire quando avvicina un device e parte la comunicazione.
  58. 58. NFC e Android summary • Dichiarazione permessi, Intents e Intent filters in Manifest • Dispatch systems o Intent Dispatch System o Foreground Dispatch System • Codice: lettura di un tag NDEF • Codice: scrittura di un tag NDEF • Codice: Foreground dispatch system • Codice: Device to Device (Beam)
  59. 59. Safe at work
  60. 60. Safeatwork Sicurezza sul lavoro e supporto alla certificazione Usato dai manutentori e operai specializzati Backend web per la gestione dei dati Nata su j2me nel 2008 ( Nokia 6212 ) www.safeatwork.it
  61. 61. Safeatwork Download contenuti  • Schede tecniche • Istruzioni operative Accesso ai contenuti basato su NFC Upload delle attività • cosa ha fatto l'operatore? • che procedure ha eseguito?
  62. 62. Safeatwork Download contenuti  • Schede tecniche • Istruzioni operative Accesso ai contenuti basato su NFC Upload delle attività • cosa ha fatto l'operatore? • che procedure ha eseguito?
  63. 63. Safeatwork L'interazione prevede prevalentemente l'utilizzo della lettura dei tag per accedere ai contenuti.
  64. 64. Safeatwork L'interazione prevede prevalentemente l'utilizzo della lettura dei tag per accedere ai contenuti.
  65. 65. Safeatwork in action
  66. 66. Safeatwork in action
  67. 67. Grazie Android NFC developer documentation http://developer.android.com/guide/topics/nfc/ Nfc Forum http://www.nfc-forum.org/home/ Myti www.myti.it Ishan Fernando @ifdo i.fernando@myti.it

×