Windows UWP Verbindung zu BLE Gerät nach Entdeckung
Ich bin mit BluetoothLEAdvertisementWatcher
zu finden, in der Nähe BLE-Geräten und es funktioniert gut. Nachdem Sie zu finden, die ich verwenden möchten, verbinden und Lesen/schreiben von Daten via GATT. Aber ich kann nicht herausfinden, wie die API zu verwenden, nachdem die BluetoothLEAdvertisement
(https://msdn.microsoft.com/de-de/library/windows/apps/windows.devices.bluetooth.genericattributeprofile).
public class Adapter
{
private readonly BluetoothLEAdvertisementWatcher _bleWatcher = new BluetoothLEAdvertisementWatcher();
public Adapter()
{
_bleWatcher.Received += BleWatcherOnReceived;
}
private void BleWatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
//how to connect?
//I know, it's the wrong place to to this, but this is just an example
}
public void StartScanningForDevices(Guid[] serviceUuids)
{
_blewatcher.advertisementfilter.advertisement.serviceuuids.clear();
foreach (var uuid in serviceuuids)
{
_blewatcher.advertisementfilter.advertisement.serviceuuids.add(uuid);
}
_blewatcher.start();
}
}
Habe ich gefunden, die Proben, die mit DeviceInformation.FindAllAsync
statt BluetoothLEAdvertisementWatcher
diese sind aber nicht die Arbeit /Suche nach jedem Gerät.
UPDATE
Nach dem Graben um einige Zeit, die ich den folgenden Weg gefunden. Aber leider ist die Kopplung fehlschlägt. Das Gerät ist nur ein Arduino mit einem von der BLE shield. Ich kann auf jeden Fall verbinden mit Android und iOS. So muss es möglich sein, mit UWP irgendwie. :/
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);
}
UPDATE #2
Ich bin jetzt in der Lage zu entdecken, und ein paar (instabil, aber ok für jetzt), aber
var service = await GattDeviceService.FromIdAsync(args.Id);
wirft die folgende Ausnahme
System.IO.FileNotFoundException:
Das system kann nicht die angegebene Datei gefunden werden. (Ausnahme von HRESULT: 0x80070002)
Ich habe keine Ahnung, warum.
InformationsquelleAutor der Frage Sven-Michael Stübe | 2016-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE 04/17 - MACHER-UPDATE
Microsoft aktualisiert haben Ihre Bluetooth-APIs. Wir haben jetzt ungepaarten BLE-Gerät-Kommunikation!
Haben Sie sehr wenig Dokumentation bis hin im moment, aber hier ist der wesentlich vereinfachte neue Struktur:
Jetzt viel besser. Wie ich sagte, es gibt so gut wie keine Dokumentation im moment, ich habe ein sonderbares Problem wo meine ValueChanged-callback-Haltestellen genannt wird, nach 30 Sekunden oder so, obwohl das scheint zu sein, einen gesonderten scoping-Problem.
UPDATE 2 - EINIGE VERRÜCKTHEIT
Nach etwas mehr Herumspielen mit dem neuen Schöpfer-update gibt es ein paar mehr Dinge zu beachten, wenn Gebäude BLE apps.
ValueChanged
auf diecharac
Sie können dieses Problem. Dies ist, weil dieGattCharacteristic
entsorgt wird, bevor es sein sollte, legen Sie die Eigenschaft als global und nicht sich auf es kopiert werden.App.xml.cs
OnSuspended
Rückruf zum beenden von verbindungen. Andernfalls erhalten Sie ein wenig von einer seltsamen Zustand, in dem Windows scheint zu halten (und Lesen!!) die BLE-Verbindung.Gut es hat seine Macken aber es funktioniert!
ALTE ANTWORT
Nachdem Jason die richtige Antwort über die Geräte müssen gekoppelt werden, um Ihre Dienstleistungen entdeckt werden, ist hier einige Beispiel-code an diese Adresse:
Die wichtigsten Dinge, die hier zu beachten sind:
InformationsquelleAutor der Antwort Gerard Wilkinson
UPDATE (5/5/16): "Element Nicht Gefunden" Fehler Problem scheint nur geschehen, wenn der bluetooth-Bildschirm "Einstellungen" nicht öffnen/Scannen. Ich kann mich nicht erinnern, dass der Fall vor 10586.218 aber das habe ich noch nicht überprüft. Natürlich, nicht jedes Problem wird behoben, in update.
UPDATE (4/29/16): Die 10586.218 windows update zu haben scheint behoben, das problem der Kopplung mit einem Gerät, das hat noch nie gekoppelt wurde, um die Maschine (oder Mobiltelefon) vor. Der Prozess, den ich umrissen habe hier und Gerard Wilkinson-Beispiel-code in seine Antwort sollte mehr arbeiten konsequent jetzt.
Wenn Sie Glück genug, um diese zu arbeiten, Bedarf es warten, eine beträchtliche Menge an Zeit für die Treiber zu installieren. Ich habe es getan, indem beide BluetoothLEAdvertisementWatcher und ein DeviceWatcher gleichzeitig laufen.
Speichern der DeviceInformation aus der BluetoothLEDevice, dass Sie aus der FromBluetoothAddressAsync() then Dispose() die BluetoothLEDevice vor Einleitung der Paarung. Das ist wichtig. Wenn Sie nicht, es zu sehen, nicht die Gatt-Dienste nach der Paarung.
Dann warten, bis die DeviceWatcher zu sehen, das gekoppelte Gerät. Es kann Minuten dauern, aber Sie werden in der Regel erhalten Sie vor dem Fortschrittsbalken für das Gerät zu installieren (in der Bluetooth-Systemsteuerung) bekommt zu 100%. Wenn FromIdAsync immer noch nicht, es bedeutet in der Regel, es war ein Treiber Fehler bei der installation. Sie können Sie auf Pairing aufheben und führen dann den pairing-Vorgang immer wieder. Das funktioniert in der Regel für mich.
Es ist sehr instabil, obwohl, und es scheint zu sein, hängt davon ab, welche Bluetooth-Chipsatz und-Treiber, die die Maschine verfügt. Ich bekomme oft ein Element Nicht Gefunden " - Fehler mit FromBluetoothAddress aber wenn es vorbei es ist, ist die Verbindung funktioniert in der Regel am ersten oder zweiten Versuch.
PairAsync und UnpairAsync auch gebucht werden müssen, um den UI-thread. Wenn es nicht in der Lage, um pop-up ein blaues Dialogfenster zur Autorisierung erhalten Sie, die Ausnahmen. Sie können Post() aus einer gespeicherten UI-SynchronizationContext oder Windows.ApplicationModel.Core.CoreApplication.MainView.Dispatcher.RunAsync() mit einem asynchronen Delegaten, dies zu tun.
Ich gesehen habe mehrere Beiträge von MS-Mitarbeitern in den Foren sagen FromBluetoothAddressAsync() funktioniert nur für gekoppelte Geräte. Dies ist nicht der Fall, aber es ist buggy und scheint zu funktionieren am besten, wenn das Gerät gekoppelt wurde manuell mindestens einmal in der Vergangenheit.
InformationsquelleAutor der Antwort Jason S. Clary
Gerard Wilkinson ' s Antwort ist richtig. Das Leben leichter zu machen, drehte ich Sie in einem erwartbaren Methode mit Reactive Extensions (). Jegliche Kommentare sind willkommen.
Also, wenn Sie das Gerät gefunden mit dem BluetoothLEAdvertisementWatcher und mit ihm gekoppelt ist, können Sie verwenden Sie diese Option, damit GATTServices.
InformationsquelleAutor der Antwort LanderV
Im Grunde haben Sie die Antwort teilweise in den Fragen. Im wesentlichen verwenden Sie die BluetoothLEAdvertisementWatcher für das finden der Geräte nur, im Grunde funktionieren Sie genauso wie die Leuchttürme.
Und Sie werden nicht angenommen, zum anschließen dieser Geräte ist nur durch Nutzung dieser API. Verbinden Sie die Geräte, die Sie verwenden müssen, DeviceInformation.FindAllAsync(), und um es Ihnen zu zeigen, alle Geräte, die Sie tun müssen, verbinden Sie Sie zuerst.
Sowieso, wenn Sie interessiert sind, bekommen Daten von einigen spezifischen BLE Merkmale, die Sie könnten versuchen, mit GattCharacteristicNotificationTriggerfür full-Beispiel & ein bisschen zusätzliche Erklärungen siehe mein blog.
InformationsquelleAutor der Antwort Dr.Jukka