Windows Phone 8–Proximity與NFC–1
Proximity (近觸技術) 該技術這幾年在NFC的新聞下變得很夯,目前在各手機系統裡也陸續增加該晶片的支援,
在新的WP8系統裡也沒有漏掉,更搭配Wallet的應用緊密的整合在一起,因此在一些比較中高階的機款裡都有支援。
當然,這個技術在台灣要做為小額付款的普及仍還有一段路要走,但身為開發人員不要忘記學習。
往下便根據<Proximity for Windows Phone 8>的內容加以說明WP8在Proximity的APIs與支援度。
〉Proximity:
故名思義定義為近距離內二設備之間的連結,在Windows Runtime的類別裡支援這樣的運作。
透過Proximity APIs讓實作的App能透過與裝置之間的Tap(接觸)建立起連線,或者經由app-peer apps的方式瀏覽附近其他裝置。
舉例來說:
App可能為支持多人共同玩樂的遊戲,其中二個用戶透過設備與間互相Tap建立起連線,共享相同的Session操作遊戲;
或者App支援用戶可與電腦進行Tap與接收一些資訊,例如:訂閱的資訊、交易的資訊、地理資訊等。
然而,WP8支援Proximity Communication主要透過Near Field Communication(NFC)的技術,再搭配額外的Bluetooth來進行合作,
也許您會覺得NFC與Bluetooth有什麼關係,其二者均可以用於找到peers,進一步Bluetooth/Wi-Fi可以傳遞大型檔案,補上NCF
因受限頻寬或其他的使用情境。
大略說明了Proximity的概念之後,往下說明WP 8有那些方法來操作Proximity:
(1) Connect devices:
使用Proximity簡化透過Wi-Fi或Bluetooth連接你的App與在另一個設備上相同App的Instance的處理過程。
(2) Acquire content:
使用Proximity使電話可讀取"Smart"的Poster內容,它可能包含一些數據內容於嵌入的NFC tag。
(3) Exchange digital objects:
使用Proximity技術讓電話交易electronic business card或vCard。
這三個方法也是目前比較常見的應用,其中以(2)、(3)最常見,以(2)來說目前在香港常見到NFC餐廳,
它們於Menu中的每一個餐點圖像加上一個Tag,讓用戶手機透過App進行點餐與交易;
至於在2013年6月之後台灣也支持NFC小額交易,這些方法將愈來愈可見。
〉Proximity APIs:
透過下表說明主要操作Proximity的APIs:
Class |
Description |
讓程式裡探尋附近設備中具有相同app的instance,以及透過tap或browsing的方式與peer apps建立socket connection。 一個peer app代表相同app的instance正執行於另一個設備中。 |
|
使你的app能夠以3-4厘米的大致範圍與其他設備進行通信,交換一個小的資料內容(payload)。 |
|
包含標識一個Peer的相關訊息。 |
|
代表從subscription收到的訊息。 |
|
包含應用程式監聽 ConnectionRequested event的相關屬性。 |
|
包含應用程式監聽 TriggeredConnectionStateChanged event的相關屬性。 |
以上這些類別其實在<>介紹Bluetooth時有些介紹過,以下就針對在Proximity使用上的不同加以說明這些類別。
在Proximity處理發送訊息時,並非建立成一個Socket的方式,讓其他設備來連線或主動連線後進行資料立即的傳送。
而且採用Subscription的機制,發送訊息的設備將訊息寫入至Proximity暫存區中進行等待,等到其他設備來進行讀取,
這樣的方式就如同發送訊息的設備是Poster,而想要訊息的人為Subscribers(訂閱者)。
(A) PeedFinder:
該API用於允許應用程式搜尋附近也有安裝該應用程式的設備(或稱發現你的應用程式在另外設備的另一個Instance),
以建立二個Peer之間的Socket連線進行溝通,並且透過Tap gesture或Browsering。
‧A-1. 重要的事件、屬性與方法:
類型 | 名稱 | 說明 |
Event | ConnectionRequested | 發生於當一個遠端Peer請求連線,使用了ConnectAsync()方法。 |
Event | TriggeredConnectionStateChanged | 發生於一個遠端Peer的tap gesture期間。 |
Method | ConnectAsync | 經由呼叫FindAllPeerAsync()方法後,指定一個Peear發出ConnectAsync()請求。 |
Method | FindAllPeersAsync | 非同步瀏覽無線範圍內,正在執行相同App的對等設備。 |
Method | Start() | 啟動搜尋,以發現對等的App與使用程式發現遠端的Peers。 |
Method | Start(String) | 提供一個訊息至一個接近(proximate)設備上的App。 |
Method | Stop | 停止搜尋過程。 |
Attribute | AllowBluetooth | R/W,指定該PeerFinder類別可能使用Bluetooth連接一個StreamSocket物件。 |
Attribute | AllowInfrastructure | R/W,指定該PeerFinder類別可能使用TCP/IP連接一個StreamSocket物件。 |
Attribute | AllowWiFiDirect | R/W,指定該PeerFinder類別可能使用WiFi-Direct連接一個StreamSocket物件。 |
Attribute | AlternateIdentities | R,獲取可選用APPID值的列表,以配合其他平台上的點對點應用。 |
Attribute | DisplayName | R/W,設定/取得讓遠端Peers識別您的名稱。 |
Attribute | SupportedDiscoveryTypes | R,取得PeerFinder可使用Discovery任務的類型。 |
該類別是最主要操作Bluetooth APIs達成二個情境的應用,然而在Proximity APIs裡主要是針對ConnectionRequired、TriggeredConnectionStateChanged
事件的監控,因此,需要特別注意如何使用該類別。
(B) ProximityDevice:
允許你Push訊息至Proximity devices或從其他Proximity devices中Subscribe訊息。該類別為主要操作Proximity的重要部分。
以下說明其重要的Events、Methods與Properties:
‧B-1. Events:
事件 | 說明 |
DeviceArrived | 發生於有設備進入proximate範圍。 |
DeviceDeparted | 發生於有設備離開proximate範圍。 |
這二個事件用於監控目前是否有設備進入本機可進行proximate的範圍。
‧B-2. Methods:
方法 | 說明 |
FromId | 建立一個ProximityDevice類別的實例,透過指定一個設備接口加以激活。 |
GetDefault | 建立一個ProximityDevice類別的實例,與激活一個預設的Proximity provider。 |
GetDeviceSelector | 回傳一個selection string,可使用於列舉出所有proximity devices。透過指定該selection string給FindAllAsync()與CreateWatcher()方法來列出可用的proximity devices。 該回傳的字串舉例來說,如果設備支援proximity或nfc,回傳的值為:"StandardNfc",代表它支援nfc; 相關訊息可參考<How to retrieve additional properties for a device or PnP object>。 |
PublishBinaryMessage(String, IBuffer) | 發送指定message type的訊息至subscribers,其內容具有binary data。 |
PublishBinaryMessage(String, IBuffer, MessageTransmittedHandler) | 發送指定message type的訊息至subscribers,其內容具有binary data,更指定handler來處理當訊息已被送出時,進行呼叫該handler來執行任務。 |
PublishMessage(String, String) | 發送指定message type的訊息至subscribers,其內容為string。 |
PublishMessage(String, String, MessageTransmittedHandler) | 發送指定message type的訊息至subscribers,其內容具有string,更指定handler來處理當訊息已被送出時,進行呼叫該handler來執行任務。 |
PublishUriMessage(Uri) | 發送指定message type的訊息至proximate device,其內容為Uniform Resource Identifier (URI)。 |
PublishUriMessage(Uri, MessageTransmittedHandler) | 發送指定message type的訊息至proximate device,其內容為Uniform Resource Identifier (URI)。 指定handler來處理當訊息已被送出時,進行呼叫該handler來執行任務。 |
StopPublishingMessage | 停止發送訊息。 |
StopSubscribingForMessage | 取消訊息的訂閱。 |
SubscribeForMessage | 建立一個特定message type的訂閱。 |
以上介紹重要的方法,其中在PublishMessage()的部分以message type再加以說明:
‧message type:
該值是區分大小寫的字串,由二個部分組成:protocol 與 subtype,透過「.」加以組合,如:"Windows.SampleMessage"。
->PublishMessage():
protocol一律是「Windows」,subtype則為英文數字與特殊符號 ()+, - :=@$_! *' 組合而成,長度不超過250的字。
所有的訊息均透過UTF-8編碼。
->PublishBinaryMessage():
例如:"WindowsMime."或"NDEF:WriteTag",這些需要搭配PublishBinaryMessage()方法。
->PublishUriMessage():
需傳送Uniform Resource Identifier (URI)。
更詳細的內容參考<ProximityDevice.PublishBinaryMessage - message type>中定義的類型來說明:
Protocol | Targets | Operations | Message contents |
Windows | Between devices | Publish and subscribe | 訊息資料包含binary data。 |
WindowsUri | Between devices | Publish and subscribe | 訊息資料包含UTF-16LE encoded string而成的URI。 Windows將永遠處理"WindowsUri"訊息內容,經由提示用戶查看收到的URI,並且在Widnows中Default app會處理URI protocol,例如:http:// URIs會自動開啟default的web browser。 假始有其他app訂閱"WindowsUri"的app也將會被提示以讓用戶自行選擇。 |
WindowsMime | Between devices | Publish and subscribe | 訊息資料需指定Mime type。例如:傳送jpeg,其值為「WindowsMime.image/jpeg」。 Windows將永遠處理"WindowsMime"訊息內容,如果app有訂閱該mime type,將會被用於提示用戶查看收到的類型。 如果發佈"WindowsMime"訊息至不是跑Windows的電腦,該訊息內容將自動被依據電腦所支援的proximity技術進行格式化。例如:電腦是使用NFC為proximity技術,訊息內容會被轉成NDEF mime record。 如果發佈"WindowsMime"訊息,必需包括mime type。 如果訂閱"WindowsMime"訊息,該app將可以收到所有不限的mime type訊息。 如果訂閱指定的mime type,而且你的Windows電腦根據支援的proximity技術格式化訊息內容,當收到一個訊息,Windows將讀取格式化的訊息,並且只回傳mime content當作message content。 如果訂閱所有mime type,代表第一次送到的256 bytes為ASCII mime type string,剩下的為mime content。 |
Windows:WriteTag | Between device and a tag | Publish only | 功能類似Windows protocol。不同的是內容被寫入至靜態tag。其訊息不發送到任何設備,而是給可寫入的靜態tag。僅適用於publication。例如:Windows:WriteTag.SimpleSubType。 |
WindowsUri:WriteTag | Between device and a tag | Publish only | 功能類似WindowsUri protocol。不同的是內容被寫入至靜態tag。其訊息不發送到任何設備,而是給可寫入的靜態tag。僅適用於publication。 |
WindowsMime:WriteTag | Between device and a tag | Publish only | 功能類似WindowsMime protocol。不同的是內容被寫入至靜態tag。其訊息不發送到任何設備,而是給可寫入的靜態tag。僅適用於publication。例如:WindowsMime:WriteTag.image/jpeg。 |
LauchApp:WriteTag | Between device and a tag | Publish only | 寫標籤的功能,可用於指定啟動特定的App與啟動的參數。 如果發佈一個「LaunchApp:WriteTag」訊息至一個tag,當該tag被電腦給tap時,它將類似呼叫PeerFind.Start()方法與傳送啟動的參數。 訊息必需是UTF-16LE編碼字串,其內容的參數透過「tab字元」或「null值」所組合,如下: <launch arguments>[tab]<app platform 1>[tab]<app name 1>...[tab]<app platform N>[tab]<app name N> proximity app id是<package family name>!<app id>組成。至於package family name可透過Windows.ApplicationModel.Package.Current.Id.FamilyName的屬性取得,可以複製在App中的package manifest的Application element。例如:user=default\tWindows\tExample.Proximity.JS_8wekyb3d8bbwe!Proximity.App"。 詳細內容可參考AlternateIdentities。 |
WriteableTag | Between device and a tag | Subscribe only | 當訂閱該protocol時,如果一個writeable的tag接近時,將會收到一個proximity message,該訊息包含了一個int 32(little endian)表示最大的可寫tag大小。這個訊息只適用於subscriptions。 |
Pairing:Bluetooth | None | None | Windows訂閱該message type來完成一個使用proximity的Bluetooth配對。該協定的目的不是在於apps之間。 |
NDEF | Between devices, between device and a tag | Publish and subscribe | 訊息內容為符合NDEF records。下方更多NDEF類型,publications使用NDEF為message type來發送內容,而subscriptions使用NDEF type訂閱所有NDEF格式的訊息。 |
NDEF:ext | Between devices, between device and a tag | Subscribe only |
訊息內容為應用程式定義的NDEF records (TNF field value of 0x04)。該協定只適用於subscriptions,當發送NDEF content時需使用NDEF。 |
NDEF:MIME | Between devices, between device and a tag | Subscribe only | 該訊息資料為符合NDEF mime message(TNF field value of 0x02)的格式類型。 例如:"NDEF:MIME.image/jpeg"。該協定只適用於subscriptions,當發送NDEF content時需使用NDEF。 |
NDEF:URI | Between devices, between device and a tag | Subscribe only | 該訊息資料為符合URI namespace(TNF field value of 0x03)所定義的NDEF message格式類型。 此協定只適用於subscriptions,當發送NDEF content時需使用NDEF。其代表data format確定了所指定的URI。例如:"NDEF:URI.http://contoso.com/sometype"。 |
NDEF:wkt | Between devices, between device and a tag | Subscribe only | 該訊息資料為符合NFC forum(TNF field value of 0x01)所定義的NDEF message格式類型。 例如:type為NDEF.wkt.U代表為公知的URI類型。此協定只適用於subscriptions,當發送NDEF content時需使用NDEF。 |
NDEF:WriteTag | Between devices, between device and a tag | Subscribe only | 訊息資料應被寫入對個NFC 正規標準的Tag。其訊息資料必需是NDEF格式,且該協定只適用於publications。 |
NDEF:unknown | Between devices, between device and a tag | Subscribe only | 訊息資料包括未知類型的NDEF訊息(TNF field value of 0x05)。該協定為NDEF。 |
‧B-3. Properties:
Property | Access type | Description |
BitsPerSecond | Read-only | 取得proximity device的transfer rate。 |
DeviceId | Read-only | 取得proximity device的DeviceInformation Id。 |
Read-only | 取得該proximity device所支援發送訊息的最大size。 |
一個ProximityDevice類別允許應用程式與其他設備中的應用程式進行通訊,典型範圍是3~4厘。
可以使用GetDefault()與FromId()靜態方法取得ProximityDevice實例。該類別可用於publish/subscribe一些有用的廣告與接收小量的資料。
對於大量的資料或需保持持久通信的,仍建議採用PeerFinder and StreamSocket進行。在Windows Store apps,如果應用程式在前景執行時,
該publications與subscriptions才會被啟動。
(C) PeerInformation:
儲存可識別一個Peer的所有資訊。包括:
Property | Access type | Description |
DisplayName | Read-only | Gets the display name of the peer. |
HostName | Read-only | Windows Phone only. Gets the hostname or IP address of the peer. |
ServiceName | Read-only | Windows Phone only. Gets the service name or TCP port number of the peer. |
該類別的Instance在呼叫FindAllPeersAysnc()時被建立,等到ConnectionRequested事件被觸發時才被傳遞出來。你可以透過該Instance去進行
ConnectAsync()的方法來接受遠端Peer的請求。
(D) ProximityMessage:
代表從一個subscription中收到的訊息。主要的屬性如下表:
Property | Access type | Description |
Data | Read-only | 取得訊息中的binary data。 |
DataAsString | Read-only | 取得訊息資料以string型式。 |
MessageType | Read-only | 取得message type。 |
SubscriptionId | Read-only | 取得訊息的subscription id。 |
要注意操作ProximityMessage時,由於屬性非UI-Thread的執行方式,因此,要記得使用Dispatcher來更新UI-Thread中的內容。
(E) ConnectionRequestedEventArgs:
包括傳送給應用程式的所有資訊與ConnectionRequested 事件。該類別配合PeerInformation類別一起使用,用於交易過程中,
得知遠端hosti請求連接的交互狀態與處理結果。發生於當其他App或具有proximity裝置要求連線至該設備的App時所觸發的事件。
(F) TriggeredConnectionStateChangeEventArgs:
傳送相關目前連線狀態改變的資訊給應用程式,主要屬性如下表:
Property | Access type | Description |
Id | Read-only | 取得在連線進度的識別符號。 |
Socket | Read-only | 取得一個StreamSocket實例從一個連線中。 |
State | Read-only | 取得在連線進度的狀態資訊。 |
〉Required capabilities:
需要在WMAppManifest.xml中加上二個重要的capabilities:ID_CAP_NETWORKING 與ID_CAP_PROXIMITY;如下:
<Capabilities>
<Capability Name="ID_CAP_NETWORKING"/>
<Capability Name="ID_CAP_PROXIMITY"/>
</Capabilities>
[程式範例]
(1) Sending and receiving NFC messages:
該範例說明app如何跑在具有NFC的設備上完成二者之間的溝通。使用ProximityDevice類別在二個apps之間傳送簡單的文字。
‧to send a message:
ProximityDevice device = ProximityDevice.GetDefault();
// 確認是否有支援NFC
if (device!= null)
{
long Id = device.PublishMessage("Windows.SampleMessageType", "Hello World!");
Debug.WriteLine("Published Message. ID is {0}", Id);
// 將unique message Id儲存起來
// 用於停止publishing這個message
}
‧to receive ad message:
ProximityDevice device = ProximityDevice.GetDefault();
// 確認是否有支援NFC
if (device!= null)
{
long Id = device.SubscribeForMessage ("Windows.SampleMessageType", messageReceived);
Debug.WriteLine("Published Message. ID is {0}", Id);
// 將unique message Id儲存起來
// 用於停止subscribing這個message type
}
private void messageReceived(ProximityDevice sender, ProximityMessage message)
{
Debug.WriteLine("Received from {0}:'{1}'", sender.DeviceId, message.DataAsString);
}
(2) Finding a Windows Phone peer app:
說明如何透過PeerFinder類別來探尋peer app。
‧to start looking for peers:
ProximityDevice device = ProximityDevice.GetDefault();
// Make sure NFC is supported
if (device!= null)
{
PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;
// Start finding peer apps, while making this app discoverable by peers
PeerFinder.Start();
}
註冊TriggeredConnectionStateChanged事件,以監控Proximity Sensor的狀態改變。搭配PeerFinder.Start()啟動探尋。
‧to handle connection state change:
StreamSocket _streamSocket;
void OnTriggeredConnectionStateChanged(object sender, TriggeredConnectionStateChangedEventArgs args)
{
switch (args.State)
{
case TriggeredConnectState.Listening:
// Connecting as host
break;
case TriggeredConnectState.PeerFound:
// Proximity gesture is complete and user can pull their devices away. Remaining work is to
// establish the connection using a different transport, like TCP/IP or Bluetooth
break;
case TriggeredConnectState.Connecting:
// Connecting as a client
break;
case TriggeredConnectState.Completed:
// Connection completed, retrieve the socket over which to communicate
_streamSocket = args.Socket;
break;
case TriggeredConnectState.Canceled:
break;
case TriggeredConnectState.Failed:
// Connection was unsuccessful
break;
}
}
其TriggeredConnectState列舉類型,具有:Listening、PeerFound、Connecting、Completed、Canceled、Failed。
特別注意PeerFound的狀態,代表已有找到Peer此時要依目前啟用的為bluetooth或wi-fi來建立StreamSocket進行溝通。
(3) Finding a Windows 8 peer app:
找尋peer apps在其他的平台,例如:Windows 8,在使用時需指定你必須先定義你的應用程序在該平台上的替代應用程序的ID。
ProximityDevice device = ProximityDevice.GetDefault();
if (device != null)
{
PeerFinder.AlternateIdentities.Add("Windows", "my Win8 appID");
PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;
// Start finding peer apps, while making this app discoverable to peers
PeerFinder.Start();
}
以上簡略的說明實作的程式與要注意的使用方式後,往下針對幾個在開發時要特別注意的地方再加以說明。
〉 Foreground vs. background operation:
當你的proximity app切換至background時,例如:接電話時,所有發佈與訂閱的訊息均會暫停。
當你的app在background執行時,沒有任何活動也代表當app回到前景時沒有任何發佈與訂閱需要被處理。
當你的proximity app重新回到foreground時,發佈與訂閱將自動恢復功能。
〉Encrypting the data stream using SessionKey:
相關透過NFC建立的Socket是不受到保護的。預設下,data channel是不加密的。
為了在Socket傳輸過程裡加密以減少被篡改的風險被可以使用StreamSocket中的SessionKey屬性,以類似一個symmetric key(對稱密鑰)。
這樣方式可在cryptographic library被使用到,例如:System.Security.Cryptography.AesManaged。這個key只能被用於在proximity中已知的設備裡。
〉Reconnecting peer phone apps:
因為手機資源有限,你的app可能會在某些時候被轉成tombstone或刪除。這是正常的,因為系統為了保持更流暢的操作與體驗,
讓app被推到background有很多原因,例如:有來電、用戶切換apps、收到文字訊息…等。
當app被變成tombstoned,它失去資源、任何socket連線都被斷線。另外,用戶移動超過範圍該socket也可能被斷線。
上述的情境是被可預期的,因此為了讓用戶在操作proximity有好的體驗,在WP8加上了Reconnect的機制。
透過reconnect,一個連線能被自動地重新建立起來,減少損失。但這機制僅支援Bluetooth與TCP/IP (Wi-Fi)。
‧to reconnect after a socket connection failure:
(1) 在建立好connection後,將RemoteHostName與RemoteServiceName加以保存;
(2) 在App.xaml.cs中的Application_DeActivated事件,識別RemoteHostName.RawName與RemoteServiceName是否有值,
有值,代表有一個啟動的socket需要被重新reconnect;如下:
string storedRemoteHostRawName = socket.Information.RemoteHostName.RawName;
string storeRemoteServiceName = socket.Information.RemoteServiceName;
// Persist these two values
(3) 當你的程式在reactived與reconnect時,要記得先呼叫PeerFinder.Start()就跟以前一樣;
(4) 透過(2)保存的storedRemoteHostRawName建立一個新的RemoteHostName物件,如下:
HostName newRemoteHostName = new HostName(storedRemoteHostRawName);
(5) 透過(4)建立的RemoteHostName與(2)的storeRemoteServiceName搭配呼叫ConnectAsync()建立Socket連線;
await socket.ConnectAsync(newRemoteHostName, storedRemoteServiceName);
按照上述的作法應該就能在ConnectAsync()方法時重新建立連線。但以下有幾點要注意:
a. 如果在ConnectAsync()時呼叫了Cancel,並不會立即影響Connect的請求,reconnect仍會等待完整的timeout後再重新連接;
b. 如果在Windows Phone 8設備企圖與Windows 8設備進行reconnect,它將會失敗,因為reconnect機制不支援Windows 8;
c. ProximityDevice.GetDefault()可建立ProximityDevice物件,以啟動default proximity provider,建議可以轉成一個static變數來操作;
d. 在測試Proximity的部分:
如果您沒有實體設備的話,可以透過proximitytapper.codeplex.com來模擬有NFC的Emulator與Tapping的動作;
[補充]
‧Near Field Communication (NFC):
NFC是一個國際標準的短距離無線連接,提供電子設備之間的簡單、直觀與安全通信。NFC技術在電話上採用Proximity情境。
NFC具有以下的特性:
‧通信範圍為3-4厘米(1英寸到1.5英寸),約10cm的安全通信;
‧通信是選擇性與故意性的,因為用戶是有意地將他們設備進行連接;
‧射頻頻率:13.5MHz,相容ISO 14443、ISO 15693、Felica標準;
‧傳輸速度:最大424 kbit/s,典型是接近 30 kbits/s ~ 60 kbits/s之間,比較新的技術可到106 kbit/s ~ 212 kbit/s之間;
‧通信可以發生於NFC設備、無線NFC芯片、NFC tag之間;
‧Proximity and tapping:
Proximity與NFC允許你連接二個設備經由tapping或者是使他們在對方毫米範圍內進行連線;
這個情境支援Windows 8與Windows Phone8。當透過tapping成功,可以得到一個Socket來與另一個設備進行通訊。
在Windows Phone 8這個Socket建立在TCP/IP(Wi-Fi)或Bluetooth的任一種。Proximity API決定連線建立方式依據PeerFinder.AllowBluetooth與
PeerFinder.AllowInfrastructure屬性的設定,如二個都為true則看預設為何。因此,在建立連線前可先提示用戶確認Bluetooth是否有開啟,
雖Wi-Fi可以達到連線但需要在相同的infrastructure network(例如:同一個router、沒有防火牆、可以互相ping通)但相較Bluetooth環境需求
較高,因此常見透過Bluetooth。
======
以上是介紹WP8在Proximity APIs上的概念與運作方法,相關於實作的部分,將分成二篇文章加以說明,
<Windows Phone 8 – Proximity與NFC - 2>:說明devices之間透過NFC的傳遞資料;
<Windows Phone 8 – Proximity與NFC - 3>:說明device與tag之間透過NFC的傳遞資料;
希望有助於學習。謝謝。
References:
‧Windows Phone 8: Networking, Bluetooth, and NFC Proximity for Developers (重要)
‧Using NFC to exchange information
‧Using NFC to establish a persistent connection
‧Proximity and Near Field Communication
‧Proximity for Windows Phone 8 (重要)
‧Proximity and tapping (Windows Store apps using C#/VB/C++ and XAML)
‧Open Source NFC Emulator for Windows Phone 8 with Proximity Tapper
‧Where can I get some tips and guidance design resources?
‧Proximity Tapper (在windows phone emulator中建立NFC apps與支援emulator NFC)
‧Nokia 相關技術文章:
‧Using NFC to exchange information
‧Using NFC to establish a persistent connection
‧NFC technology basics & use cases & app development
‧How to Launch Apps via Proximity APIs (NFC)
‧New NFC and Proximity documentation on Windows Phone 8
‧WinRT : Create a custom ItemsPanel for an ItemsControl