Laden...

In eine Bluetooth characteristic schreiben

Erstellt von Kazooie vor 2 Jahren Letzter Beitrag vor 2 Jahren 349 Views
K
Kazooie Themenstarter:in
6 Beiträge seit 2022
vor 2 Jahren
In eine Bluetooth characteristic schreiben

Hallo

Ich bekomme es nicht hin einen Wert in eine Bluetooth characteristic zu schreiben.

Meine App baut einen BLE Server beim Start auf und kreiert einen Service mit 3 verschiedenen characteristics.

Das Schreiben in eine characteristic müsste ja in etwa so aussehen


await selectedCharacteristic.WriteValueAsync(writer.DetachBuffer());

ein Dorn im Auge ist mir selectedCharcteristic.

Im Microsoft Beispiel wird dieser Wert folgendermaßen erzeugt:


selectedCharacteristic = (GattCharacteristic)((ComboBoxItem)CharacteristicList.SelectedItem)?.Tag;

Leider werde ich da nicht schlau draus.
Ich habe und will keine ComboBox, also wollte ich eine UUID direkt eintragen, VS nimmt aber nichts an.
Es steht dann immer ".. kann nicht impilziert in Windows.Devices.Bluetooth.GenericAttributeProfile.GattCharacteristic konvertiert werden"

Meine Frage lautet nun also wie kann ich


private GattCharacteristic selectedCharacteristic;

befüllen mit meiner UUID?

Sorry für die Noob Frage, ich beschäftige mich erst seit kurzem mit dem Thema. Alles andere wie notify usw. funktioniert.
Auch kann ich einen static Wert in die characteristics setzen, aber das ist ja nicht Sinn der Sache. Die Werte ändern sich über die Zeit.

D
261 Beiträge seit 2015
vor 2 Jahren

Ich kenn mich zwar nicht mit dem Bluetooth Details aus, aber in dem Quellcode siehst du wie das Tag der Combobox gesetzt wird: https://github.com/microsoft/Windows-universal-samples/blob/main/Samples/BluetoothLE/cs/Scenario2_Client.xaml.cs

Das musst du halt ähnlich bei dir machen. (Nur halt ohne Combobox)
Also alle Services (sind vermutlich die Bluetooth Geräte?) via bluetoothLeDevice.GetGattServicesAsync(BluetoothCacheMode.Uncached); holen und dann halt den richtigen in der/dem Liste/Array auswählen.

Im Microsoft Beispiel wird dieser Wert folgendermaßen erzeugt:

Für die Zukunft solltest du die erwähnten Beispiele verlinken, dann müssen die Helfer nicht selbst danach suchen.

K
Kazooie Themenstarter:in
6 Beiträge seit 2022
vor 2 Jahren

Danke @dannoe
Stimmt, sorry, nächstes mal verlinke ich direkt 😉

Leider habe ich es immer noch nicht hinbekommen.
Ich verfolge zwei verschiedene Ansätze aktuell und würde gerne erstmal den ersten präsentieren:


public async void ConnectDevice()

{
var myDevicesResult = await DeviceInformation.FindAllAsync(BluetoothLEDevice.GetDeviceSelectorFromDeviceName("MyServer")); // Der DeviceWatcher hat "MyServer" noch nicht in seiner List, daher funktioniert der Code momentan noch nicht
DeviceInformation di = myDevicesResult.First();

BluetoothLEDevice bleDevice = await BluetoothLEDevice.FromIdAsync(di.Id);
var serviceResult = await bleDevice.GetGattServicesAsync();

var service = serviceResult.Services[0];
GattCharacteristicsResult charResult = await service.GetCharacteristicsAsync(BluetoothCacheMode.Cached);
var characteristics = charResult.Characteristics;

selectedCharacteristic = characteristics[0];
}

Es funktioniert noch nicht, da Devicewatcher mein Gerät noch nicht in seiner Liste hat.
Aber irgendwie kommmt mir das alles falsch vor.

Es kann doch nicht sein, dass ich einen Server starten kann und dann, um in eine Characteristic zu schreiben
erst dieses ganze andere Gedöns machen muss?!
Immerhin habe ich den Server ja wie gesagt selber gestartet und ich kann ja bereits Notifcations schicken.

Der andere Ansatz wäre dieser:


GattLocalCharacteristicResult result = await serviceProvider.Service.CreateCharacteristicAsync(Constants.ModusCharacteristicUuid, Constants.gattOperandParameters); // Hier wird eine Characteristic erstellt
modeCharacteristic = result.Characteristic;
modeCharacteristic.WriteRequested += WriteRequestTestAsync; // Jedes Mal, wenn geschrieben werden soll, wird WriteRequestTestAsync gestartet


  private async void WriteRequestTestAsync(GattWriteRequestedEventArgs args)
        {
            using (args.GetDeferral())
            {
                GattWriteRequest requestTest = await args.GetRequestAsync();

                ProcessWriteCharacteristicTest(requestTest);
            }

        }

        private void ProcessWriteCharacteristicTest(GattWriteRequest requestTest)
        {
            requestTest.Respond();
        }


Für mich sieht das aus, als ob ich damit auch in die Characteristic schreiben kann. Oder liege ich da falsch?
Leider bin ich noch zu sehr Anfänger, dass ich nicht weiß, wie manuell einen Write-Befehl ausführen kann mit diesem Code.


WriteRequestTestAsync(1); 

funktioniert nicht und casten kann ich den Spaß ja scheinbar auch nicht


WriteRequestTestAsync((GattWriteRequestedEventArgs)1);