02 dev room6__tapand_go_jeffprosise_9tap and go: proximity networking in winrt
DESCRIPTION
More info on http://www.techdays.beTRANSCRIPT
Tap and Go: Proximity Networking (NFC) in WinRT
Jeff [email protected]
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