02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT
-
Upload
microsoft-developer-network-msdn-belgium-and-luxembourg -
Category
Documents
-
view
1.085 -
download
0
description
Transcript of 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT
![Page 2: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/2.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/3.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/4.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/5.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/6.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/7.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/8.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/9.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/10.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/11.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/12.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/13.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/14.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/15.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/16.jpg)
NFC Messaging
![Page 17: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/17.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/18.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/19.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/20.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/21.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/22.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/23.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/24.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/25.jpg)
Peer-to-Peer Communication
![Page 26: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/26.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/27.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/28.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/29.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/30.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/31.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/32.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/33.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/34.jpg)
Launch Tags
![Page 35: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/35.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/36.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/37.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/38.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/39.jpg)
Writing NDEF Tags
![Page 40: 02 dev room6__tapand_go_jeffprosise_9Tap and Go: Proximity Networking in WinRT](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/40.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/41.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/42.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/43.jpg)
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](https://reader035.fdocuments.us/reader035/viewer/2022062614/5479d9abb37959822b8b480c/html5/thumbnails/44.jpg)
URI Messages