ubuntuusers.de

Grundsätzliche Probleme mit Bluetooth-Programmierung in C

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 24.04 (Noble Numbat)
Antworten |

mickpf

Avatar von mickpf

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 55

Wohnort: Planet Earth

Hallo,

Ich betreibe zwei Computer mit Linux: Einen Microsoft Surface Pro 8 mit Ubuntu 24.04, und einen Microsoft Surface Go 2 mit Debian 13 (trixie). Auf beiden wird die Software wöchentlich aktualisiert.

Das Bluetooth-System 'BlueZ' funktioniert gut. Ich kann nach verfügbaren Geräten scannen, mit diversen Geräten eine Verbindung aufbauen etc.

Ich habe ein Programm in C geschrieben, das ich um die Kommunikation mit Sensoren über Bluetooth bzw. über BLE erweitern möchte.

Bevor ich mich an diese Programmierung trauen kann, wollte ich einige Beispiele mit Sourcecode aus dem Internet kompilieren, untersuchen, laufen lassen bzw. debuggen.

Aber alle diese Beispiele (mit Ausnahme von toolBLEx, das in C++ und qml geschrieben und daher kaum zu verstehen ist) funktionieren nicht. Wenn ich die Beispielprogramme (auch als Benutzer 'root') laufen lasse, finden sie beim Scannen uberhaupt keine Geräte. Einige dieser Programme, die mit Aufrufen von 'ioctl' statt der Bibliothek 'bluetooth' arbeiten, bringen "I/O error". Ich habe meinen Benutzer der Gruppe 'bluetooth' hinzugefügt, aber das hat auch nichts geändert.

Hat jemand eine Idee, woran es liegen und wie ich weiterkommen könnte?

Mit Dank im Voraus Michael

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4785

Wohnort: Berlin

Es liegt vielleicht an der Konfiguration, vielleicht an Fehlern im Quelltext, vielleicht an der Mondphase…

Das ist halt ein bisschen schwierig zu sagen, wenn man nicht weis was Du da genau machst. 🤷‍♂️

Der bluetooth.service läuft? Scannen mit bluetoothctl funktioniert und bringt Ergebnisse?

mickpf

(Themenstarter)
Avatar von mickpf

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 55

Wohnort: Planet Earth

bluetooth.service läuft. bluetoothctl funktioniert, soweit ich es testen konnte (scan und scan le).

Hier ist das "klassische" Programmchen, das keine Ergebnisse ausgibt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

int main(int argc, char **argv)
{
    int             max_rsp, num_rsp;
    int             dev_id, sock, len, flags;
    int             i;
    char            addr[19] = { 0 };
    char            name[248] = { 0 };
    inquiry_info   *ii = NULL;

    dev_id = hci_get_route(NULL);
    sock = hci_open_dev( dev_id );
    if (dev_id < 0 || sock < 0) {
        perror("opening socket");
        exit(1);
    }

    len = 8;
    max_rsp = 255;
    flags = IREQ_CACHE_FLUSH;
    flags = 0;
    ii = (inquiry_info*) malloc(max_rsp * sizeof(inquiry_info));
    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
    if( num_rsp < 0 )
        perror("hci_inquiry");
    for (i = 0; i < num_rsp; i++) {
        ba2str(&(ii+i)->bdaddr, addr);
        memset(name, 0, sizeof(name));
        if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), name, 0) < 0)
            strcpy(name, "[unknown]");
        printf("%s %s\n", addr, name);
    }
    free( ii );
    close( sock );
    return 0;
}

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17675

Wohnort: Berlin

Welchen Sinn hat, flags in Zeile 7 auf IREQ_CACHE_FLUSH zu setzen …

1
2
flags = IREQ_CACHE_FLUSH;
flags = 0;

um sie eine Zeile später auf 0 zu setzen?

mickpf

(Themenstarter)
Avatar von mickpf

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 55

Wohnort: Planet Earth

Nun, nachdem es mit der Zeile

1
    flags = IREQ_CACHE_FLUSH;

nicht geklappt hat, habe ich es mit der Zeile

1
    flags = 0;

probiert, ohne die vorherige zu löschen!

Werde ich jetzt für diesen fatalen Fehler erschossen? ☹

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10869

Marc_BlackJack_Rintsch schrieb:

Der bluetooth.service läuft?

Scannen mit bluetoothctl funktioniert und bringt Ergebnisse?

Bitte beantworte doch diese beiden Fragen und zeige entweder die Ergebnisse oder die Fehlermeldungen.

mickpf

(Themenstarter)
Avatar von mickpf

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 55

Wohnort: Planet Earth

  1. Ich habe diese beiden Fragen weiter oben über dem Quelltext eines Programmchens beantwortet!

  2. Bis auf die bereits genannte Fehlermeldung "I/O Error" (in einem anderen Programmchen) bleiben alle stumm. In diesem Programmchen liefert der Aufruf von 'hci_inquiry' den Wert 0 zurück, was bedeutet: "Keine Bluetooth-Geräte gefunden".

Berlin_1946 Team-Icon

Supporter, Wikiteam

Anmeldungsdatum:
18. September 2009

Beiträge: 10869

mickpf schrieb:

  1. Ich habe diese beiden Fragen weiter oben über dem Quelltext eines Programmchens beantwortet!

soweit ich es testen konnte

Das ist für mich eine massive Einschränkung deiner Antwort, da wir nicht wissen, was du unter "soweit" meinst und was du genau getestet hast.

mickpf schrieb:

... (in einem anderen Programmchen)

Von wie vielen Programmen reden wir hier?

#include <stdio.h>                 // Zeile 1
#include <stdlib.h>                // Zeile 2
#include <string.h>                // Zeile 3 – neu
#include <unistd.h>                // Zeile 4
#include <sys/socket.h>             // Zeile 5
#include <bluetooth/bluetooth.h>   // Zeile 6
#include <bluetooth/hci.h>         // Zeile 7
#include <bluetooth/hci_lib.h>     // Zeile 8

wäre mein Vorschlag.

Antworten |