CursoProgamacionNFC-Dia2

1,975 views
1,764 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,975
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

CursoProgamacionNFC-Dia2

  1. 1. Programación de aplicaciones NFC en android Jornada II
  2. 2. Índice – día 2 Características de los mensajes NFC – NDEF (NFC Data Exchange Format) – NFC RTD (NFC Record Type Definition) Android NFC API – Android Manifest – Paquete android.nfc – Tag Dispatch System – NFC Intents – NDEF Record Types Práctica 1
  3. 3. NDEF ¿Qué es? – Especificación que define el formato de encapsulamiento de mensajes para el intercambio de información en un enlace NFC. – Un mensaje NDEF es un mensaje binario: • ligero • encapsula varios registros
  4. 4. NDEF Message / NDEF Record Un mensaje NDEF contiene uno o varios registros:
  5. 5. NDEF Record Flags MB (Message Begin): Indica que es el primer NDEF record del mensaje. ME (Message End): Indica que es el último NDEF record del mensaje. CF (Chunk Flag): Indica que la información se encapsula en varios NDEF records. Todos los records menos el último deben llevar este flag activado. SR (Short Record): Se utiliza para indicar que la longitud del payload es un octeto (tamaño de payload menor de 255 bytes). Implica la ausencia de PAYLOAD LENGTH 3, 2, 1 IL (ID Length): Este flag a uno indica que la se incluye un campo de tamaño de ID en la cabecera. Su ausencia implica la no existencia del campo ID LENGTH y del campo ID
  6. 6. NDEF TNF Indica la estructura del campo type:
  7. 7. Record Type Definition (RTD) Tipos de registros reconocidos por el NFC Forum, que pueden ser incluidos en los mensajes NDEF. Son los tipos well-known type (TNF=0x01) – Texto – URI – SmartPoster – Control genérico – Firma digital Formato URN [RFC 2141] – urn:nfc:wkt:Sp
  8. 8. NDEF Fields TYPE LENGTH: Número de octetos dentro de TYPE. PAYLOAD LENGTH (0-3): Número de octetos dentro del PAYLOAD. ID LENTGH: Número de octetos dentro de ID. TYPE: Identifica el tipo de datos dentro de PAYLOAD.
  9. 9. NDEF Fields ID: Identificador en forma de URI. Sólo el primer registro lleva ID PAYLOAD: La estructura interna del payload es transparente para NDEF Terminator TLV opcional: 0xFE
  10. 10. Ejemplo NDEF Text 0xD1 0x01 0x0D 0x54 0x02 0x65 0x6E 0x65 D1-> 1101 0001 0x6A 0x65 0x72 0x63 ME, MB, SR =1 0x69 0x63 0x69 0x6F TNF = 001 (Well-known type) 0x31 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  11. 11. Ejemplo NDEF Text (II) 1 0 Type Length = 0x01 => 1byte Payload Length = 0x0D = > 13bytes Type = 0x54 => RTD TEXT Payload= 0x02 0x65 0x6E 0x65 0x6A 0x65 0x72 0x63 0x69 0x63 0x69 0x6F 0x31
  12. 12. Ejemplo NDEF Text (III)Analisis del payload : RTD TEXT 0x02 0x65 0x6E 0x65 0x6A 0x65 0x72 0x63 0x69 0x63 0x69 0x6F 0x31Status byte: 0000 0002 UTF8 RFU enejercicio1
  13. 13. Ejemplo NDEF URI 0xD1 0x01 0x0C 0x55 0x01 0x61 0x64 0x69 D1-> 1101 0001 0x74 0x69 0x75 0x6D ME, MB, SR =1 0x2E 0x63 0x6F 0x6D TNF = 001 (Well-known type) 0xFE 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  14. 14. Ejemplo NDEF URI (II) 1 0 Type Length = 0x01 => 1byte Payload Length = 0x0C = > 12bytes Type = 0x55 => RTD URI Payload= 0x01 0x61 0x64 0x69 0x74 0x69 0x75 0x6D 0x2E 0x63 0x6F 0x6D
  15. 15. Ejemplo NDEF URI (III)Analisis del payload : RTD URI 0x01 0x61 0x64 0x69 0x74 0x69 0x75 0x6D 0x2E 0x63 0x6F 0x6D1er byte Identifier code =0x01 http://www.Resto Payload (UTF-8) aditium.comURI : http://www.aditium.com
  16. 16. Ejemplo NDEF MIME vCard0XD2 0X0C 0X50 0X74 0X65 0X78 0X740X2F 0X78 0X2D 0X76 0X43 0X61 0X720X64 0X42 0X45 0X47 0X49 0X4E 0X3A0X56 0X43 0X41 0X52 0X44 0X0A 0X56 D2-> 1101 00100X45 0X52 0X53 0X49 0X4F 0X4E 0X3A0X32 0X2E 0X31 0X0A 0X46 0X4E 0X3A ME, MB, SR =10X58 0X61 0X62 0X69 0X65 0X72 0X20 TNF = 010 (Media Type -0X4C 0X6F 0X73 0X61 0X64 0X61 0X0A MIME)0X54 0X45 0X4C 0X3B 0X43 0X450X4C 0X4C 0X3B 0X56 0X4F 0X49 0X430X45 0X3A 0X20 0X28 0X36 0X36 0X360X29 0X20 0X36 0X36 0X36 0X2D 0X360X36 0X36 0X0A 0X45 0X4E 0X44 0X3A0X56 0X43 0X41 0X520X44 0XFE
  17. 17. Ejemplo NDEF MIME vCard (II) 1 0 Type Length = 0x0C => 12 bytes Payload Length = 0x50 = > 80 bytes
  18. 18. Ejemplo NDEF MIME vCard (III)Analisis del payload : 12 bytes mime-type: text/x-vCard Resto binario del archivo: BEGIN:VCARD.VERSION:2.1. FN:Xabier Losada. TEL;CELL;VOICE: (666) 666-666. END:VCARD
  19. 19. Android NFC Primer paso en la versión 2.3 API Level 9 Gran paso en la 2.3.3 API Level 10 Google Wallet Beam API Level 14 Nuevas features en API Level 16
  20. 20. Paquete android.nfc: Clases NfcManager NfcAdapter NdefMessage NdefRecord
  21. 21. Paquete android.nfc: NfcManager Gestor de alto nivel que se usa para obtener una instancia de NfcAdapter: NfcManager nm = getSystemService(NFC_SERVICE); NfcAdapter na = nm.getDefaultAdapter(); Alternativa getDefaultAdapter(android.content.Context): NfcAdapter na = NfcManager.getDefaultAdapter(this);
  22. 22. Paquete android.nfc: NfcAdapter Representa la interfaz con el CLF Métodos principales: – disableForegroundDispatch(Activity activity): • Desactiva el foreground dispatch a la activity que pasamos como parámetro. – enableForegroundDispatch(Activity activity, PendingIntent intent, IntentFilter[] filters, String[][] techLists): • Activa el foreground dispatch a la activity que pasamos como parámetro. – getDefaultAdapter(Context context): • Permite obtener una instancia del adaptador NFC por defecto – isEnabled(): • Devuelve true si la conectividad NFC está habilitada
  23. 23. Paquete android.nfc: NdefMessage Constructores: – NdefMessage(byte[] data) • Construye un mensaje NDEF a partir de raw bytes. – NdefMessage(NdefRecord[] records) y NdefMessage(NdefRecord record, NdefRecord... records) (API level16) • Construye un mensaje NDEF formado por los registros NDEF que pasamos como parámetro.
  24. 24. Paquete android.nfc: NdefMessage Métodos principales: – getRecords() • Obtenemos el array de NDEF records presentes en el mensaje. – toByteArray() • Devuelve el mensaje en raw bytes. – getByteArrayLength() (API level 16) • Devuelve la longitud en bytes del mensaje NDEF si se pasara a formato raw bytes.
  25. 25. Paquete android.nfc: NdefRecord Constructor: – NdefRecord(short tnf, byte[] type, byte[] id, byte[] payload) • Construye un registro NDEF a partir de los parámetros que le pasamos. Métodos principales: – getId() – getPayload() – getTnf() – getType() – toMimeType() (API level 16) • Mapea el registro a un MIME type, o devuelve null en caso de que no pueda. – toUri() (API level 16) • Mapea el registro a una URI, o devuelve null en caso de que no pueda.
  26. 26. Paquete android.nfc: NdefRecord Helpers estáticos: – createApplicationRecord(String packageName) – createUri(String uriString) – createUri(Uri uri) – createExternal(String domain, String type, byte[] data) (API level 16) – createMime(String mimeType, byte[] mimeData) (API level 16)
  27. 27. TAG DISPATCH SYSTEM
  28. 28. ANDROID MANIFEST Permisos necesarios:• <uses-permission android:name="android.permission.NFC" />• <uses-feature android:name="android.hardware.nfc" android:required="true" /> getDefaultAdapter() o getDefaultAdapter(android.content.Context) == null ?• <uses-sdk android:minSdkVersion="10"/>
  29. 29. FILTRANDO NDEF<intent-filter><actionandroid:name="android.nfc.action.NDEF_DISCOVERED"/><categoryandroid:name="android.intent.category.DEFAULT"/><data android:mimeType="text/plain" /></intent-filter><intent-filter><action android:name="android.nfc.action.NDEF_DISCOVERED"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="http"android:host="developer.android.com"android:pathPrefix="/index.html" /></intent-filter>
  30. 30. OBTENIENDO INFORMACIÓN DE LOS INTENTS EXTRA_TAG (obligatorio): Un objeto Tag representando el tag escaneado. EXTRA_NDEF_MESSAGES (opcional): Un array de mensajes NDEF del TAG. Si es un NDEF_DISCOVERED es obligatorio. EXTRA_ID (opcional): Identificador a bajo nivel del tag (UID).
  31. 31. NDEF Programáticamente: RTD_TEXT public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) { byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16"); byte[] textBytes = payload.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; data[0] = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); return record; }
  32. 32. NDEF Programáticamente: RTD_URI NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , "http://developer.android.com/index.html".getBytes(Charset.forName( "US- ASCII")), new byte[0], new byte[0]);
  33. 33. NDEF Programáticamente: MIMENdefRecord mimeRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , "application/com.example.android.beam".getBytes( Charset.forName("US-ASCII") ), new byte[0], "Beam me up, Android!".getBytes(Charset.forName( "US-ASCII " )));
  34. 34. Operaciones I/O La mayoría son bloqueantes, por lo que no pueden (MUST desde API level 14) ser llamadas desde el hilo principal Leer, escribir, formatear,…
  35. 35. Foreground Dispatcher1. Creamos un PendingIntent que se utilizará cuando se escanee un tag:PendingIntent pendingIntent = PendingIntent.getActivity( this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);2. Declarar un filtro de Intents que queremos procesar (Null = todos. Fallback TAG_DISCOVERED)IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); try { ndef.addDataType("*/*"); /* Handles all MIME based dispatches. You should specify only the ones that you need. */ } catch (MalformedMimeTypeException e) { throw new RuntimeException("fail", e); } intentFiltersArray = new IntentFilter[] {ndef, };3. Creamos un filtro de tecnologías con las que trabajar:techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
  36. 36. Foreground Dispatcher4. Override de los métodos del ciclo de vide de la activitypublic void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this);}public void onResume() { super.onResume(); mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);}public void onNewIntent(Intent intent) { Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); //do something with tagFromIntent}
  37. 37. Práctica IElaborar una aplicación que:- Detecte la presencia de Tags- Permita leer mensajes NDEF

×