02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Post on 29-Nov-2014

1.085 views 0 download

description

More info on http://www.techdays.be

Transcript of 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Tap and Go: Proximity Networking (NFC) in WinRT

Jeff Prosisejeffpro@wintellect.com

A Message from the Team

We want to hear from you – app developers! 

Microsoft will be hosting a live Q&A session via Lync for your company to ask questions, or provide feedback, on the Windows 8 Proximity/NFC APIs.  You’ll have an opportunity to communicate directly with product engineers who built the proximity APIs.

March 12th from 5 – 6 PM local Belgium time (GMT+1)

http://aka.ms/gwevca

Near Field Communication (NFC)

Enables devices to communicate wirelessly while in close proximity (3 to 4 cm) of each other "Devices" can be powered or passive (e.g., smart tag)

May be used to establish Bluetooth, WiFi, and WiFi Direct connections for non-proximate transfersSupported by many platforms, including Windows 8, Windows Phone 8, Android, and SymbianStandards driven by NFC Forum (160+ members)

NFC Modes and Use Cases

NFC enables a multitude of "tap and do" scenarios which are intuitive to users and require no setup

Tap devices to establish peer-to-peer communication and

share content

Read and write information stored

in passive NFC tags ("smart tags")

Tap a payment terminal to execute

electronic payments

Reader/Writer Mode

Peer-to-Peer Mode Card Emulation Mode

NFC Data Exchange Format (NDEF)Lightweight, binary, platform-independent format for NFC messages with variable-length payloads

Read and write them with smartphones and other mobile devices

Or store themin inductively powered smart tags

NFC in WinRT

Tap For

NFCConnection

Exchange NDEF messages and Windows messages using

SNEP

SocketConnection

Exchange data using Bluetooth, WiFi, or WiFi

Direct*

ProximityDevice PeerFinder

* WiFi Direct supported in Windows 8 but not Windows Phone 8

Proximity Capability

Windows apps that use proximity networking must indicate that through their manifests

Windows 8 Windows Phone 8

The ProximityDevice Class

Provides methods for driving NFC devices Publishing NDEF messages to devices and tags Subscribing to NDEF messages from devices and tags Identifying on-board proximity devices

Contains properties for retrieving transfer rates and other information about proximity devicesFires events when other proximity devices arrive and depart

Detecting NFC Support

var device = ProximityDevice.GetDefault();

if (device != null){ // This device supports NFC}

Getting Device Information

var device = ProximityDevice.GetDefault();

if (device != null){ var id = device.DeviceId; // Device ID var bps = device.BitsPerSecond; // Max transfer rate (bps) var size = device.MaxMessageBytes; // Max message size (bytes)}

Detecting Arrivals and Departuresvar device = ProximityDevice.GetDefault();

if (device != null){ device.DeviceArrived += OnDeviceArrived; device.DeviceDeparted += OnDeviceDeparted;}

void OnDeviceArrived(ProximityDevice sender){ // Proximity device arrived}

void OnDeviceDeparted(ProximityDevice sender){ // Proximity device departed}

PublishMessage

ProximityDevice.PublishMessage publishes Windows.subtype messages to other devices Supported by Windows and Windows Phone

Not supported by other platforms subtype can be anything you want Supports transmission of string data Does not publish to smart tags

ProximityDevice.StopPublishingMessage stops publishing a message

Using PublishMessage

// Publish without a completed callbackdevice.PublishMessage("Windows.Sample", "Hello, NFC!");

// Publish with a completed callbackdevice.PublishMessage("Windows.Sample", "Hello, NFC!", OnMessageTransmitted); . . .void OnMessageTransmitted(ProximityDevice sender, long messageId){ // Stop publishing the message once it's delivered device.StopPublishingMessage(messageId);}

Subscribing to Messages

ProximityDevice.SubscribeForMessage subscribes to NDEF messages of the specified type "Windows.subtype" messages "WindowsUri" messages for URIs "WriteableTag" messages for writeable tags "NDEF[:filter]" messages for other message types

e.g., NDEF, NDEF:ext, and NDEF:wkt.U

ProximityDevice.StopSubscribingForMessage revokes a message subscription

Using SubscribeForMessage

device.SubscribeForMessage("Windows.Sample", OnReceived); . . .void OnReceived(ProximityDevice sender, ProximityMessage message){ string type = message.MessageType; // e.g., "Windows.Sample" string data = message.DataAsString; // e.g., "Hello, NFC!"

// Do this now, or do it later to continue subscribing device.StopSubscribingForMessage(message.SubscriptionId);}

NFC Messaging

The PeerFinder Class

Provides API for establishing socket connections via NFC for direct app-to-app communications Methods for establishing connections Properties for feature detection, connecting to other platforms, and

exerting control over transport types Events signifying connection requests

TriggeredConnectionStateChanged event makes tap-to-connect gestures simple and easy

Detecting Tap-to-Connect Supportif ((PeerFinder.SupportedDiscoveryTypes & PeerDiscoveryTypes.Triggered) != 0){ // This device supports tap-to-connect}

Establishing a Socket Connectionif ((PeerFinder.SupportedDiscoveryTypes & PeerDiscoveryTypes.Triggered) != 0){ PeerFinder.TriggeredConnectionStateChanged += OnTriggered; PeerFinder.Start();}

void OnTriggered(object sender, TriggeredConnectionStateChangedEventArgs e){ if (e.State == TriggeredConnectState.Completed) { var socket = e.Socket; // StreamSocket PeerFinder.Stop(); }}

Triggered Connection State

void OnTriggered(object sender, TriggeredConnectionStateChangedEventArgs e){ switch (e.State) { case TriggeredConnectState.Listening: break; case TriggeredConnectState.PeerFound: // OK to move devices apart break; case TriggeredConnectState.Connecting: // Establishing socket connection break; case TriggeredConnectState.Completed: // StreamSocket reference in e.Socket break; case TriggeredConnectState.Canceled: // Connection was closed break; case TriggeredConnectState.Failed: // Connection could not be established break; }}

Controlling the Transport Type

// All values default to truePeerFinder.AllowBluetooth = true; // BluetoothPeerFinder.AllowInfrastructure = true; // WiFiPeerFinder.AllowWiFiDirect = true; // WiFi Direct (Win8 only)

Alternate (App) Identities

PeerFinder.AlternateIdentities enables apps on different platforms to connect to each other e.g., Windows to Windows Phone

In a Windows app, add entry identifying corresponding app on Windows Phone App ID = {App product ID}

In a Windows Phone app, add entry identifying corresponding app on Windows App ID = {Package family name}!App

Enabling Windows Connections

PeerFinder.AlternateIdentities.Add( "Windows", // Platform identifier "f5bbba4f-c852-4e33-9e5d-54fe1c732524_ky5brtva589yy!App");

Enabling Windows Phone ConnectionsPeerFinder.AlternateIdentities.Add( "WindowsPhone", // Platform identifier "{b2c65896-3f48-4ea9-8c1c-773a17c38bff}");

Peer-to-Peer Communication

PublishBinaryMessage

Publishes NDEF messages to devices and tags WriteTag messages for writing to smart tags

Windows:WriteTag, WindowsUri:WriteTag, LaunchApp:WriteTag, and NDEF:WriteTag NDEF:WriteTag supports smart posters, Android Application Records (AARs), and more

NDEF messages for publishing to other devices WindowsMime messages to other devices

Use NDEF Library for Proximity APIs for help formatting binary NDEF messages

Getting an NFC Tag's Capacity

device.SubscribeForMessage("WriteableTag", OnReceived); . . .void OnReceived(ProximityDevice sender, ProximityMessage message){ var size = BitConverter.ToInt32(message.Data.ToArray(), 0);}

Writing URIs to NFC Tags

using (var writer = new DataWriter { UnicodeEncoding = UnicodeEncoding.Utf16LE }){ writer.WriteString("http://www.wintellect.com"); var buffer = writer.DetachBuffer(); device.PublishBinaryMessage("WindowsUri:WriteTag", buffer);}

Writing Windows Launch Tags

using (var writer = new DataWriter { UnicodeEncoding = UnicodeEncoding.Utf16LE }){ string tag = "argument" + // Optional launch argument "\tWindows\t" + // Platform identifier "1ED5AEA5.AngryBirdsSpace_p2gbknwb5d8r2!App"; // App ID

writer.WriteString(tag); var buffer = writer.DetachBuffer(); device.PublishBinaryMessage("LaunchApp:WriteTag", buffer);}

Writing Windows Phone Launch Tagsusing (var writer = new DataWriter { UnicodeEncoding = UnicodeEncoding.Utf16LE }){ string tag = "argument" + // Optional launch argument "\tWindowsPhone\t" + // Platform identifier "{afc3dfcf-8429-4e0d-9df8-4038939b5e75}"; // App ID

writer.WriteString(tag); var buffer = writer.DetachBuffer(); device.PublishBinaryMessage("LaunchApp:WriteTag", buffer);}

Writing Dual Launch Tags

using (var writer = new DataWriter { UnicodeEncoding = UnicodeEncoding.Utf16LE }){ string tag = "argument" + "\tWindows\t" + "1ED5AEA5.AngryBirdsSpace_p2gbknwb5d8r2!App" + "\tWindowsPhone\t" + "{afc3dfcf-8429-4e0d-9df8-4038939b5e75}";

writer.WriteString(tag); var buffer = writer.DetachBuffer(); device.PublishBinaryMessage("LaunchApp:WriteTag", buffer);}

Using Launch Arguments (Windows)protected override void OnNavigatedTo(NavigationEventArgs e){ // If this page was activated from an NFC tag or a // secondary tile, retrieve the launch argument if (e.Parameter != null && e.Parameter != String.Empty) { string arg = (string)e.Parameter; // TODO: Use the launch argument }}

Using Launch Arguments (Phone)private const string _key = "ms_nfp_launchargs"; . . .protected override void OnNavigatedTo(NavigationEventArgs e){ // If this page was activated from an NFC tag, retrieve the launch argument if (NavigationContext.QueryString.ContainsKey(_key)) { string arg = NavigationContext.QueryString[_key]; // TODO: Use the launch argument }}

Launch Tags

NDEF Library for Proximity APIs

Free, open-source library for reading and writing NDEF messages, including smart posters and AARsCompatible with Windows 8 and WP8

Writing a Smart Poster Tag

var record = new NdefSpRecord();record.Uri = "http://www.wintellect.com";record.NfcAction = NdefSpActRecord.NfcActionType.DoAction;record.AddTitle(new NdefTextRecord { Text = "Wintellect", LanguageCode = "en" });

var message = new NdefMessage { record };

device.PublishBinaryMessage("NDEF:WriteTag", message.ToByteArray().AsBuffer());

Reading a Smart Poster Tag

device.SubscribeForMessage("NDEF", OnMessageReceived); ...void OnMessageReceived(ProximityDevice sender, ProximityMessage message){ var ndef = NdefMessage.FromByteArray(message.Data.ToArray());

foreach (NdefRecord record in ndef) { if (record.CheckSpecializedType(false) == typeof(NdefSpRecord)) { var poster = new NdefSpRecord(record); var uri = poster.Uri; for (int i = 0; i < poster.TitleCount(); i++) var title = poster.Titles[i].Text; } } }

Writing an Android Launch Tag

var record = new NdefAndroidAppRecord();record.PackageName = "com.adobe.reader";

var message = new NdefMessage { record };

device.PublishBinaryMessage("NDEF:WriteTag", message.ToByteArray().AsBuffer());

Writing NDEF Tags

PublishUriMessage

Publishes URI messages to other devices Messages include standard NDEF URI records Compatible with Windows and non-Windows devices Only one URI message can be published at a time

URI messages launch URIs on target devices http:// protocol launches browser and shows the specified URL (e.g.,

http://www.wintellect.com) Other protocols launch apps registered for those protocols and can

include launch parameters

Great way to launch apps on other platforms!

Launching a Browser

var uri = new Uri("http://www.wintellect.com");device.PublishUriMessage(uri, OnMessageTransmitted); . . .void OnMessageTransmitted(ProximityDevice sender, long messageId){ // Message delivered}

Launching Skype

var uri = new Uri("skype:lori.prosise?call");device.PublishUriMessage(uri, OnMessageTransmitted); . . .void OnMessageTransmitted(ProximityDevice sender, long messageId){ // Message delivered}

Subscribing to URI Messages

device.SubscribeForMessage("WindowsUri", OnUriReceived); . . .private async void OnUriReceived(ProximityDevice sender, ProximityMessage message){ var array = message.Data.ToArray(); var uri = Encoding.Unicode.GetString(array, 0, array.Length);}

URI Messages