[Windows Phone 8] Ecrire un tag NFC et lancement d’une application via NFC

November 02, 2012 -

Dans mon article précédent, je vous montrais comment utiliser l’API de proximity device pour échanger une information entre deux téléphones lors d’un “tap” NFC. Dans ce nouvel article, je vais vous montrer comment écrire du contenu dans un tag NFC afin de le réexploiter pour qu’il puisse fournir une URL ou encore qu’il permette de lancer une application !

Ecriture d’un tag

L’écriture d’un tag se fait très simplement. Tout d’abord, Il faut récupérer une instance de ProximityDevice grace à la méthode statique GetDefault de cette même classe :

public partial class MainPage : PhoneApplicationPage
{
    private readonly ProximityDevice _proximityDevice;
    // Constructor
    public MainPage()
    {
        InitializeComponent();
        _proximityDevice = ProximityDevice.GetDefault();
    }
}

Une fois récupéré, le ProximityDevice permet d’écouter les messages NFC apportés par un tag sur lequel il est possible d’écrire. Pour celà, il suffit de souscrire aux messages de type “Writeable” :

private long subId = 0;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (_proximityDevice == null)
    {
        Dispatcher.BeginInvoke(() =>
        {
            MessageBox.Show("Le NFC n'est pas supporté sur ce téléphone", "Pas de NFC", MessageBoxButton.OK);
        });
    }
    else
    {
        subId = _proximityDevice.SubscribeForMessage("WriteableTag", OnWriteableTagArrived);
    }

    base.OnNavigatedTo(e);
}

Dans le handler OnWriteableTagArrived, on récupère le ProximityDevice qui lève l’événement, et on peut alors écrire une information à l’aide de la méthode PublishBinaryMessage :

private long pubId = 0;
private void OnWriteableTagArrived(ProximityDevice sender, ProximityMessage message)
{
    var dataWriter = new DataWriter();
    dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
    dataWriter.WriteString("http://www.juliencorioland.net");
    pubId = sender.PublishBinaryMessage("WindowsUri:WriteTag", dataWriter.DetachBuffer());
}

Comme vous pouvez le constater, j’utilise ici le protocole WindowsUri:WriteTag, qui me permet d’écrire une information de type URL dans le tag NFC (ici il s’agit d’une carte de dev offerte par Nokia à la //build/), en l’occurrence ici l’adresse de mon blog. Du coup, lorsque je passe mon téléphone devant le tag NFC, celui ci affiche me propose d’afficher mon blog :

image003

Lorsque j’accepte, le navigateur s’ouvre sur mon blog !

Lancer son application à partir d’un tag NFC

Un des cas d’utilisation de NFC prévu par Microsoft sous Windows Phone 8 est la possibilité d’associer une application à un type de tag, permettant ainsi de lancer une application par contact NFC. Par exemple, vous pouvez imaginer une borne intéractive à l’entrée d’un magasin, sur laquelle vous poser votre téléphone qui lance alors l’application pour ce magasin en particulier, avec du contenu mis en avant !

Association de protocole

Dans un premier temps, il faut créer une association de protocole pour votre application. La première étape consiste à ajouter une extension dans la manifest de l’application :

<Extensions>
  <Protocol Name="samplenfc" TaskID="_default" NavUriFragment="encodedLaunchUri=%s" />
</Extensions>

Ici, on associe le protocole “samplenfc:” à l’application (les deux autres paramètres sont les valeurs à renseigner obligatoirement, cf. http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206987(v=vs.105).aspx#BKMK_Protocolassociations).

Ensuite, il faut créer un UriMapper capable de traiter l’association de protocole. Pour cela on créé une classe qui dérive de UriMapperBase :

public class AssociationUriMapper : UriMapperBase
{
    public override Uri MapUri(Uri uri)
    {
        string url = HttpUtility.UrlDecode(uri.ToString());

        if (url.Contains("samplenfc:MainPage"))
        {
            int paramIndex = url.IndexOf("source=") + 7;
            string paramValue = url.Substring(paramIndex);

            return new Uri("/MainPage.xaml?source=" + paramValue, UriKind.Relative);
        }

        return uri;
    }
}

Le code est assez simple ici : je récupère l’URL “samplenfc:qqchose” et je la converti en URL XAML.

Ecriture du tag NFC

Pour l’écriture du tag NFC, cela se passe à peu près comme dans la première partie de l’article, sauf que cette fois, le protocole n’est plus http, mais samplenfc :

private long pubId = 0;
private void OnWriteableTagArrived(ProximityDevice sender, ProximityMessage message)
{
    var dataWriter = new DataWriter();
    dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE;
    //dataWriter.WriteString("http://www.juliencorioland.net");
    //pubId = sender.PublishBinaryMessage("WindowsUri:WriteTag", dataWriter.DetachBuffer());

    string appLauncher = string.Format(@"samplenfc:MainPage?source=NFCWakeUp");
    dataWriter.WriteString(appLauncher);
    pubId = sender.PublishBinaryMessage("WindowsUri:WriteTag", dataWriter.DetachBuffer());
}

Du coup, après avoir écrit mon tag sur la carte de développement, lorsque j’approche mon téléphone de celle-ci, j’obtiens bien le résultat attendu : le téléphone me propose de lancer mon application :

NFC Rocks !

Julien

Comments

Share

Tags


Twitter


#Docker integration for #Linux is very easy using #Microsoft #Azure: http://t.co/tswC7Rq2BX

April 02, 2015 07:21

Supers retours d'expériences de Wildmoka, une startup pas orientée techno #Microsoft, qui nous parle d'#Azure: http://t.co/P8dsdKiIUg

April 02, 2015 07:01

RT @benjguin: Vous cherchez un #podcast sur la #data ? http://t.co/HTus7oObys @bigdatahebdo http://t.co/dpGPWrJbKP

April 02, 2015 06:53

Adopting Microservices: Getting Started with Implementation: http://t.co/92rQK0Wx7k #nginx

April 01, 2015 23:59

#Azure support for #Java-based applications - http://t.co/kzBQBkW3Sz

April 01, 2015 23:41

RT @Azure: Free #Azure Webinar 4/9. @CloudlinkTech & #Microsoft SMEs share #AzureVM and Data Encryption best practices. http://t.co/6hHh6Bp…

April 01, 2015 23:38

RT @VisualStudio: Need a preview of WinJS 4.0? Here you go: http://t.co/T6yg6F9Z8Q http://t.co/DA8kLtmA4R

April 01, 2015 23:38

RT @Azure: Can you scale out #documentdb across machines? Yes you can! Find out how on 4/7 http://t.co/YZugqKShmI #MSmva

April 01, 2015 23:38

RT @Azure: #AzureAppService: New tools announced for web & #mobile #app developers. via @TechCrunch http://t.co/biWv71cKrU http://t.co/mWZT…

April 01, 2015 23:37

#Chef Server in Marketplace, Chef #Azure Provisioning and more - http://t.co/cXJLlyGVRz

April 01, 2015 20:04

#WebStorm 10 Compiles #TypeScript 1.4 to #JavaScript on the Fly - http://t.co/AVrpN02EVQ

April 01, 2015 20:03

New report shows #MongoDB to be leader of the #NoSQL database pack - http://t.co/l2usqouMQN

April 01, 2015 20:02

#GitHub is back after 5 days of DDoS attacks - http://t.co/g9qrAKI3gc

April 01, 2015 16:28

First look: #Microsoft's #Azure #AppServices sweeten cloud development - http://t.co/1zkI8RpLl8

April 01, 2015 15:16

Sharepoint Online: Intégration au portail de gestion #Azure (Preview) - http://t.co/3KiOTMPpMN

April 01, 2015 08:37