Laden...

Forenbeiträge von Kazooie Ingesamt 6 Beiträge

19.03.2022 - 01:00 Uhr

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

15.03.2022 - 04:00 Uhr

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.

13.03.2022 - 01:35 Uhr

Oh sorry, ich habe mich eventuell falsch ausgedrückt.
Ich wollte nur wissen, ob man das Microsoft Example, was ich oben verlinkt hatte, als WPF App ausführen kann.

Und JA, es geht tatsächlich. Ich habe es nun hinbekommen, unter .net 6.0
Bei dem Bluetooth Beispiel ist es scheinbar wichtig, dass zuerst der Befehl:
peripheralSupported = await CheckPeripheralRoleSupportAsync();

ausgeführt wird.
Das hatte ich gestern übersehen, nun läuft es wie in der UWP App.

Und mit WPF kann ich nun wunderbar die Systemtray Geschichten machen, die ich benötige. Herrlich 🙂

12.03.2022 - 02:54 Uhr

Habe vorhin mal eine WPF App draus gemacht mit .NET 6.0 als Zielplattform.
Leider der selbe Effekt. Programm startet, führt den Bluetooth Code zum Starten vom Server aus aber kein Server wird erstellt.

11.03.2022 - 22:50 Uhr

Danke erstmal für die Infos.
Es handelt sich hier nur um ein kleines Hobbyprojekt von mir. BLE Server plus ein bisschen xaml Kram. Mehr ist es nicht.
Die Microsoft BLE Examples kamen mir da gerade recht.

Woran ich nicht gedacht hatte war, dass die App in den Systray Bereich von Windows 10 soll. Ich bin einfach naiv davon ausgegangen, dass man das mit UWP machen kann.

Es gibt hier eine Art Workaround: https://stefanwick.com/2017/06/24/uwp-app-with-systray-extension/
ein Beispiel, wie man seine UWP App quasi behalten kann und mit einer WinForm App alles im Hintergrund abwickeln kann.
Das war der ursprüngliche Plan. Quasi den Bluetooth Part in die WinForm App verschieben, die dann im Hintergrund rumdümpelt.
Die UWP App hätte ich dann einfach nurnoch für Settings bentutz, die local gespeichert werden.

WPF und Systray ist ja sicher auch möglich.
Wäre es denn denkbar, dass ich den BLE Server mit einer WPF App starten kann? Ich beziehe mich auf folgendes Microsoft Example:
Windows-universal-samples/Samples/BluetoothLE at main · microsoft/Windows-universal-samples
Szenario 3, Server foreground

Das werde ich auf jeden Fall ausprobieren.
Dann könnte ich mein xaml Gerüst vermutlich mehr oder weniger mitnehmen und müsste nicht mit AppService zwischen zwei Apps hin und her kommunizieren.

11.03.2022 - 21:17 Uhr

Hallo

Ich versuche gerade meine UWP-App, ein Bluetooth BLE Server, zu einer WinForm App zu konvertieren.
Leider kann man UWP Apps, minimiert, nicht in den System-Tray Bereich von Windows 10 verfrachten.
Mit WinForms Apps geht das gut.

Der Code, um den Bluetooth Server zu starten ist exakt der gleiche in der .net framework (winforms) Version, wie in der UWP Version.
Leider funktioniert der Code aber nur als UWP Projekt. (Der Code stammt von einem Microsoft Beispiel)

An der Stelle, wo dann die UWP App den Code
serviceProvider.StartAdvertising(advParameters);
ausführt, kann ich mit meinem Handy per nRF Connect auch den Server sehen und connecten.

Bei der WinForms Version passiert allerdings nichts. Kein Server wird aufgebaut.
Wenn ich im Debugger die Schritte durchgehe, durchläuft das Programm exakt den Code, der den Server starten sollte.

Ich bin noch Neu im Thema, deshalb glaube ich, dass ich etwas grundlegendes falsch gemacht habe.

Meine Vermutung ist, dass nicht die richtigen .dll Datein geladen werden in der WinForms Version.
Bei der UWP App stand auch bei Ausgabe was von Bluetooth.dll, bei der winforms Version nicht.
Nachtrag:
Wenn ich die WinForms App über ein Paket Projekt starte, und im Paket-Manifest Bluetooth Unterstützung anklicke, wird auch eine Bluetooth.dll geladen.
Der Server startet nur leider auch dann nicht.

Vermutlich ist es falsch anzunehmen, nur weil der Code ohne Fehler kompiliert, dass ein Programm dann auch funktioniert.
Eigentlich logisch, bloß ist der Code für den BLE Server in diesem Fall 1:1 mit der UWP Version identisch.

Und da Visual Studio nicht rummeckert, bin ich fürs erste mit meinem Latein am Ende.

Könnt ihr mir weiterhelfen bzw. habt ihr schon eine Vorahnung, was da nicht rund läuft eventuell?
Ich habe absichtlich jetzt kein Code mitgeliefert, da ich nicht weiß, welcher Part relevant sein könnte.