Zoeken…


In C, met Bluez

int get_l2cap_connection () {

Ten eerste volgen alle variabelen die we nodig hebben, uitleg voor op de juiste plek.

    int ssock = 0;
    int csock = 0;
    int reuse_addr = 1;
    struct sockaddr_l2 src_addr;
    struct bt_security bt_sec;
    int result = 0;

Eerst moeten we een socket maken waarmee we een verbinding kunnen accepteren. De PF_BLUETOOTH is PF_BLUETOOTH , het PF_BLUETOOTH is SOCK_SEQPACKET (we willen een TCP-achtige socket hebben, niet raw) en het protocol is het Bluetooth-protocol L2CAP ( BTPROTO_L2CAP ).

    ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);

We willen ervoor zorgen dat het succesvol was:

    if (ssock < 0) {
        perror("Opening L2CAP socket failed");
        return -1;
    }

We moeten nu de bronadresstructuur vullen met een jokertekenadres, zodat elk Bluetooth-apparaat met elk adres verbinding met ons kan maken. Het jokertekenadres is gedefinieerd als BDADDR_ANY in bluetooth.h . Om het naar de bacpy te kopiëren, kunnen we de bacpy functie gebruiken. We moeten ook de adresfamilie, het adrestype en de kanaal-ID instellen.

    memset(&src_addr, 0, sizeof(src_addr));
    bacpy(&src_addr.l2_bdaddr, BDADDR_ANY);
    src_addr.l2_family = AF_BLUETOOTH;
    src_addr.l2_bdaddr_type = BDADDR_LE_PUBLIC;
    src_addr.l2_cid = htobs(CID_ATT);

Als u de optie SO_REUSEADDR instelt, kunnen we indien nodig snel opnieuw binden aanroepen (dit kan worden weggelaten):

    setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));

Vervolgens moeten we de socket binden met de bronadresstructuur die we zojuist hebben gedefinieerd. Nogmaals, we controleren de retourwaarde om te controleren of deze werkte.

    result = bind(ssock, (struct sockaddr*) &src_addr, sizeof(src_addr));
    if (result < 0) {
        perror("Binding L2CAP socket failed");
        return -1;
    }

De volgende stap is het instellen van het beveiligingsniveau. Merk op dat deze stap optioneel is, maar door het beveiligingsniveau op MEDIUM in te stellen, wordt automatisch koppelen met het apparaat mogelijk (de kernel zorgt voor het feitelijke koppelen).

    memset(&bt_sec, 0, sizeof(bt_sec));
    bt_sec.level = BT_SECURITY_MEDIUM;
    result = setsockopt(ssock, SOL_BLUETOOTH, BT_SECURITY, &bt_sec, sizeof(bt_sec));
    if (result != 0) {
        perrorno("Setting L2CAP security level failed");
        return -1;
    }

Nu kunnen we de kernel vertellen dat onze ssock een passieve socket is, die een verbinding accepteert. De tweede parameter is de achterstand. Als je meer wilt weten, bevat de manpage van listen alle informatie die je nodig hebt.

    result = listen(ssock, 10);
    if (result < 0) {
        perror("Listening on L2CAP socket failed");
        return -1;
    }

Nu kunnen we wachten op een inkomende verbinding. De peer_addr-structuur zal het adres van het verbonden apparaat bevatten, zodra retouren worden geaccepteerd. csock is de bestandsdescriptor van de socket waarnaar we kunnen lezen / schrijven om met het verbonden apparaat te communiceren.

    memset(peer_addr, 0, sizeof(*peer_addr));
    socklen_t addrlen = sizeof(*peer_addr);
    csock = accept(ssock, (struct sockaddr*)peer_addr, &addrlen);
    if (csock < 0) {
        perror("Accepting connection on L2CAP socket failed");
        return -1;
    }

We kunnen het adres van het aangesloten apparaat afdrukken (optioneel, natuurlijk). We kunnen de batostr-functie gebruiken om het Bluetooth-adres om te zetten in een string.

    printf("Accepted connection from %s", batostr(&peer_addr->l2_bdaddr));

Als we niet willen dat andere apparaten verbinding maken, moeten we de serveraansluiting sluiten. Doe hetzelfde met csock, nadat uw communicatie met het apparaat is voltooid.

    close(ssock);
    return csock;
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow