
- 類型:硬件優(yōu)化測試大小:13.9M語言:中文 評分:10.0
- 標(biāo)簽:
藍(lán)牙是手機(jī)的近距離無限傳輸?shù)募夹g(shù),在之前的Windows Phone 7系統(tǒng)手機(jī)里面僅支持藍(lán)牙耳機(jī)功能,并不支持藍(lán)牙文件信息傳輸,那么在Windows Phone 8手機(jī)里面將全面支持藍(lán)牙技術(shù),并且提供了相關(guān)的API來給開發(fā)者使用。開發(fā)者可以利用藍(lán)牙的相關(guān)API來創(chuàng)建應(yīng)用程序,在應(yīng)用程序里面使用手機(jī)的藍(lán)牙技術(shù)來進(jìn)行近距離的文件傳輸和發(fā)送接收消息,創(chuàng)造出更加有趣和方便的應(yīng)用軟件。
在Windows Phone 8里面可以在應(yīng)用程序里面利用藍(lán)牙進(jìn)行通信,使用藍(lán)牙相關(guān)的API,可以讓應(yīng)用程序連接到另外的一個應(yīng)用程序,也可以讓應(yīng)用程序連接到一個設(shè)備上。Windows Phone 8的藍(lán)牙技術(shù)支持兩個藍(lán)牙方案:一個是應(yīng)用程序到應(yīng)用程序的通信,另外一個是應(yīng)用程序到設(shè)備的通信。
1.應(yīng)用程序到應(yīng)用程序的通信
應(yīng)用程序到應(yīng)用程序的通信的過程是,應(yīng)用程序使用藍(lán)牙去查找正在廣播藍(lán)牙服務(wù)的對等的應(yīng)用程序,如果在應(yīng)用程序提供服務(wù)的范圍內(nèi)發(fā)現(xiàn)一個應(yīng)用程序,那么該應(yīng)用程序可以發(fā)起連接請求。當(dāng)這兩個應(yīng)用程序接受連接,它們之間就可以進(jìn)行通信了,通信的過程是使用socket的消息發(fā)送接收機(jī)制。在Windows Phone 8中使用到應(yīng)用程序到應(yīng)用程序的藍(lán)牙通訊技術(shù),需要在項(xiàng)目的WMAppManifest.xml文件中添加ID_CAP_PROXIMITY的功能選項(xiàng),表示支持臨近的設(shè)備通信能力,否則程序會出現(xiàn)異常。
2.應(yīng)用程序到設(shè)備的通信
在應(yīng)用程序到設(shè)備的通信過程時,應(yīng)用程序使用藍(lán)牙去查找提供服務(wù)的設(shè)備,如果提供的服務(wù)范圍之內(nèi)發(fā)現(xiàn)一個可以連接的藍(lán)牙設(shè)備,那么該應(yīng)用程序可以發(fā)起連接請求。當(dāng)應(yīng)用程序和設(shè)備同時接受該連接,它們之間就可以進(jìn)行通信了,通信的過程也是使用socket的消息發(fā)送接收機(jī)制,類似于應(yīng)用程序到應(yīng)用程序的通信。在Windows Phone 8中使用到應(yīng)用程序到設(shè)備的藍(lán)牙通訊技術(shù),需要在項(xiàng)目的WMAppManifest.xml文件中添加ID_CAP_PROXIMITY和ID_CAP_NETWORKING的功能選項(xiàng),表示支持臨近的設(shè)備通信能力和網(wǎng)絡(luò)通信能力,否則程序會出現(xiàn)異常。
藍(lán)牙編程類
在Windows Phone 8里面使用到藍(lán)牙編程主要會用到PeerFinder類,PeerInformation類,StreamSocket類和ConnectionRequestedEventArgs類,這些類的說明如表19.1所示。因?yàn)樗{(lán)牙也是基于TCP協(xié)議進(jìn)行消息傳遞了,所以需要用到Socket的相關(guān)的編程知識,以及StreamSocket類。PeerFinder類是藍(lán)牙查找類,它的主要成員如表19.2所示。
表19.1 藍(lán)牙編程類的說明
類名 | 說明 |
PeerFinder | 用于去查找附近的設(shè)備是否有運(yùn)行和當(dāng)前應(yīng)用程序相同的應(yīng)用程序,并且可以在兩個應(yīng)用程序之間建立起socket連接,從而可以進(jìn)行通信。對等應(yīng)用程序是在其他設(shè)備上運(yùn)行的應(yīng)用程序的另一個實(shí)例。 |
PeerInformation | 包含對等應(yīng)用程序或設(shè)備的識別信息。 |
StreamSocket | 支持使用一個TCP的Socket流的網(wǎng)絡(luò)通信。 |
ConnectionRequestedEventArgs | 表示傳遞到一個應(yīng)用程序的ConnectionRequested事件的屬性 |
表 19.2 PeerFinder類的成員
成員 | 說明 |
bool AllowBluetooth | 指定 PeerFinder 類的此實(shí)例是否可以通過使用 Bluetooth 來連接 ProximityStreamSocket 對象。如果PeerFinder 的此實(shí)例可以通過使用 Bluetooth 來連接 ProximityStreamSocket 對象,則為 true;否則為false。默認(rèn)為 true。 |
bool AllowInfrastructure | 是否使用TCP/IP協(xié)議連接到StreamSocket |
bool AllowWiFiDirect | 指定 PeerFinder 類的此實(shí)例是否可以通過使用 Wi-Fi Direct 來連接 ProximityStreamSocket 對象。如果 PeerFinder 的此實(shí)例可以通過使用 Wi-Fi Direct 來連接 ProximityStreamSocket 對象,則為 true;否則為false。默認(rèn)為 true。 |
IDictionary<string, string> AlternateIdentities | 獲取要與其他平臺上的對等應(yīng)用程序匹配的備用 AppId 值列表。返回要與其他平臺的對等類應(yīng)用程序匹配的備用 AppId 值列表。 |
string DisplayName | 獲取或設(shè)置標(biāo)識計(jì)算機(jī)到遠(yuǎn)程對等類的名稱。 |
PeerDiscoveryTypes SupportedDiscoveryTypes | 獲取一個值,該值指示哪些發(fā)現(xiàn)選項(xiàng)可與 PeerFinder 類一同使用 |
event TypedEventHandler<object, ConnectionRequestedEventArgs> ConnectionRequested | 遠(yuǎn)程對等類使用 ConnectAsync 方法請求連接時發(fā)生。 |
event TypedEventHandler<object, TriggeredConnectionStateChangedEventArgs> TriggeredConnectionStateChanged | 在遠(yuǎn)程對等類的輕擊筆勢期間發(fā)生。 |
IAsyncOperation< StreamSocket> ConnectAsync(PeerInformation peerInformation) | 連接已發(fā)現(xiàn)了對 FindAllPeersAsync 方法的調(diào)用的對等類。peerInformation:表示連接到的對等類的對等類信息對象。返回通過使用所提供的臨近StreamSocket 對象連接遠(yuǎn)程對等類的異步操作。 |
IAsyncOperation<IReadOnlyList<PeerInformation>> FindAllPeersAsync() | 適用于無線范圍內(nèi)運(yùn)行相同應(yīng)用程序的對等計(jì)算機(jī)的異步瀏覽。返回通過使用 Wi-Fi直連技術(shù)瀏覽對等類的異步操作。 |
void Start(string peerMessage) | 向臨近設(shè)備上的對等類應(yīng)用程序傳遞消息。 |
void Stop() | 停止查找對等類應(yīng)用程序或廣播對等類連接的過程 |
查找藍(lán)牙設(shè)備和對等項(xiàng)
查找在服務(wù)范圍內(nèi)的藍(lán)牙設(shè)備和對等項(xiàng)是藍(lán)牙編程的第一步,查找藍(lán)牙設(shè)備和對等項(xiàng)中會使用到PeerFinder類的FindAllPeersAsync方法去進(jìn)行查找,然后以異步的方式返回查找到的對等項(xiàng)列表的信息IReadOnlyList<PeerInformation>,注意要使查找對等的應(yīng)用程序時,在調(diào)用FindAllPeersAsync方法前必須先調(diào)用PeerFinder類的Start方法,主要的目的是啟動廣播服務(wù),讓對方的應(yīng)用程序也能查找到自己。PeerInformation包含三個屬性:一個是DisplayName表示對等項(xiàng)的名字,這個名字一般都是由對方的設(shè)備的名稱或者查找到的應(yīng)用程序自身設(shè)置的現(xiàn)實(shí)名字,一個是HostName表示主機(jī)名字或者IP地址,還有一個屬性是ServiceName表示服務(wù)名稱或者TCP協(xié)議的端口號。然后可以利用查找到的PeerInformation信息進(jìn)行連接和通信。
查找對等的應(yīng)用程序的代碼示例:
async void AppToApp() { // 啟動查找服務(wù) PeerFinder.Start(); //開始查找 ObservableCollection<PeerInformation> peers = await PeerFinder.FindAllPeersAsync(); if (peers.Count == 0) { //未找到任何的對等項(xiàng) } else { //處理查找到的對等項(xiàng),可以使用PeerFinder類的ConnectAsync方法來連接選擇的要進(jìn)行通信的對等項(xiàng) } }
查找藍(lán)牙設(shè)備的代碼示例:
private async void AppToDevice() { // 設(shè)置查找所匹配的藍(lán)牙設(shè)備 PeerFinder.AlternateIdentities["Bluetooth:Paired"] = ""; // 開始查找 ObservableCollection<PeerInformation> pairedDevices = await PeerFinder.FindAllPeersAsync(); if (pairedDevices.Count == 0) { // 沒有找到可用的藍(lán)牙設(shè)備 } else { //處理查找到的藍(lán)牙設(shè)備,可以新建一個StreamSocket對象,然后使用StreamSocket類的ConnectAsync方法通過HostName和ServiceName來連接藍(lán)牙設(shè)備 } }
本文導(dǎo)航