Desenvolva um aplicativo avançado com NFC

A comunicação a curta distância (NFC, Near Field Communication) é uma tecnologia sem fio emergente de curto alcance. Com um alcance preciso de 2 cm, os usuários podem enviar/receber conteúdo tocando em dispositivos que estejam próximos um do outro para juntá-los. O toque permite que você selecione algo (ou alguém) rapidamente. Além de ser rápido, também é fácil de aprender. Basta ver para entender. Não é preciso ler um manual.

Por exemplo, imagine que você está vendo fotos com uma amiga e ela quer que você envie essas fotos para ela. Com a NFC, você só precisa tocar no seu dispositivo para enviá-las. Parece simples demais? Talvez, mas a ideia principal é simplificar o compartilhamento de conteúdo entre dispositivos.

'Esta imagem mostra o Nokia 360 Speaker compartilhando as informações de emparelhamento Bluetooth com um Windows Phone

Figura 1: Esta imagem mostra o Nokia 360 Speaker compartilhando as informações
de emparelhamento Bluetooth com um Windows Phone

Assim como o Bluetooth e o Wi-Fi, NFC é um protocolo sem fio padrão definido pela NFC Forum. Seu PC precisa de um rádio de NFC. Há muitos PCs com Windows 8 que têm rádios de NFC integrados diretamente a eles. Se a NFC não vier inclusa como parte do seu PC, você pode comprar dongles e conectá-los ao PC.

A NFC oferece funcionalidades bacanas. Os usuários podem tocar e enviar fotos, tocar em um menu para fazer um pedido em um restaurante, ou até mesmo tocar para emparelhar um dispositivo Bluetooth. Esses cenários são bastante diferentes entre si, mas o que eles têm em comum é o ¨toque¨ para iniciar a experiência. A NFC é usada em vários tipos de dispositivos, como PCs, telefones, alto-falantes, headsets, telas sem fio etc. para transformar a conexão entre dispositivos em uma experiência verdadeiramente intuitiva. Além disso, a NFC usa marcas de RFID; antenas leves, passivas e bastante econômicas que podem conter um volume considerável de dados e aderem a praticamente qualquer objeto, geralmente cartazes. Por exemplo, para comprar o ingresso de um filme bastaria tocar no cartaz do filme! Isso se chama marca de NFC. Apresentaremos um exemplo básico do toque em um marca de NFC para demonstrar os principais conceitos da API de NFC.

Mas, primeiro, vamos explicar melhor o que significa tocar para juntar dispositivos que estão próximos.

Definição de ¨toque¨

Assim como você toca para emparelhar um mouse Bluetooth ou para compartilhar fotos, também é importante tocar para juntar dispositivos que estejam próximos. Ainda que o conceito de toque já esteja bastante difundido, o toque para juntar um PC a outro dispositivo é uma novidade para a maioria das pessoas. Apresentamos algumas diretrizes do toque que mostram aos usuários:

  1. Onde é possível tocar para juntar os dispositivos: com o uso da marca de toque, também conhecida como a marca visual de ¨Tocar e Fazer¨, que indica onde a antena de NFC está localizada. Dependendo do modelo do PC, há diferentes partes que podem ser tocadas. Por exemplo, você pode tocar na parte traseira de um tablet ou na parte frontal de um tudo-em-um. Esta é a aparência da marca em qualquer PC com Windows 8 habilitado para NFC:

    Marca visual de Tocar e Fazer

    Figura 2: Marca visual de Tocar e Fazer

  2. Os dispositivos estão se comunicando entre si: durante o toque, os usuários devem ter a certeza de que algo está acontecendo, mesmo que não possam ver os dados que estão sendo transferidos. Por isso, o Windows reproduz um som quando os dispositivos estão próximos e se comunicando entre si.

O Windows executa essas ações automaticamente, para que você não precise se preocupar com isso. Para obter mais informações sobre os elementos da experiência do usuário, consulte Especificações de implementação da proximidade de curta distância. Tendo isso em mente, vamos explorar alguns cenários bacanas que você pode experimentar com a NFC.

Quando usar a NFC

Use a NFC quando um usuário precisar selecionar algo ou alguém no seu aplicativo. A NFC oferece uma forma intuitiva de selecionar, e é geralmente mais rápida (e mais bacana!) que a busca manual. O toque é o gatilho que inicia a experiência e, dependendo do seu aplicativo, a experiência pode ir desde o recebimento de uma foto até a criação de uma lista de reprodução. A decisão do que acontece depois do toque só depende do seu aplicativo. Então, para simplificar, classificamos esta gama de ações como experiências de ¨Tocar e Fazer¨.

Apresentamos, abaixo, alguns exemplos do uso da NFC para selecionar algo em um aplicativo. Você poderia tocar e...

  • Obter informações de um cartaz: As marcas de NFC são marcas de RFID leves e econômicas que custam entre US$ 0,15 e US$ 1,00 (o preço depende do custo de impressão). Elas podem ser comparadas a códigos de barras 2D, mas são mais fáceis e rápidas de usar. Tocar em uma marca é mais confortável do que tirar uma foto do código de barra (e esperar que a câmera pegue o ângulo certo). Há cada vez mais fabricantes inserindo marcas em cartazes em áreas movimentadas, como aeroportos, estações de metrô e paradas de ônibus. As marcas de NFC podem conter de 48 B a 4 KB de dados. Você pode programar uma marca para iniciar seu aplicativo em uma página específica.
  • Trocar informações de contato: em vez de soletrar seus dados de contato para um amigo e esperar que ele tenha anotado certo, toque nos dispositivos para juntá-los e trocar as informações de contato. Assim como no caso acima, você pode programar suas informações em um cartão de visitas/marca de NFC ou transferir as informações diretamente por meio de um aplicativo.
  • Reproduzir sua estação de rádio favorita: use uma marca de NFC para iniciar uma estação de rádio em casa onde você estiver; no trabalho, na academia ou no carro. Você pode até mesmo ter várias estações de rádio programadas em diferentes marcas, como, por exemplo: uma marca para a academia, outra para o trabalho e outra para a hora de dormir.
  • Fazer seu pedido em um restaurante cheio: ir a um restaurante badalado na hora do jantar significa ter de esperar um bom tempo para simplesmente fazer um pedido. Em vez disso, toque em uma marca na mesa para fazer o seu pedido.
  • Jogar um jogo multiplayer com um amigo: você pode se conectar facilmente a um jogo multiplayer como Battleship, Xadrez ou Scrabble com um amigo, tocando nos dispositivos para juntá-los. Após o toque, a conexão persiste por meio de um transporte fora de banda com alcance e taxa de transferência maiores, como Bluetooth ou Wi-Fi-Direct.

Agora que já temos uma boa noção sobre quando podemos usar a NFC, vamos para a parte divertida: desenvolver um aplicativo com nossas APIs de proximidade do Windows 8.

Como implementar a NFC

Como você pôde observar, a NFC facilita várias tarefas diárias para os usuários finais. Ajustar um alarme, por exemplo. Tenho certeza de que todo mundo já passou pela experiência de colocar a hora errada no alarme para despertar. Quando já está tarde e você só quer dormir, talvez não seja a melhor hora para fazer isso. A NFC facilita essa tarefa. Basta você tocar em uma marca predefinida, confirmar e ir dormir sem preocupações. Então, para ajudar os usuários nessa tarefa diária, suponha que você criou um aplicativo básico de alarme que permite aos usuários ajustar um alarme com o uso de uma marca de NFC. Essa suposição se divide em dois cenários.

  1. Ajustar um alarme na marca: As marcas de NFC podem ser reutilizáveis, por isso o aplicativo deve permitir que os usuários programem um alarme. Por exemplo, um usuário pode querer programar diferentes alarmes: um para os dias úteis e outro para o fim de semana. Isso se chama publicar dados em uma marca.
  2. Ajustar um alarme a partir da marca: Depois que o usuário tocar em uma marca, o aplicativo deve ser iniciado para confirmar o ajuste do alarme. Isso significa que o aplicativo pode ser iniciado com contexto ou argumentos.

A API de NFC oferece várias maneiras de cumprir o mesmo objetivo, mas abordarei a forma mais simples de implementar esse cenário.

Vamos ver, passo a passo, como ajustar um alarme em uma marca de NFC:

  1. Mário inicia o aplicativo de alarme e define uma hora, digamos, 7:00. Isso é só o alarme, ainda sem nenhum envolvimento com a NFC.
  2. Mário seleciona uma opção para ¨Ajustar alarme em marca de NFC¨. Nesse momento, o aplicativo chama as APIs de NFC para publicar informações no rádio NFC, especificamente uma cadeia de caracteres identificadora de aplicativo & 07:00. As marcas de NFC usam um formato de mensagem padronizado: o NDEF (formato de troca definido de NFC). Seu aplicativo não precisa se preocupar com a formatação de dados em uma mensagem de NDEF. O Windows faz isso para você! Agora, o usuário pode tocar na marca de NFC.
  3. Mário toca na marca com o uso do PC, e o aplicativo confirma a programação da marca. Depois que a marca é tocada, é importante que os usuários saibam que seu aplicativo programou a marca com êxito. Como discutimos anteriormente, o toque no PC é um conceito novo para a maioria das pessoas, por esse motivo, a confirmação deixa o usuário confiante de que o que ele fez deu certo. O aplicativo sabe que uma mensagem foi transmitida com êxito registrando a informação em um manipulador de mensagens transmitidas.

As APIs de NFC podem ser encontradas no namespace Windows.Networking.Proximity. Elas desempenharão uma função na etapa 2, depois que o usuário selecionar a opção ¨Ajustar alarme em marca de NFC¨. Primeiro, o aplicativo inicializa um objeto de proximidade. O objeto de proximidade é usado para informar quando uma marca (ou dispositivo) está dentro/fora do alcance. Depois, adicionaremos um manipulador de eventos DeviceArrival. O manipulador detecta quando a marca é tocada, o que significa que podemos começar a escrever informações na marca. É útil informar aos usuários que eles estão escrevendo em uma marca, para que eles não saiam do alcance. Você pode usar o mesmo evento para detectar quando qualquer dispositivo de proximidade é tocado.

O trecho de código a seguir mostra como inicializar e adicionar um manipulador de eventos DeviceArrival.

JavaScript

 var proximityDevice;

function initializeProximityDevice() {
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.getDefault();

    if (proximityDevice) {
        proximityDevice.addEventListener("devicearrived", proximityDeviceArrived);
       
}
   else {
        // No NFC radio on the PC, display an error message
    }


function proximityDeviceArrived(device) {
        // Let the user know we’re ‘Writing to Tag’

}
}

C#

 private void InitializeProximityDevice()
{

Windows.Networking.Proximity.ProximityDevice proximityDevice;
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

    if (proximityDevice != null) {
        proximityDevice.DeviceArrived += ProximityDeviceArrived;
    
    }
    else
    {
        // No NFC radio on the PC, display an error message
    }
}

private void ProximityDeviceArrived(Windows.Networking.Proximity.ProximityDevice device)
{
            // Let the user know we’re ‘Writing to Tag’

}

Em seguida, publicamos informações na marca. O aplicativo publica duas coisas: uma cadeia de caracteres identificadora de aplicativo, que consiste em uma ID e uma plataforma de aplicativos, e argumentos de inicialização. No Windows 8, a ID de aplicativo é <nome da família do pacote>!<ID de aplicativo>, e a plataforma de aplicativos é ¨Windows¨. Você deve copiar o valor da ID de aplicativo do atributo ID do elemento Application no manifesto do pacote do seu aplicativo. O argumento de inicialização é ¨07:00¨; o alarme definido pelo usuário. Chamaremos isso de a mensagem.

Se o aplicativo funcionar em várias plataformas, você poderá publicar IDs e plataformas de aplicativos alternativas, para que você possa tocar na mesma marca em outro dispositivo compatível com NFC, como o Windows Phone 8! Para obter mais informações sobre IDs alternativas, visite o MSDN.

O aplicativo publica os dados na marca usando um método chamado publishBinaryMessage. O método assume três parâmetros: messageType, mensagem e uma função messageTransmittedHandler. Definiremos messageType como ¨LaunchApp:WriteTag¨, que informa ao Windows que seu aplicativo quer escrever informações em uma marca de NFC. A mensagem é apenas a mensagem que definimos anteriormente (argumentos de inicialização e cadeia de caracteres identificadora de aplicativo). Precisaremos armazenar a mensagem como mensagem binária em um buffer. A função messageTransmittedHandler registra retornos de chamadas. Com isso, seu aplicativo sabe que a mensagem foi escrita com êxito na marca. Usaremos essa função para informar duas coisas ao usuário: escrevemos uma mensagem com êxito na marca e a marca não precisa mais estar dentro do alcance.

As mensagens continuam sendo publicadas até a função StopPublishingMessage ser chamada, ou quando o objeto ProximityDevice for liberado. Neste exemplo, usaremos a função de interrupção. PublishBinaryMessage retorna uma ID de publicação. Usaremos essa mesma ID de publicação para interromper a publicação da mensagem no rádio de NFC.

O trecho de código a seguir mostra como escrever dados em uma marca de NFC.

JavaScript

 var proximityDevice;

function getAlarmTime(){

    // Grab time set by the user, call this variable ‘Alarm’
    return Alarm;

}

function publishLaunchApp() {
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

if (proximityDevice) {
        // The format of the app launch string is: "<args>\tWindows\t<AppName>".
        // The string is tab or null delimited.

        // The <args> string can be an empty string ("").
        var launchArgs = getAlarmTime();

        // The format of the AppName is: PackageFamilyName!PRAID.
        var praid = "AlarmApp"; // The Application Id value from your package.appxmanifest.

        var appName = Windows.ApplicationModel.Package.current.id.familyName + "!" + praid;

        var launchAppMessage = launchArgs + "\tWindows\t" + appName;

        var dataWriter = new Windows.Storage.Streams.DataWriter();
        dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf16LE;
        dataWriter.writeString(launchAppMessage);
        var launchAppPubId =
             proximityDevice.publishBinaryMessage(
                 "LaunchApp:WriteTag", 
                 dataWriter.detachBuffer(), 
                 proximityWriteTagLaunchAppMessageTransmitCallback);
        
    if (launchAppPubId != -1) {
            // Stop publishing the message on NFC radio
        proximityDevice.stopPublishingMessage(launchAppPubId);
    }

     }
}

function proximityWriteTagLaunchAppMessageTransmitCallback() {
    // Inform the user that: the message has been successfully written to a tag & the tag no longer needs to be in range
}

C#

 Windows.Networking.Proximity.ProximityDevice proximityDevice;

private string GetAlarmTime(){

    // Grab time set by the user, call this variable ‘Alarm’
    return Alarm;
}

private void PublishLaunchApp()
{
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();

if (proximityDevice != null)
    {
        // The format of the app launch string is: "<args>\tWindows\t<AppName>".
        // The string is tab or null delimited.

        // The <args> string can be an empty string ("").
        string launchArgs = getAlarmTime();

        // The format of the AppName is: PackageFamilyName!PRAID.
        string praid = "MyAppId"; // The Application Id value from your package.appxmanifest.

        string appName = Windows.ApplicationModel.Package.Current.Id.FamilyName + "!" + praid;

        string launchAppMessage = launchArgs + "\tWindows\t" + appName;

        var dataWriter = new Windows.Storage.Streams.DataWriter();
        dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
        dataWriter.WriteString(launchAppMessage);
        var launchAppPubId =
        proximityDevice.PublishBinaryMessage(
            "LaunchApp:WriteTag", dataWriter.DetachBuffer(), 
            proximityWriteTagLaunchAppMessageTransmitCallback);
    
    if (launchAppPubId!= -1)
    {
        proximityDevice.StopPublishingMessage(launchAppPubId);
    // Stop publishing the message on NFC radio
    }

    }
}

private void proximityWriteTagLaunchAppMessageTransmitCallback(
    Windows.Networking.Proximity.ProximityDevice sender,
    long messageId)
{
        // Inform the user that: the message has been successfully written to a tag & the tag no longer needs to be in range
}

E é isso! Agora você já sabe como escrever em uma marca de NFC por meio de um aplicativo da Windows Store. É bem simples, então vamos para o cenário seguinte: ajustar um alarme a partir da marca. Vamos ver, passo a passo, como ler um alarme de uma marca de NFC:

  1. Mário está lendo um livro digital/escrevendo um email/jogando/usando o Windows e se lembra que precisa ajustar o alarme para segunda-feira de manhã. Ele pega sua marca de ¨Alarme de fim de semana¨e toca nela pelo PC. Ele recebe uma notificação do sistema convidando-o a iniciar seu aplicativo de alarme. O Windows cuida de tudo até esse ponto. Seu aplicativo não precisa fazer nada.
  2. Mário aceita, e seu aplicativo é inicializado, exibindo a tela ¨Confirmar alarme¨ e o horário 7:00. Depois que o Mário aceita a notificação do sistema, o Windows envia os argumentos de inicialização (iguais aos de cima) ao seu aplicativo durante a ativação. Isso se chama inicialização contextual, e é o mesmo que inicializar o aplicativo em uma página específica.
  3. Mário define o alarme. Isso é só o alarme, sem a NFC.

É bem fácil obter os argumentos de inicialização da marca de NFC. O aplicativo precisa manipular inicialização contextual de uma marca de NFC. A inicialização contextual é o mesmo que inicializar seu aplicativo em uma página específica. Nossos argumentos de inicialização especificam um alarme (7:00), que seu aplicativo usa para exibir um alarme proposto. Além disso, se o seu aplicativo não estiver instalado no PC, o Windows convidará o Mário a instalar o aplicativo a partir da Windows Store, automaticamente!

O trecho de código a seguir mostra como implementar a inicialização contextual.

JavaScript

 app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket") {
            //do nothing here.
        }
        else {
    // Use args.detail.arguments to parse out ’07.00’ string, and display to the user
        }

        args.setPromise(WinJS.UI.processAll());
    }
}

C#

 async protected override void OnLaunched(LaunchActivatedEventArgs args)
        {
            if (args.Arguments == "Windows.Networking.Proximity.PeerFinder:StreamSocket")
            {
                _isLaunchedByTap = true;
            }
            else
            {
// Use args.Arguments to parse out ’07.00’ string, and display to the user

            }
            Window.Current.Activate();
        }

Isso é tudo que seu aplicativo precisa fazer para dar suporte à leitura e gravação em uma marca de NFC. Bem simples para um cenário de tecnologia tão avançada! Antes de terminar, vamos falar sobre uma questão de higiene: o tratamento de erros.

Tratamento de erros

Há alguns erros comuns que seu aplicativo pode encontrar.

  • A marca tocada não tem o formato NDEF. O Windows 8 não oferece suporte automático à reformatação de uma marca em NDEF, por isso você precisa baixar e instalar um formatador de NDEF.
  • A marca tocada é somente para leitura. Algumas marcas de NFC podem estar bloqueadas com permissão somente de leitura (como as antigas fitas de VHS).
  • A marca tocada é pequena demais e não comporta todos os dados.
  • O PC de um usuário não tem NFC. Como mencionei desde o início, a NFC é uma tecnologia emergente cuja adoção ainda está sendo difundida. Para verificar se um PC oferece suporte à proximidade, use o método ProximityDevice.getDefault(); o método retornará NULL se não houver rádios NFC instalados.

É divertida e intuitiva!

A NFC finalmente chegou, pronta para os consumidores padrão, e o Windows tem o ecossistema e uma experiência de usuário completa e bem projetada. A tecnologia tem muito potencial para desenvolver aplicativos e experiências em dispositivos altamente intuitivos. É divertida e intuitiva.

A NFC é um assunto bastante vasto, por isso fique atento nas próximas postagens no blog sobre outras experiências bacanas para desenvolvedores de NFC no Windows 8.

Para saber mais sobre NFC e proximidade, consulte os recursos abaixo.

Recursos

Link

Types

Diretrizes para desenvolver usando a proximidade

Documento

APIs de proximidade

Documento

Testando e resolvendo problemas de proximidade em aplicativos

Documento

Publicação e subscrição (com mais detalhes)

Documento

Amostra de aplicativo com proximidade

Amostra

Tem alguma pergunta sobre proximidade? Pergunte aqui

Fórum

Obrigada,

Priya Dandawate

gerente de programas, dispositivos e rede

Com as contribuições de: Max Morris, Marzena Makuta, Mike Loholt, Jake Sabulsky e Vishal Mhatre