2017-01-01 1 views
1

Diese Frage wird meist beantwortet von: Windows UWP connect to BLE device after discoveryWie manuell an ein BlueTooth Low Energy Device in einem WinForm mit C# zu binden?

ich einen benutzerdefinierten Dienst und Prüfung, denn nun schreiben, ein C# .NET Windows Forms unter Windows 10 unter Verwendung von mit einem Bluetooth Low Energy (BLE) Gerät zu verbinden. Ich benutze Framework 4.6.1. Wir verwenden eine TI SmartRF06 Evaluation Board mit einer TI CC2650 BLE Tochterkarte. Ein anderer Entwickler behandelt die Firmware des Boards.

Derzeit mit Methoden ähnlich wie die Referenzantwort above Ich bin in der Lage, eine Verbindung zu einem bereits gebundenen BLE-Gerät herzustellen. Dieses Gerät wurde manuell gebunden und Windows erforderte von mir die Eingabe einer PIN. Da das Gerät keine PIN hat, kann nur durch Eingabe von "0" eine Verbindung hergestellt werden. Sobald ich verbunden bin, kann ich auf diese Weise zu allen GATT-Diensten gelangen und tun, was ich tun muss. So habe ich keine Probleme mit der Suche nach einem Advertising BLE-Gerät.

Das Problem ist, dass ich eine Verbindung zu einem BLE-Gerät herstellen kann, das noch nicht gepaart wurde? Ich bin durch das Netz gegangen und habe viele Beispiele für BLE-Code gefunden, aber nichts, das zeigt, wie die Paarung im Code erfolgt. Nicht sicher, ich brauche es sogar zu paaren, aber Windows scheint nur meine GATT-Dienste auf gepaarten Geräten zu zeigen.

Wenn ich dies tun mit ungepaarten Gerät:

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); 
} 

Das Ergebnis der DPR ist immer gescheitert, wenn wurde Gerät nicht manuell gekoppelt wurde. Was dazu führt, dass die GattDeviceServices leer ist. Aber ich kann die Werbung und die Eigenschaften des BLE-Geräts bekommen.

Es gibt auch diese Art von Verfahren zu verbinden, aber ich kann nicht herausfinden, wie es zu benutzen:

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

IdeviceParingSettings eine Schnittstelle ist. Nicht sicher, welche Klasse damit zu verwenden ist. Ich denke, das ist, wo ich die PIN von "O" setzen kann, die ich brauchen könnte?

Hat jemand Glück gehabt, ein Pairing zu einem BLE-Gerät in Windows mit C#, wo das BLE-Gerät keine Sicherheit hat. Grundsätzlich sollte es weit offen sein. Ich fühle mich, als ob ich etwas Einfaches vermisse oder das ist einfach nicht möglich (was ich einige Posts gesehen habe, die behaupten, dass das der Fall ist. Die meisten davon waren viele Jahre alt).

Ich habe die Methoden, die in dem erwähnten Beitrag beschrieben sind, ohne jeden Unterschied im Ergebnis versucht.

Jede Hilfe wird geschätzt. Wenn Sie mehr Code benötigen, schauen Sie sich bitte den oben angegebenen Link an, mit dem ich angefangen habe. Ich werde glücklich sein, meinen ganzen tatsächlichen Code zur Verfügung zu stellen, wenn es vielleicht eine Folge gibt, die ich am falschen Ort mache.

+0

Ich habe die Datenblattlinks eingefügt. Wenn diese falsch sind, wäre es großartig, wenn Sie sie beheben würden. – zx485

Antwort

3

Ich fand es heraus. Ich war auf dem richtigen Weg.

Nachdem Sie eine Verbindung mit:

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

Sie müssen eine benutzerdefinierte Pairing tun:

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

Aber das wäre einfach geben Sie einen Fehler. Sie müssen auch einen device.DeviceInformation.Pairing.Custom.PairingRequested Event-Handler erstellen.

Also habe ich diese Handler:

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"); 


} 

es kurz vor dem PairAsync nennen wie Hooked:

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

Beispielcode für die BlueToothAdvertisementWatcher Code, der meine Verbindung funktioniert:

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. 
} 

Wenn Sie trennen möchten, verwenden Sie einfach:

await device.DeviceInformation.Pairing.UnpairAsync(); 

Entschuldigung für den unordentlichen Code. Wenn es jemanden gibt, der nützlich ist oder Fragen hat, lass es mich wissen. Ich konnte nirgendwo irgendwelche WinForm-Beispiele für diesen Code finden. Tatsächlich konnte ich keinen Code finden, um zu zeigen, wie man ohne die UI mit PIN koppelt. Also hoffe ich, dass dies jedem hilft, der vielleicht stecken bleibt.

+0

Siehe Szenario 8 und 9 unter https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DeviceEnumerationAndPairing – Emil

+1

Danke - ich hatte solche Beispiele gefunden. War auf der Suche nach etwas mehr Windows-Formen und direkter. Diese Information scheint wirklich begraben zu sein. –

Verwandte Themen