Ultimamente observa-se uma grande evolução no campo de pesquisas da tecnologia de identificação por radio frequência conhecido pela sigla em inglês RFID(radio frequency identification). Dentro desta tecnologia existe uma subárea que está em constante expansão, principalmente pelo seu largo uso em smath phones high end, a conhecida NFC(near field communication).

O NFC é uma tecnologia de comunicação através de radio frequência em campo próximo, ou seja, as informações só poderão ser trocadas na distância máxima dentro da faixa de 7 cm ~ 10 cm dependendo da calibração do sensor utilizado.

Ao iniciar o desenvolvimento mobile utilizando essa tecnologia, existem muitas iniciativas de API`s de código aberto. A NDEF se encaixa na maioria dos projetos envolvendo este campo, pois é além de ser de código aberto como já foi comentado, pode ser utilizada na grande maioria das plataformas mobiles atuais que suportam essa tecnologia, ex.: Windows Phone 8, Android entre outras.

Para iniciar o desenvolvimento deste exemplo, deve-se ter uma máquina equipada com windows 8 e o sdk 8.0 do Windows Phone(Observação: Lembre-se que apenas aparelhos com Windows Phone 9 suportam a tecnologia NFC) e realizar o download da API no link seguinte link: http://ndef.codeplex.com/.

Ao realizar o download da API NDEF, será baixado um arquivo .rar que deverá ser descompactado em um diretório qualquer. Após ter o ambiente com todas as ferramentas necessárias, abra um novo projeto e adicione a dll da biblioteca NDEF ao projeto(Observação: Ela estará dentro da pasta descompactado do arquivo .RAR baixado ). Além destas configurações básicas, deve-se adicionar os pré-requisitos do futuro app, essa informação será utilizado quando o app for publicado, para isso basta acessar as propriedades do projeto no arquivo WMAppManifest.xml na aba Requirements e marcar a opção ID_REQ_NFC como mostra a figura 1.

As configurações que devem ser selecionadas no projeto

Figura 1: As configurações que devem ser selecionadas no projeto.

Após isso tem-se o ambiente preparado para o desenvolvimento de aplicativos NFC para Windows Phone, para que isso ocorrar sem problemas, verifique se seu projeto está todo de acordo executando uma vez caso o emulador rode tranquilamente ou, caso você esteja utilizando um device como elemento de de debug, abra um novo aplicativo no seu device com o nome de seu projeto, tudo estará configurado corretamente.

O próximo passo a partir daqui será adicionar o namespace necessário para a importação dos pacotes utilizados na programação com NFC, para isso, você deverá adicionar o namespace NdefLibrary.Ndef, esse namespace é fornecido pela dll da API Ndef, caso tenha-se configurado corretamente o ambiente, tudo ocorrerá bem.

Listagem 1: Adicionando o namespace necessário ao projeto.


using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using NdefLibrary.Ndef;

Ao iniciar a programação do projeto, deve-se declara uma variável global dentro do projeto que servirá como representação do sensor NFC dentro do projeto, esse objeto deve ser uma instância da classe ProximityDevice e deve ser declarado sem nenhum tipo de inicialização, pois a inicialiazação do mesmo deve ser dentro do construtor da classe do aplicativo, onde o mesmo receberá a directiva do sistema que lhe dará acesso ao sensor de NFC e depois registrará quem será responsável por tratar as informações adquiridos através do mesmo, para isso, pode observar na figura 3 a declaração e inicialização do objeto em questão.

Listagem 2: A inicialização do objeto que servirá como representante do sensor NFC


private ProximityDevice  _device;

public MainPage()
{
	InitializeComponent();
	_device = ProximityDevice.getDefault();
	_device.SubscribeForMessage("NDEF",MessageReceivedHandler)
}

Quando se inicializa o objeto _device com o resultado da chamada da função GetDefault() pertencente a classe ProximityDevice, o mesmo recebe a permissão de acesso ao sensor presente no device, assim como também recebe todas as suas configurações e controle sobre o mesmo durante a execução deste aplicativo. Já quando se invoca o método SubscribeforMorMessage, o primeiro parâmetro estabelece qual seria o tipo de mensagem e qual o destino daquele tipo de message dentro do aplicativo, ou seja, no exemplo acima, tags de formato NDEF, serão encaminhadas para o Handler MessageReceivedHandler para ter seus dados tratados.

Após isso, dever-se iniciar a declaração de funções que são necessárias para o funcionamento correto do ciclo de vida de uma aplicação NFC mobile, as funções que devem ser implementadas são MessageReceivedHandler e a UpdateUIForNfcStatus, essas duas funções terão como objetivo receber os sinais do sensor NFC e gerar as atualizações dentro do próprio aplicativo respectivamente.

No caso da MessageReceivedHandler, ela terá dois parâmetros que serão utilizados para determinar qual o tipo de message NDEF que está se trazendo da tag e a partir dessa informação, pode-se dar o destino à essa informação.

Listagem 3: Declaração e codificação da MessageReceivedHandler


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)
            {
                var data = new NdefTextRecord(record);
                texto = data.Text;
            }

            UpdateUiForNfcStatus();
        }

No código demonstrado no exemplo 1, pode-se observar que a variável message, recebida por parâmetro, é transposta em um array e que logo em seguida é transpassada para um objeto do tipo NdefMessage que será percorrido dentro do foreach em busca de conteúdos do tipo NDEF String que são mensagens de texto adquiridas diretamente de uma tag gravada previamente. Ao terminar a execução da do foreach em busca de dados, a função realiza a chamado do procedimento UpdateUiForNfcStatus() que será o responsável por atualizar a UI do app e que pode ser conferido no Exemplo 2.

Listagem 4: Codigo de atualização da UI


private void UpdateUiForNfcStatus()
        {
            Dispatcher.BeginInvoke(() =>
            {
                teste.Text = texto;
            });
        }

Na UpdateUiForNfcStatus(), tem-se a utilização de um Dispatcher como forma de interromper a ação continua do Handler de recebimento de conteúdo como forma de viabilizar a atualização da UI.

O resultado dessa pequena aplicação será a exibição do conteúdo de texto gravado na tag em um label na UI do aplicativo.

Espero que tenham gostado, um abraço e até o próximo artigo.