bluetooth En C, avec Bluez


Exemple

int get_l2cap_connection () {

Tout d'abord, toutes les variables dont nous avons besoin, les explications suivront à l'endroit approprié.

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

Tout d'abord, nous devons créer un socket, à partir duquel nous pouvons accepter une connexion. La famille de socket est PF_BLUETOOTH , le type de socket est SOCK_SEQPACKET (nous voulons avoir un socket de type TCP, pas brut) et le protocole est le protocole Bluetooth L2CAP ( BTPROTO_L2CAP ).

    ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);

Nous voulons nous assurer que ce fut un succès:

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

Nous devons maintenant remplir la structure d'adresse source avec une adresse générique, afin que tout périphérique Bluetooth avec n'importe quelle adresse puisse se connecter à nous. L'adresse générique est définie comme BDADDR_ANY dans bluetooth.h . Pour le copier dans la structure d'adresse, nous pouvons utiliser la fonction bacpy . Nous devons également définir la famille d'adresses, le type d'adresse et l'identifiant du canal.

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

Définir l'option SO_REUSEADDR nous permettra d'appeler à nouveau rapidement bind si nécessaire (ceci peut être omis):

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

Ensuite, nous devons lier le socket avec la structure d'adresse source que nous venons de définir. Encore une fois, nous vérifions la valeur de retour pour nous assurer que cela a fonctionné.

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

Ensuite, vous définissez le niveau de sécurité. Notez que cette étape est facultative, mais si vous définissez le niveau de sécurité sur MEDIUM, cela permettra un couplage automatique avec le périphérique (le noyau gère le couplage réel).

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

Maintenant, nous pouvons dire au noyau que notre ssock est un socket passif, qui acceptera une connexion. Le second paramètre est le backlog. Si vous voulez en savoir plus, la page de manuel d'écoute contient toutes les informations dont vous avez besoin.

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

Maintenant, nous pouvons attendre une connexion entrante. La structure peer_addr contiendra l'adresse du périphérique connecté, une fois les retours acceptés. csock sera le descripteur de fichier du socket que nous pouvons lire / écrire, pour communiquer avec le périphérique connecté.

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

Nous pouvons imprimer l'adresse de l'appareil connecté (facultatif, bien sûr). Nous pouvons utiliser la fonction batostr pour convertir l'adresse Bluetooth en chaîne.

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

Si nous ne voulons pas que d'autres périphériques se connectent, nous devons fermer le socket du serveur. Faites la même chose avec csock, une fois votre communication avec l'appareil terminée.

    close(ssock);
    return csock;
}