5

この質問は、主に次のように回答されています: Windows UWP は検出後に BLE デバイスに接続します

現在、カスタム サービスを作成し、Windows 10 で C#.NET WinForm を使用して Bluetooth Low Energy (BLE) デバイスに接続してテストしています。フレームワーク 4.6.1 を使用しています。TI CC2650 BLEドーター カードを搭載したTI SmartRF06 評価ボードを使用しています。別の開発者がボードのファームウェアを処理しています。

現在、上記の参照回答と同様の方法を使用して、既にバインドされている BLE デバイスに接続できます。このデバイスは手動でバインドされており、Windows では PIN を入力する必要がありました。デバイスには PIN がないため、「0」を入力するだけでデバイスを接続できました。このように接続すると、すべての GATT サービスにアクセスして、必要なことを実行できます。したがって、Advertising BLE デバイスを見つけて手に入れるのに問題はありません。

問題は、まだペアリングされていない BLE デバイスにどのように接続するかということです。私はネットを調べて、BLE コードの例をたくさん見つけましたが、コードでペアリングがどのように行われるかを示すことに固有のものはありません。ペアリングする必要があるかどうかはわかりませんが、Windows はペアリングされたデバイスで GATT サービスのみを表示するようです。

ペアリングされていないデバイスでこれを行うと:

private void BleWatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{       
    var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
    // dev.DeviceInformation.Pairing.CanPair is true
    // dpr.Status is Failed
    DevicePairingResult dpr = await dev.DeviceInformation.Pairing.PairAsync(DevicePairingProtectionLevel.None);
    var service = await GattDeviceService.FromIdAsync(dev.DeviceInformation.Id);
}

デバイスが手動でペアリングされていない場合、dpr の結果は常に失敗します。その結果、GattDeviceServices空になります。しかし、広告と BLE デバイスのプロパティを取得できます。

このタイプの接続方法もありますが、使用方法がわかりません。

var prslt = await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.None,IDevicePairingSettings);

IdeviceParingSettingsインターフェイスです。どのクラスを使用するかわかりません。ここで、必要になる可能性のある「O」の PIN を設定できると思いますか?

BLE デバイスにセキュリティがない C# を使用して、Windows で BLE デバイスとペアリングできた人はいますか? 基本的には広く開ける必要があります。単純なものが欠けているか、これは単に不可能だと感じています(そうであると主張する投稿を見てきました。それらのほとんどは何年も前のものです)。

上記の投稿に記載されている方法を試してみましたが、結果に違いはありませんでした。

どんな助けでも大歓迎です。さらに多くのコードが必要な場合は、最初に提供したリンクを参照してください。おそらく、場違いなシーケンスがある場合は、実際のコードをすべて提供させていただきます。

4

1 に答える 1

7

私はそれを考え出した。私は正しい軌道に乗っていました。

以下を使用して接続した後:

var dev = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);

カスタム ペアリングを行う必要があります。

var prslt = await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.None);

しかし、それでは単にエラーが発生します。device.DeviceInformation.Pairing.Custom.PairingRequestedイベント ハンドラーも作成する必要があります。

だから私はこのハンドラを作成しました:

private void handlerPairingReq(DeviceInformationCustomPairing CP, DevicePairingRequestedEventArgs DPR)
        {
            //so we get here for custom pairing request.
            //this is the magic place where your pin goes.
            //my device actually does not require a pin but
            //windows requires at least a "0".  So this solved 
            //it.  This does not pull up the Windows UI either.
            DPR.Accept("0");


}

PairAsync 呼び出しの直前に接続します。

device.DeviceInformation.Pairing.Custom.PairingRequested += handlerPairingRequested;

私の接続を行う BlueToothAdvertisementWatcher コードのコード例:

    private BluetoothLEAdvertisementWatcher BTWatch = new BluetoothLEAdvertisementWatcher();

    private void Inits() 
        {
           BTWatch.Received += new TypedEventHandler<BluetoothLEAdvertisementWatcher, BluetoothLEAdvertisementReceivedEventArgs>(BtAddRx);
           BTWatch.Start();
        }

    private async void BtAddRx(BluetoothLEAdvertisementWatcher bw, BluetoothLEAdvertisementReceivedEventArgs args)
        {
            GattCommunicationStatus srslt;
            GattReadResult rslt;
            bw.Stop();//Stop this while inside.

            device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
                if (device.DeviceInformation.Pairing.IsPaired == false)
                {   

                    /* Optional Below - Some examples say use FromIdAsync
                    to get the device. I don't think that it matters.   */            
                    var did = device.DeviceInformation.Id; //I reuse did to reload later.
                    device.Dispose();
                    device = null;
                    device = await BluetoothLEDevice.FromIdAsync(did);
                    /* end optional */
                    var handlerPairingRequested = new TypedEventHandler<DeviceInformationCustomPairing, DevicePairingRequestedEventArgs>(handlerPairingReq);
                    device.DeviceInformation.Pairing.Custom.PairingRequested += handlerPairingRequested;
                    log("Pairing to device now...."); 

                    var prslt = await device.DeviceInformation.Pairing.Custom.PairAsync(DevicePairingKinds.ProvidePin, DevicePairingProtectionLevel.None);                  
                    log("Custom PAIR complete status: " + prslt.Status.ToString() + " Connection Status: " + device.ConnectionStatus.ToString());

                    device.DeviceInformation.Pairing.Custom.PairingRequested -= handlerPairingRequested; //Don't need it anymore once paired.


                    if (prslt.Status != DevicePairingResultStatus.Paired)
                    { //This should not happen. If so we exit to try again.
                        log("prslt exiting.  prslt.status=" + prslt.Status.ToString());// so the status may have updated.  lets drop out of here and get the device again.  should be paired the 2nd time around?
                        bw.Start();//restart this watcher.
                        return;
                    }
                    else
                    {
                        // The pairing takes some time to complete. If you don't wait you may have issues. 5 seconds seems to do the trick.

                        System.Threading.Thread.Sleep(5000); //try 5 second lay.
                        device.Dispose();
                       //Reload device so that the GATT services are there. This is why we wait.                     
                       device = await BluetoothLEDevice.FromIdAsync(did);

                    }
 var services = device.GattServices;
//then more code to finish it up.
}

切断したい場合は、次を使用してください。

await device.DeviceInformation.Pairing.UnpairAsync();

乱雑なコードで申し訳ありません。役に立った、または質問がある人がいる場合は、私に知らせてください。このコードの WinForm の例はどこにも見つかりませんでした。実際、UI なしで PIN とペアリングする方法を示すコードは見つかりませんでした。ですから、これが行き詰まる可能性のある人に役立つことを願っています。

于 2017-01-02T08:57:29.727 に答える