Forum: PC-Programmierung Bluetooth mit einer Universal Windows App


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von F. Frei (Gast)


Lesenswert?

Guten Tag
Ich möchte eine selbstgebaute Hardware (mit PIC Controller) mit einer 
Universal Windows App über Bluetooth ansteuern. Ich habe viele Beispiele 
und NuGets für C# unter Visual Studio ausprobiert. Leider bisher ohne 
Erfolg. Unter anderem fehlt mir wahrscheinlich die Erfahrung.

Das vielversprechendste scheint mir die RFCOMM library zu sein, hat 
damit schon jemand Erfahrungen gemacht?

Auch habe ich es beispielsweise mit dem NuGet BluetoothManager von Rob 
Miles probiert. Ebenfalls ohne Erfolg.

Die Hardware funktioniert. Denn die Kommunikation über ein 
PuTTy-Terminal klappt ohne Probleme.

Schlussendlich soll ich mich verbinden und einzelne Characters oder 
Strings schicken können.

Vielen Dank bereits im Voraus für eure Hilfe! Ich bin für jeden Tipp 
dankbar :)

von Mathias O. (m-obi)


Lesenswert?

Gut ich arbeite viel mit C++ unter Qt und würde es dann dort mit dem 
Bluetooth Modul probieren.

http://doc.qt.io/qt-5/bluetooth-examples.html

von Kaj (Gast)


Lesenswert?

Bluetooth unter Windos ist, schlicht gesagt, zum kotzen.

Kleines Beispiel:
Qt hat ein Beispielprojekt (Heartrate Service) , mit dem man sich den 
Herzschlag von einem Brustgurt holen und anzeigen lassen kann. Das 
funktioniert unter Linux total super, nur unter Windows nicht.

Zum Glueck bietet Visual Studio auch viele Beispiele.
Wenn man da sucht, gibt es auch unter VS ein Beispielprojekt fuer einen 
Heartrate Service (in C#, C++, JavaScript, etc).

Der Unterschied zwischen Linux und Windows an dieser stelle:
Linux:
Anwendung starten, die Anwendung pairt sich mit dem Brustgurt und alles 
ist schoen.

Windows:
Man muss erst in die Systemsteuerung, um Windows mit dem Brustgurt zu 
pairen, und erst dann kann das VS-Beispiel sich mit dem Brustgurt 
verbinden.
Das Qt-Beispiel funktioniert nicht! Das liegt aber nicht an Qt sondern 
an M$.

Unter Windows kann man sich nicht direkt aus dem Programm mit dem 
Device verbinden, man muss immer den manuellen weg ueber die 
Systemsteuerung gehen.

von bluppdidupp (Gast)


Lesenswert?

Kaj schrieb:
> Unter Windows kann man sich nicht direkt aus dem Programm mit dem
> Device verbinden, man muss immer den manuellen weg ueber die
> Systemsteuerung gehen.

Das hängt vom Bluetooth-Stack ab.
Mit dem Microsoft Stack geht das über die 
BluetoothAuthenticateDevice*()-Funktionen.
Mit anderen Stacks geht es meist auch, da könnte man schauen wie es hier 
gelöst wurde: 
https://32feet.codeplex.com/wikipage?title=Bluetooth%20Security&referringTitle=Documentation

Für UWP-Apps gibt es hier Beispielcode:
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DeviceEnumerationAndPairing

von Kaj (Gast)


Lesenswert?

bluppdidupp schrieb:
> Das hängt vom Bluetooth-Stack ab.
> Mit dem Microsoft Stack geht das über die
> BluetoothAuthenticateDevice*()-Funktionen.
Interessant... und warum nutzt Microsoft dass dann (offenbar) nicht in 
seinen eigenen Beispiel-Anwendungen?

von Vlad T. (vlad_tepesch)


Lesenswert?

Kaj schrieb:
> Unter Windows kann man sich nicht direkt aus dem Programm mit dem
> Device verbinden, man muss immer den manuellen weg ueber die
> Systemsteuerung gehen.

man könnte das auch als Sicherheitsfeature bezeichnen.

von Jim M. (turboj)


Lesenswert?

Kaj schrieb:
> Interessant... und warum nutzt Microsoft dass dann (offenbar) nicht in
> seinen eigenen Beispiel-Anwendungen?

Weil das nur für Bluetooth Classic funktioniert und das o.g. Beispiel 
für Low Energy war?

von Olaf (Gast)


Lesenswert?

> Weil das nur für Bluetooth Classic funktioniert und das o.g. Beispiel
> für Low Energy war?

Richtig. Ihr muesst das unterscheiden! Beides hat nichts miteinander 
zutun.
Bei BLE liefert die QT Klasse zum scannen der Devices unter Windows eine 
Fehlermeldung zurueck die besagt das diese Funktion bei Windows8.1 nicht 
implementiert ist. (und bei 7 sowieso nicht)

Olaf

von bluppdidupp (Gast)


Lesenswert?

Die Native-API (die die meisten Libs verwenden) kann BLE glaube ich 
überhaupt nicht, dazu muss vermutlich UWP verwendet werden.
Ich hab weder ein BLE-Device noch BLE-fähigen PC-Adapter zur Hand und 
kanns nicht testen, aber zumindest Geräte mit 2.x-er BT-Version laufen 
bei mir auch noch in UWP.

von Marc S. (darkchaos)


Lesenswert?

Also zunächst mal wäre es natürlich interessant was du PIC seitig tust 
und wie du dir da sicher bist, dass es klappt.

Du schreibst es funktioniert mit PuTTY, meinst du da zufällig USART?

Es ist so: Bluetooth ist immer ein bisschen knifflig, ich hatte selbst 
unter Debian (Gut, das war ein Raspi mit USB-Bluetooth Dongle und dann 
auch noch Python) ein paar Problemchen, aber das lag zunächst auch an 
meinem Verständnis von Bluetooth.

RFCOMM z.B. ist eigentlich keine Library (es sei denn, es gibt auch eine 
Library diesen namens), sondern eine Art Protokoll, mit dem zugehörigen 
Serial Port Profile.

Bluetooth spezifiziert genaue Gerätetypen und Funktionalitäten, d.h. 
meistens sendest du nicht einfach Daten auf Low-Level Ebene sondern 
nutzt ein passendes Profile. Da gäbe es jetzt natürlich diese ganzen 
Freisprecheinrichtung-Dinger, aber da du ja keinen Sound möchtest, nutzt 
du das Serial Port Profile.

Was auch noch wichtig ist: Bluetooth funktioniert "in etwa" wie TCP/IP: 
Du hast eine MAC Adresse (TCP: IP-Adresse) und einen Channel (TCP: 
Port).

Wichtig ist, dass du zunächst die Device Services scannst um 
herauszufinden auf welchem Channel denn überhaupt RFCOMM angeboten wird.

Um in der Analogie weiter zu machen: Am Port muss natürlich ein Server 
laufen, d.h. du musst deinen PIC in den "RFCOMM-Server-Modus" schicken, 
denn nur dann akzeptiert er die Verbindung vom PC.

Da gibt es natürlich auch die Möglichkeit den PC als RFCOMM Server 
laufen zu lassen und dein PIC scannt ständig nach verfügbaren PCs und 
verbindet sich (So kannst du z.B. verhindern, dass ein fremder sich zum 
PIC verbindet). Der Nachteil hierbei ist, dass es auf Android schier 
unmöglich ist, einen RFCOMM Server hinzubekommen. Ich habe es versucht, 
und wenn es mal klappte, dann brach die Verbindung recht schnell 
zusammen.


Damit wären wir auch beim Ultimativen Tipp: Es gibt zig Bluetooth Serial 
Consoles für Android, mit denen du dich zu deinem PIC verbinden kannst, 
um ihn als Fehlerquelle auszuschließen. Ein paar die ich für meine Tests 
hatte: "BlueTerm, Bluetooth Console, BlueTooth Serial Conne(..), 
Bluetooth Terminal". Ich weiß aber nicht mehr, welches gut war :P

Für's iPhone mags das auch geben aber ich meine mal gelesen zu haben, 
dass die RFComm irgendwie erschweren bzw. eben nur den Headset Modus 
möchten.


RFCOMM funktioniert dann wie eine Serielle Konsole, also USART.
Ich bin jetzt hier nicht auf das Pairing eingegangen, aber das macht 
Windows ja offenbar via System schon, also liegt es außerhalb deiner 
Software.


PS: Du schreibst du hattest kein Erfolg, sagst aber nicht genau WO das 
Problem lag, das ist natürlich schlecht^^ Konntest du pairen und 
lediglich nicht connecten?

von F. Frei (Gast)


Lesenswert?

Hallo erstmal

Danke für die Antworten und Tipps! Inzwischen konnte ich das Problem 
lösen.

Stimmt, ich habs vielleicht etwas ungenau beschrieben. Also ich steuere 
mit meinem PIC ein RN42 Bluetooth Module an. Ich konnte das Modul mit 
meinem PC koppeln und dann mit PuTTY über den entsprechenden COMx (siehe 
Gerätemanager rechtsklick aufs verbundene Bluetooth Module) den PIC 
ansteuern.

Noch zu meiner Lösung:

Ich benutze nun bei meiner Universal Windows App das NuGet 
"BluetoothManager" ( http://www.robmiles.com/bluetooth-manager/ ). Das 
Beispiel auf dieser Internetseite funktioniert gut. Jedoch muss man 
zusätzlich im File "Package.appmanifest" das Bluetooth freischalten mit 
folgenden Zeilen:

<Capabilities>
  <DeviceCapability Name="bluetooth.rfcomm">
    <Device Id="any">
      <Function Type="serviceId:00001101-0000-1000-8000-00805F9B34FB"/>
    </Device>
  </DeviceCapability>
</Capabilities>

Dabei war mein Fehler am Anfang, dass ich die falsche serviceId benutzt 
habe. Die einfachen Fehler sucht man doch immer am längsten ;-)

Nun funktioniert alles einwandfrei. Ich kann mich direkt in der App mit 
meinem Device koppeln und Commands senden. Das Empfangen muss ich jedoch 
noch testen. :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.