Bluetooth Kommunikation - Abfrage Trennung

Alle Fragen zur Netzwerkkommunikation
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

Ich habe hier einmal die Kommunikation auf ein mindestmass zusammengestrichen (nicht lauffähig so !!) um zu sehen welche Befehle ich verwende.

Code: Alles auswählen

const
  FIONREAD = $541B;

procedure TBTReadThread.Execute;
var
 readlen:cint32;
 bt_msg: string;
 FDS : Tfdset;
begin
// ....
  s := fpsocket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
 //...
 status := fpconnect(s, @loc_addr, opt);
 // Loop start
 //...
       res:= FpIOCtl(s,FIONREAD,@readlen);
//..
      // Wenn Daten da sind lesen
       cnt:= fprecv(s,Pchar(bt_msg), readlen, 0);
// endLoop

   fpshutdown(s, 0);
end;
Ich erzeuge einen RFComm Socket und Connecte mich dann damit, dann Frage ich in der Threadschleife ab ob Daten gekommen sind (FpIOCtl) wenn welche da sind, hole die ich mir mit fprecv, das blocking ist. Deswegen die Abfrage vorher. Nur was ich nicht mitbekomme ist, wenn das Device die Kommunikation abbricht oder Trennt oder außerhalb der Reichweite ist.

Habt ihr eine Idee, wie ich den Status der Kommunikation (Socket) herausbekommen könnte ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von theo »

Wahrscheinlich ist es wie immer, man muss einen Kommunikationsversuch starten, um eine Fehlermeldung zu bekommen.
S.a.
https://forum.lazarus.freepascal.org/in ... pic=9831.0
http://www.ararat.cz/synapse/doku.php/p ... connection

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

Nicht einmal ein fpwrite endet mit einem Error aktuell. Erst nach etlichen Versuchen mit fpwrite bricht der ab. Sagt brav das er x-Bytes geschrieben hat.
Dann irgendwann ist Ende. Nur das Device mit Befehlen anzusprechen ist bei BT und Geräten mit Akku nicht wirklich sinnvoll.

Ich will genaugenommen die Socket Statusinfos lesen, denn der sollte ja vom BS mitbekommen, das da alles weg ist. Nur sind die ganzen Optionen für fpIOCtl und Konsorten nirgends so wirklich dokumentiert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von theo »


Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

Das Buch ist gut, weil es verschiedenen Varianten beschreibt. Danke für den Link, das kommt in meine Sammlung.

Nur hört es dort auf, wo das wirkliche Leben erst anfängt. Genau von den dort beschriebenen Vorgängen habe ich weggearbeitet. Es zeigt dir, wie du die verschiedenen Kommunikationen startest und beendest. Aber wie man das am laufen hält, ist wie immer ausgespart :-) Überall also 'Hello world'.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 8581
Registriert: Mo 11. Sep 2006, 19:01

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von theo »

Da steht:
So how does one side detect when the other has disconnected?
The recv method will return an empty string. This is the only case where recv does that, which makes it a reliable way of knowing when the connection has been terminated
Es gibt wahrscheinlich nicht viel anderes.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

Nur beisst sich da jetzt einiges. Wenn ich im Thread das fpreceive aufrufe so ist, das blocking. Wenn das blocking ist, so steht der Thread und kann nicht einmal auf ein Terminate antworten, keine Statusinfos geben etc. So jetzt ist das durch das fpIOCtl abgesichert, das nur dann gelesen wird, wenn was da ist. Nur das bekommt keine Info, das der Socket tot ist und liefert immer schön brav 0 zurück, anstatt eines Fehlerstatus.

Schreibe ich was hinaus, so wird das auch schön brav mit erfolgreich quittiert, obwohl nichts mehr über den Socket gesendet werden kann. Erst nach einem langen Timeout, wenn das System bereits zusammenräumt (und die Icons wegnimmt) kommt beim Schreiben eine Fehlermessage. Ok, jetzt arbeite ich mal damit, nur habe ich keinen wirklich sinnvollen Befehl für das Gerät und bekomme noch dazu jedes mal eine Antwort, die ich nicht brauche und die Kommunikation kostet jedes mal Akku. Das ist das was mich am meisten stört.

Das ganze ist ein Handscanner für UHF-RFIDS und 2-D Barcode. Genaugenommen, bekomme ich nur Daten, wenn der Benutzer das auslöst. Bei diesen einem Gerät habe ich im bescheidenen Umfang die Möglichkeit was zu senden, bei anderen ist das gar nicht vorgesehen. Was mache ich dann dort ohne Rückkanal (fpsend).

Unter Windows ist es einfacher, da wird eine einfache virtuelle Comport Verbindung eingerichtet, da kann ich abfragen ob der Comport funktioniert. Das geht hier nicht, da die rfComm Verbindung in die falschen Richtung geht. Der PC spielt rfCom-client und nicht Server. Beim Server würde ich ein Bind machen und ein virtueller rfComport würde sich automatisch binden, wenn das Gerät in der Nähe ist. Das wäre ähnlich dem Windows Version zum Handhaben, spielt es aber leider nicht.

Danke dir Theo, das du mir zusätzlichen Input lieferst, weil manchmal wird man echt blind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 223
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von PascalDragon »

Du könntest schauen, ob du mittels fpSelect mehr erreichen kannst. Damit kannst du quasi warten, bis ein Socket lese- oder schreibbereit ist oder ob es einen Fehler hat. Keine Ahnung, ob das bei RFCOMM Sockets auch funktioniert... Ansonsten halt mal weiter Google bemühen, da dies ja kein FPC spezifisches Problem ist.
FPC Compiler Entwickler

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

PascalDragon hat geschrieben:
Di 6. Okt 2020, 13:28
Du könntest schauen, ob du mittels fpSelect mehr erreichen kannst.
Das kann ich dezitiert ausschliessen, fpSelect funktioniert hier nicht. Das habe ich bereits getestet. Es spiegelt sich Systemzustand mit fpSelect nicht wieder.

fpIOCtl funktiniert zum,indest bei der Erkennung ob schon etwas gekommen ist, das geht problemlos. Nur die ganzen Optionen von fpIOCtl sind nicht wirklich gut beschrieben, zumindest habe ich nichts dazu gefunden was mir hilft. Die Konstaten für fpIOCtl früher auch mal zu finden in Pascal, nur nachdem die scheinbar sehr Versionsspezifisch sind ist das auch herausgenommen worden. Man kann sich nur an die sys/ioctl.h halten und versuchen das Richtige zu erraten
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 223
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von PascalDragon »

af0815 hat geschrieben:
Di 6. Okt 2020, 14:24
fpIOCtl funktiniert zum,indest bei der Erkennung ob schon etwas gekommen ist, das geht problemlos. Nur die ganzen Optionen von fpIOCtl sind nicht wirklich gut beschrieben, zumindest habe ich nichts dazu gefunden was mir hilft. Die Konstaten für fpIOCtl früher auch mal zu finden in Pascal, nur nachdem die scheinbar sehr Versionsspezifisch sind ist das auch herausgenommen worden. Man kann sich nur an die sys/ioctl.h halten und versuchen das Richtige zu erraten
Dann solltest du in der Tat schauen, was andere (in C oder wo auch immer) machen, um das korrekt abzufangen. Das lässt sich dann recht leicht in Pascal portieren.
FPC Compiler Entwickler

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

Das Problem ist, das ich auch nicht wirklich Beispiele in C für diese Problemstellung finde. Das mit der Portierung ist klar.

Aktuell geht mal der Workaround mit dem Schreiben eines sinnlosen Befehls. Den Rest schau ich mir an, sobald die Software beim Kunden reift.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3423
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von mschnell »

Meinst Du eigentlich wirklich "Bluetooth" also die relativ niedrige Kommunikations-Träger Schicht entsprechend "Ethernet" oder "USB", oder doch eigentlich die Kommunikation mit einem Hardware-Device.
Das kann bei Windows ein Problem sein, weil die Standard-Treiber für solche Devices (z.B. Midi) bei Microsoft eine C#-API haben, die vermutlich mit Lazarus / FreePascal nicht verwendbar ist. Für Midi gibt es aber einen 3rd Party Treiber, der über eine Zwischenschicht die Standard-Midi API auch für Bluetooth-Midi-Geräte zur Verfügung stellt.
-Michael

pluto
Lazarusforum e. V.
Beiträge: 7097
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von pluto »

Ich könnte mir vorstellen, dass was in dbus ankommt vom Kernel bzw. von den Bluetooth Treibern.
Was du brauchst, ist die Signal Stärke.

Durchsuch doch mal dbus, nach bluetooth(ich werde es gleich mal machen).... nur so als Idee.
Ich könnte mir auch gut vorstellen, dass es weitere Interfaces gibt. Unter Linux verwende ich "blueman" z.b.
Hier gibt es ein Dienst, der sich um Bluetooth kümmert, vielleicht kann man damit Arbeiten?

Es gibt noch bluetoothctl, welches man von der Console aus bedienen kann.

Edit1, sieht schon mal nicht so schlecht aus, auf den ersten Blick:
https://www.linumiz.com/bluetooth-set-a ... ing-gdbus/

Edit2, hier wird das Thema behandelt:
https://github.com/ukBaz/python-bluezero/issues/176
Dabei suche ich allgemein, nicht auf Lazarus bezogen.

Edit3: Stichwörter für die Suche bisher:
linux bluetooth out range event
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4439
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von af0815 »

Ja ich meine wirklich rfcomm über Bluetooth unter Linux. Nichts anderes.

Windows stellt automatisch Comports zur Verfügung. Wenn die Verbindung abreisst, ist das Programm beim nächsten Schreibzugriff tot. Aber das interssiert mich mal nicht. Mir geht es um Linux.

pluto, ich habe das Gerät durch einen Socket geöffnet im rfcomm Modus. Und wenn was auf der Konsole geht, erklär mir mal, wie ich das in Pascal mache.
Vor allen, wenn ich mal das Gerät in einem Socket verwende, kann kein anderer mit dem Device was machen und umgekehrt. Ausserdem kümmert sich der DBus mehr darum welcher Prozess für das Gerät verwendet werden soll.

Genaugenommen dreht es sich darum wie ich mit fpIOCtl den aktuellen Status herausbekomme. Oder mit einer anderen Statusabfrage an den Socket.

BTW:Ich habe so ziemlich alles was nach Linux und Bluetooth mit rfcomm abgesucht. Die meisten Sachen auf der Shell sind getestet. Soeit zur Theorie, nur Pascal ist die Praxis und das passt noch nicht zur Theorie.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7097
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Bluetooth Kommunikation - Abfrage Trennung

Beitrag von pluto »

OK. Ich kann es derzeit nicht testen. Aber, ich habe das hier gefunden:
https://lists.freepascal.org/fpc-pascal ... 37690.html

Es gibt bei fprecv die Möglichkeit ein Flag anzugeben. In deinem Code ist der auf 0. Also wartet er bis ein Anfrage kommt.
Ist das gerät aber außer Reichweite kommt irgendwann ein TimeOut. Steht jedenfalls bei der Beschreibung zu
MSG_DONTWAIT
Dieses Flag kannst du scheinbar setzten. Vielleicht lässt sich darüber auch eine Signal stärke berechnen.
MFG
Michael Springwald

Antworten