Top Banner
Tap and Go: Proximity Networking (NFC) in WinRT Jeff Prosise [email protected]
44

02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Nov 29, 2014

Download

Documents

More info on http://www.techdays.be
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Tap and Go: Proximity Networking (NFC) in WinRT

Jeff [email protected]

Page 2: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 3: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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)

Page 4: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 5: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 6: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 7: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Proximity Capability

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

Windows 8 Windows Phone 8

Page 8: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 9: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Detecting NFC Support

var device = ProximityDevice.GetDefault();

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

Page 10: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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)}

Page 11: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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}

Page 12: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 13: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 14: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 15: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 16: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

NFC Messaging

Page 17: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 18: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 19: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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(); }}

Page 20: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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; }}

Page 21: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Controlling the Transport Type

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

Page 22: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 23: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Enabling Windows Connections

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

Page 24: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 25: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Peer-to-Peer Communication

Page 26: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 27: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Getting an NFC Tag's Capacity

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

Page 28: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 29: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 30: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 31: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 32: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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 }}

Page 33: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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 }}

Page 34: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Launch Tags

Page 35: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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

Page 36: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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());

Page 37: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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; } } }

Page 38: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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());

Page 39: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Writing NDEF Tags

Page 40: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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!

Page 41: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Launching a Browser

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

Page 42: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

Launching Skype

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

Page 43: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

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);}

Page 44: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT

URI Messages