Cómo escribir en una tag NFC?

Ahora iniciaremos una nueva solución Windows Phone en el Visual Studio y allí abriremos una nueva referencia, la Ndef Library. Para agregar esta referencia a su solución Visual Studio podemos usar la herramienta NuGet (Administrador de Paquetes), para lo que debemos abrir el administrador y buscar por NDEF en el campo de búsqueda online y a continuación hacer clic en instalar.



Una vez agregado vamos a empezar con nuestro desarrollo. En el code behind de la página inicial vamos a agregar la API de la proximity y luego crear tres variables para uso dentro del código, una variable instanciando la ProximityDevice que utilizaremos para inicializar el NFC y utilizar el patrón del sistema y dos variables del tipo long para almacenar el ID del Subscribe y el Id del mensaje.

using Windows.Networking.Proximity;
using NdefLibrary.Ndef;
using System.Text;
using System.Runtime.InteropServices.WindowsRuntime;


private ProximityDevice device;
private long subscribeMessageId = -1;
private long publishingMessageId;


Inicializamos la variable de subscribeMessageId con el valor de -1 para utilizar como validación del método NFCBegin (que se puede ver a continuación), mientras hagamos la lectura de un tag no se podrá disponer del servicio para lectura de otros tags, evitando así un tap doble o una lectura de valores diferentes. Luego de la validación del valor de subscribeMessageId en el método, la variable recibe un nuevo valor y vuelve a -1 la variable al final del método MessageClientReceivedHandler.

public void NFCBegin()
{
     if (subscribeMessageId == -1)
     {
           subscribeMessageId = _device.SubscribeForMessage("NDEF", 
	   MessageReceivedHandler);
     }
}


El handler se responsabilizará por descubrir el tipo de mensaje enviado y de acuerdo a este hacer un tratamiento, la variable specializedType recibirá el tipo de NdefRecord enviado y tal variable se utilizará como parámetro de validación de tratamiento. Los tipos validados son los siguientes:
  • NdefMailtoRecord – Contenido para envío de Correo electrónico
  • NdefUriRecord – URL para abrirse en el Browser
  • NdefSpRecord – Contenido de Smart Poster
  • NdefLaunchAppRecord – Inicialización automática de un aplicativo
  • NdefTextRecord – Contenido en forma de texto

private void MessageReceivedHandler(ProximityDevice sender, ProximityMessage message)
        {
            var rawMsg = message.Data.ToArray();
            var ndefMessage = NdefMessage.FromByteArray(rawMsg);
            var tagContents = new StringBuilder();

            foreach (NdefRecord record in ndefMessage)
            {
                if (record.Id != null && record.Id.Length > 0)
                {
                    // Muestra el contenido del Record Id
		      // Haz tu tratamiento con valor

                }
                if (record.Type != null && record.Type.Length > 0)
                {
                    // Muestra el contenido del Record Type
		      // Haz tu tratamiento con valor
                }

                // Verifica el tipo de record enviado
                var specializedType = record.CheckSpecializedType(true);

                if (specializedType == typeof(NdefMailtoRecord))
                {
                    
                    var mailtoRecord = new NdefMailtoRecord(record);
                // Haz tu tratamiento de informaciones recibidas en correo electrónico
                }
                else if (specializedType == typeof(NdefUriRecord))
                {

                    var uriRecord = new NdefUriRecord(record);
                    // Haz tu tratamiento de informaciones recibidas en Uri                }
                else if (specializedType == typeof(NdefSpRecord))
                {
                    
                    var spRecord = new NdefSpRecord(record);
                    // Haz tu tratamiento de informaciones recibidas en Smart Poster                 
                }
                else if (specializedType == typeof (NdefLaunchAppRecord))
                {
                    
                    var launchAppRecord = new NdefLaunchAppRecord(record);
                    // Haz tu tratamiento de informaciones recibidas de App                
 		   } else if (specializedType == typeof (NdefTextRecord))
                {
                    
                    var launchAppRecord = new NdefTextRecord(record);
                    // Haz tu tratamiento de informaciones recibidas de Texto                
 		   }

                else
                {
                    // Otro tipo no validado en este ejemplo
                }

            subscribeMessageId 	= -1;
            }
}


Ahora agregaremos la llamada del método NFCBegin en el constructor e inicializaremos la variable de _device con el valor patrón del sistema.

device = ProximityDevice.GetDefault();
NFCBegin();


Con esto ya tenemos la parte de lectura de tag lista en nuestra aplicación e inicializaremos la parte de escritura en el tag. Crearemos cuatro métodos de escritura y un método para guardar en el tag:

private void BtnLaunchApp (object sender, System.Windows.RoutedEventArgs e)
        {
            var record = new NdefLaunchAppRecord {Arguments = "Hello World"};
            record.AddPlatformAppId("WindowsPhone", "ID da App no WMAppManifest.xml");
            PublishRecord(record, true);
        }

private void BtnMailTo (object sender, System.Windows.RoutedEventArgs e)
        {
            var record = new NdefMailtoRecord
                             {
                                 Address = "email para qual quer enviar",
                                 Subject = "assunto do email",
                                 Body = "texto do email..."
                             };
            PublishRecord(record, true);
        }

private void BtnUri (object sender, System.Windows.RoutedEventArgs e)
        {
            var record = new NdefUriRecord { Uri = "http://www.seusite.com/" };
            PublishRecord(record, false);
        }

private void BtnText (object sender, System.Windows.RoutedEventArgs e)
        {
            var record = new NdefTextRecord
            {
                Text = content,
                LanguageCode = CultureInfo.CurrentCulture.TwoLetterISOLanguageName
            };

            PublishRecord(record, true);
        }

private void PublishRecord(NdefRecord record, bool writeToTag)
        {
            if (_device == null) return;
            StopPublishingMessage(false);

            var message = new NdefMessage { record };

            var msgArray = message.ToByteArray();
            publishingMessageId = _device.PublishBinaryMessage((writeToTag ? "NDEF:WriteTag" : "NDEF"), msgArray.AsBuffer(), MessageWrittenHandler);
        }

private void MessageWrittenHandler(ProximityDevice sender, long messageid)
        {
            StopPublishingMessage(false);
        }


Con estos cuatro métodos cubriremos las posibilidades de escritura en el tag usando la NDEF. El método PublishRecord cumple el papel de realmente guardar las informaciones en el tag, recibe por parámetro el mensaje a guardar, debiéndose guardar un booleano en validación. El método BtnLaunchApp guarda en la aplicación una llamada para abrir el aplicativo específico con el pase de un argumento que se tratará durante la inicialización del aplicativo en el método OnNavigatedTo.

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            // Check if app was launched via LaunchApp tag
            if (NavigationContext.QueryString.ContainsKey("ms_nfp_launchargs"))
            {
                // argumento Tratar en el app qué hacer con el argumento
            }
        }


En el método BtnMailTo se generará un correo electrónico para el destinatario con el asunto y texto guardados en el tag. En el método BtnUri se guardará una URL para que se abra en el aplicativo patrón del sistema, normalmente un Browser. En el método BtnText se guardará un string que deberá tratarse con la recepción en el aplicativo mismo. El método MessageWrittenHandler verifica si hay algún mensaje en publicación en ese momento y detiene su publicación de ser así.

Entendemos que con pocas líneas de código podemos crear una aplicación para escritura y lectura de tags con el Windows Phone.

Last edited Aug 6, 2014 at 11:58 PM by brmontei, version 3