共用方式為


快速入門:使用輕觸或瀏覽的方式連接應用程式 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

當您使用鄰近性時,可以利用簡單的輕觸手勢或透過瀏覽無線範圍內的裝置,來建立兩個裝置之間的連線。您不需要連線至網路。只要同時輕觸兩部裝置,或使用 Wi-Fi Direct 連接。

大多數的裝置都必須具備 NFC,才能使用點選手勢在應用程式的兩個執行個體之間初始化連線。在電腦上,可透過藍牙、Wi-Fi Direct 或基礎結構網路進行此連線通道。在 Windows Phone 上,可透過藍牙或基礎結構網路建立連線。Windows Phone 不支援 Wi-Fi Direct。 這表示 Windows Phone 與電腦之間可以進行輕觸連線,但限制使用藍牙或基礎結構網路進行該通訊。

針對點選手勢,如果兩個含有鄰近性功能的裝置互相靠近到相距 3 到 4 公分,那麼鄰近性會通知這兩個系統。您可以使用輕觸,透過基礎結構網路、Wifi-Direct 或藍牙來設定長期的通訊通道。您的裝置必須安裝近距離無線通訊 (NFC) 硬體,才能夠使用點選手勢。您的無線介面卡必須支援 Wi-Fi Direct,才能夠使用 Wi-Fi Direct 瀏覽。

您也可以使用鄰近性,設定無線範圍內與對等應用程式的長期通訊通道。

這個主題顯示如何使用鄰近性,建立對等應用程式 (例如遊戲)、共用內容的應用程式等等之間的連線。

這個主題的範例說明如何使用鄰近性和 PeerFinder 類別,來建立與其他裝置上對等應用程式的長期通訊端連線。

至於透過輕觸觸發的連線,如果對等應用程式未在目標裝置的前景中執行,鄰近性會邀請使用者啟動目標電腦上的應用程式。如果目標裝置未安裝對等應用程式,則鄰近性會邀請目標裝置上的使用者從 Windows 市集安裝應用程式。如需使用點選手勢啟動應用程式的其他詳細資料,請參閱支援鄰近性和點選中的<使用鄰近性啟動應用程式>。

目標: 使用鄰近性輕觸或無線瀏覽,建立兩個裝置的連線。

先決條件

Microsoft Visual Studio Express 2012 for Windows 8

指示

1. 建立新專案和啟用鄰近性功能

  1. 開啟 Visual Studio Express 2012 for Windows 8,然後選取 [檔案] 功能表中的 [新增專案]。在 [Javascript] 區段中,選取 [空白的應用程式]。將應用程式命名為 ProximityConnect,然後按一下 [確定]。
  2. 開啟 Package.appxmanifest 檔案,然後選取 [功能]**** 索引標籤。選取 [鄰近性] 功能以啟用鄰近性。關閉並儲存資訊清單檔案。

2. 新增 HTML UI

開啟 Default.html 檔案,然後將下列的 HTML 新增到 <body> 區段。

<div style="position:absolute;margin:0">
    Display Name: <input type="text" id="displayNameTextBox" style="width:300px" />
    <button id="advertiseForPeersButton">Advertise for a Connection</button>
    <button id="acceptButton">Accept Connection</button>
    <button id="findPeersButton">Browse for Peers</button>
    <button id="stopFindingPeersButton">Stop Browsing for Peers</button><br />
    <input id="sendMessageText" type="text" style="width:200px" />
    <button id="sendMessageButton">Send Message</button><br />
    <div id="messageDiv" style="position:relative;width:600px"></div>
   </div>

3. 新增初始化程式碼

這個步驟中的程式碼會將函式與 HTML 按鈕的 Click 事件產生關聯。這些函式將在後續步驟中新增為事件處理常式。在此包含 id 捷徑函式,以方便存取 getElementById 函式。

開啟 js 資料夾。開啟 Default.js 檔案,然後用下列程式碼取代預設的 activated 函式。

app.onactivated = function (args) {
    if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) {

        id("advertiseForPeersButton").addEventListener("click", advertiseForPeers);
        id("acceptButton").addEventListener("click", acceptConnection);
        id("findPeersButton").addEventListener("click", findPeers);
        id("stopFindingPeersButton").addEventListener("click", stopFindingPeers);
        displayNameTextBox.value = Windows.Networking.Proximity.PeerFinder.displayName;
        Windows.Networking.Proximity.PeerFinder.addEventListener("connectionrequested", connectionRequested);

        // Detect if app launched from a tap.
        if ((args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch) &&
            (args.detail.arguments === "Windows.Networking.Proximity.PeerFinder:StreamSocket")) {

            advertiseForPeers(true);
        }

        args.setPromise(WinJS.UI.processAll());
    }
};

function id(elementId) {
    return document.getElementById(elementId);
}

4. 新增程式碼以連線到對等應用程式

在這個步驟中,您要新增按鈕的 Click 事件程式碼。您也可以新增寫入 UI 執行緒的方法。advertiseForPeersButton 按鈕的事件處理常式程式碼會設定本機裝置的對等名稱,並啟動 PeerFinder。如果觸發的連線會受到支援 (輕觸),程式碼便會識別出 triggeredConnectionStateChanged 事件的事件處理常式。在 triggeredConnectionStateChanged 事件處理常式中,程式碼會開啟資料流通訊端,在對等應用程式之間傳送文字訊息。

FindPeersButton 按鈕的事件處理常式程式碼會呼叫 findAllPeersAsync 方法,以瀏覽無線範圍內的裝置。找到一或多個對等應用程式時,範例就會呼叫 connectAsync 方法,以連線到第一個找到的對等應用程式。這只供示範之用。您應該提供一份可能的對等應用程式清單供使用者選擇,然後連線至使用者選擇的對等應用程式。

程式碼會包含 connectionRequested 事件的事件處理常式,此事件會在對等應用程式藉由呼叫 connectAsync 方法來開啟與您的連線時發生。您可以按一下 [接受連線] 按鈕接受連線。

stopFindingPeersButton 按鈕的事件處理常式程式碼會呼叫 Stop 方法。不論是透過無線連線或是使用點選手勢來連線,這個方法都會讓事件處理常式停止宣告和瀏覽對等應用程式。

在 Default.js 檔案中,將下列程式碼新增到 id 函式之後。

var started = false;

// Click event for "Advertise" button.
function advertiseForPeers(launchedFromTap) {
    Windows.Networking.Proximity.PeerFinder.displayName = displayNameTextBox.Text;

    if (Windows.Networking.Proximity.PeerFinder.supportedDiscoveryTypes &
        Windows.Networking.Proximity.PeerDiscoveryTypes.triggered) {

        Windows.Networking.Proximity.PeerFinder.addEventListener(
            "triggeredconnectionstatechanged", triggeredConnectionStateChanged);

        id("messageDiv").innerHTML +=
            "You can tap to connect a peer device that is " +
            "also advertising for a connection.<br />";
    } else {
        id("messageDiv").innerHTML +=
            "Tap to connect is not supported.<br />";
    }

    if (!launchedFromTap) {
        if (!(Windows.Networking.Proximity.PeerFinder.SupportedDiscoveryTypes &
              Windows.Networking.Proximity.PeerDiscoveryTypes.Browse)) {
            id("messageDiv").innerHTML +=
                "Peer discovery using Wi-Fi Direct is not supported.<br />";
        }
    }

    if (!started) {
        Windows.Networking.Proximity.PeerFinder.start();
        started = true;
    }
}

function triggeredConnectionStateChanged(e) {
    if (e.state === Windows.Networking.Proximity.TriggeredConnectState.peerFound) {
        id("messageDiv").innerHTML +=
            "Peer found. You may now pull your devices out of proximity.<br />";
    }
    if (e.state === Windows.Networking.Proximity.TriggeredConnectState.completed) {
        id("messageDiv").innerHTML += "Connected. You may now send a message.<br />";
        sendMessage(e.socket);
    }
}


// Click event for "Browse" button.
function findPeers() {
    if (Windows.Networking.Proximity.PeerFinder.supportedDiscoveryTypes &
        Windows.Networking.Proximity.PeerDiscoveryTypes.browse) {

        Windows.Networking.Proximity.PeerFinder.findAllPeersAsync().done(
    function (peerInfoCollection) {
        if (peerInfoCollection.length > 0) {
            // Connect to first peer found - example only.
            // In your app, provide the user with a list of available peers.
            connectToPeer(peerInfoCollection[0]);
        }
    },
    function (err) {
        id("messageDiv").innerHTML += "Error finding peers: " + err + "<br />";
    });
    } else {
        id("messageDiv").innerHTML +=
        "Peer discovery using Wi-Fi Direct is not supported.<br />";
    }
}

function connectToPeer(peerInfo) {
    id("messageDiv").innerHTML += ("Peer found. Connecting to " + peerInfo.displayName + "<br />");
    Windows.Networking.Proximity.PeerFinder.connectAsync(peerInfo).done(
        function (socket) {
            id("messageDiv").innerHTML += "Connection successful. You may now send messages.<br />";
            sendMessage(socket);
        },
        function (err) {
            id("messageDiv").innerHTML += "Connection failed: " + err + "<br />";
        });

    requestingPeer = null;
}

function stopFindingPeers() {
    Windows.Networking.Proximity.PeerFinder.stop();
    started = false;
    if (proximitySocket != null) { closeSocket(); }
}

// Handle external connection requests.
var requestingPeer;

function connectionRequested(e) {
    id("messageDiv").innerHTML +=
        "Connection requested by " + e.peerInformation.DisplayName + ". " +
        "Click 'Accept Connection' to connect.";
    requestingPeer = e.PeerInformation;
}

function acceptConnection() {
    if (requestingPeer == null) {
        id("messageDiv").innerHTML += "No peer connection has been requested.";
        return;
    }

    connectToPeer(requestingPeer);
}

5. 新增程式碼以使用 ProximityStreamSocket 傳送和接收訊息

成功建立連線時,程式碼會將連線所建立的 ProximityStreamSocket 物件傳送到 sendMessage 函式。sendMessage 函式會開啟與鄰近性裝置的網路連線,讓您能夠來回傳送訊息。請確定一律會在完成時呼叫 ProximityStreamSocket 物件的 close 方法。

在 Default.js 檔案中,將下列程式碼新增到 connectToPeer 函式之後。

var proximitySocket;
var dataWriter;

// Reference socket streams for writing and reading messages.
function sendMessage(socket) {
    id("sendMessageButton").addEventListener("click", sendMessageText);

    // Get the network socket from the proximity connection.
    proximitySocket = socket;

    // Create DataWriter for writing messages to peers.
    dataWriter = new Windows.Storage.Streams.DataWriter(proximitySocket.outputStream);

    // Listen for messages from peers.
    var dataReader = new Windows.Storage.Streams.DataReader(proximitySocket.inputStream);
    startReader(proximitySocket, dataReader);
}

// Send a message to the socket.
function sendMessageText() {
    var msg = id("sendMessageText").value;

    if (msg.length > 0) {
        var msgLength = dataWriter.measureString(msg);
        dataWriter.writeInt32(msgLength);
        dataWriter.writeString(msg);
        dataWriter.storeAsync().done(
            function (byteCount) {
                if (byteCount > 0) {
                    id("messageDiv").innerHTML += "Message sent: " + msg + "<br />";
                } else {
                    id("messageDiv").innerHTML += "The remote peer closed the socket.";
                    closeSocket();
                }
            },
            function (err) {
                id("messageDiv").innerHTML += "Send error: " + err.message + "<br />";
                closeSocket();
            });
    }
}

// Read out and print the message received from the socket.
function startReader(socket, reader) {
    var initialLength = 4;
    reader.loadAsync(initialLength).done(
    function (byteCount) {
        if (byteCount > 0) {
            var msgLength = reader.readInt32();
            reader.loadAsync(msgLength).done(
                function (byteCount) {
                    if (byteCount > 0) {
                        var message = reader.readString(msgLength);
                        id("messageDiv").innerHTML += "Received message: " + message + "<br />";

                        // After receiving a message, listen for the next message.
                        startReader(socket, reader);
                    }
                    else {
                        id("messageDiv").innerHTML += "The remote peer closed the socket.";
                        closeSocket();
                    }
                },
                function (err) {
                    id("messageDiv").innerHTML += "Receive error: " + err.message + "<br />";
                    reader.close();
                });
        }
        else {
            id("messageDiv").innerHTML += "The remote peer closed the socket.";
            reader.close();
        }
    },
    function (err) {
        id("messageDiv").innerHTML += "Receive error: " + err.message + "<br />";
        reader.close();
    });
}

function closeSocket() {
    if (proximitySocket) {
        proximitySocket.close();
        proximitySocket = null;
    }

    if (dataWriter) {
        dataWriter.close();
        dataWriter = null;
    }
}

6. 執行應用程式

若要檢視執行中的應用程式,請在兩部啟用鄰近性的裝置上執行該應用程式。接著,按一下這兩個應用程式上的 [宣告連線] 按鈕,然後一起輕觸這兩部裝置。如果兩部裝置都有 Wi-Fi Direct,您可以不用輕觸,而是按一下其中一部裝置上的 [瀏覽對等應用程式]**** 建立連線。

重要  

您必須在兩部裝置上執行這個快速入門。對於使用點選手勢的情況,每部裝置都必須安裝鄰近性裝置,例如近距離無線通訊 (NFC) 無線電波。對於使用無線瀏覽的情況,您需要兩部已啟用 Wi-Fi Direct 的電腦,或是兩部已啟用藍牙的 Windows Phone。如果您沒有支援鄰近性輕觸 (例如 NFC 無線電波) 的硬體,則可使用鄰近性驅動程式範例,這個範例是 Windows 驅動程式套件 (WDK) 範例的一部分。您可以使用範例驅動程式,在兩部裝置之間透過網路連線模擬點選手勢。如需如何下載 WDK 的相關資訊,請參閱 Windows 驅動程式套件 (WDK)。安裝 WDK 和範例之後,您就可以在安裝 WDK 範例的位置 src\nfp 目錄中找到鄰近性驅動程式範例。如需建置和執行模擬器的指示,請參閱 src\nfp\net 目錄中的 NetNfpProvider.html 檔案。啟動模擬器之後,當您的鄰近性應用程式在前景中執行時,該模擬器便會在背景中執行。您的應用程式必須位於前景中,輕觸模擬才能運作。

 

摘要與後續步驟

在這個教學課程中,您建立一個使用點選手勢或無線瀏覽方式連線裝置的應用程式。

您也可以使用點選手勢發佈和訂閱訊息。如需範例,請參閱使用輕觸來發佈和訂閱訊息

相關主題

使用鄰近性功能進行程式開發的指導方針

支援鄰近性和輕觸

在應用程式中測試和疑難排解鄰近性

Windows.Networking.Proximity namespace

範例

鄰近性範例