bluetooth
Öppna L2CAP-uttaget för låg energikommunikation
Sök…
I C, med Bluez
int get_l2cap_connection () {
Till att börja med kommer alla variabler vi behöver, förklaring till, följa på rätt plats.
int ssock = 0;
int csock = 0;
int reuse_addr = 1;
struct sockaddr_l2 src_addr;
struct bt_security bt_sec;
int result = 0;
Först måste vi skapa ett uttag som vi kan acceptera en anslutning från. PF_BLUETOOTH är PF_BLUETOOTH , PF_BLUETOOTH är SOCK_SEQPACKET (vi vill ha ett TCP-liknande uttag, inte rå), och protokollet är Bluetooth-protokollet L2CAP ( BTPROTO_L2CAP ).
ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
Vi vill se till att det lyckades:
if (ssock < 0) {
perror("Opening L2CAP socket failed");
return -1;
}
Vi måste nu fylla källadressadressen med en jokardadress, så alla Bluetooth-enheter med vilken adress som helst kan ansluta till oss. Wildcard-adressen definieras som BDADDR_ANY i bluetooth.h . För att kopiera den till adressstrukturen kan vi använda bacpy funktionen. Vi måste också ställa in adressfamiljen, adresstypen och kanal-ID.
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);
Om du ställer in alternativet SO_REUSEADDR kan vi snabbt ringa bind igen om det behövs (detta kan lämnas utanför):
setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
Därefter måste vi binda uttaget med källadressstrukturen som vi just definierade. Återigen kontrollerar vi returvärdet för att se till att det fungerade.
result = bind(ssock, (struct sockaddr*) &src_addr, sizeof(src_addr));
if (result < 0) {
perror("Binding L2CAP socket failed");
return -1;
}
Nästa upp ställer in säkerhetsnivån. Observera att det här steget är valfritt, men om du ställer in säkerhetsnivån till MEDIUM tillåts automatisk parning med enheten (kärnan hanterar den faktiska parningen).
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 kan vi säga kärnan att vår socka är ett passivt uttag, som kommer att acceptera en anslutning. Den andra parametern är eftersläpningen. Om du vill veta mer innehåller listan på lyssna all information du behöver.
result = listen(ssock, 10);
if (result < 0) {
perror("Listening on L2CAP socket failed");
return -1;
}
Nu kan vi vänta på en inkommande anslutning. Peer_addr-strukturen kommer att innehålla den anslutna enhetens adress, så snart du accepterar retur. csock är filbeskrivningen för uttaget vi kan läsa från / skriva till, för att kommunicera med den anslutna enheten.
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;
}
Vi kan skriva ut adressen till den anslutna enheten (naturligtvis valfritt). Vi kan använda batostr-funktionen för att konvertera Bluetooth-adressen till en sträng.
printf("Accepted connection from %s", batostr(&peer_addr->l2_bdaddr));
Om vi inte vill att andra enheter ska ansluta, bör vi stänga serveruttaget. Gör samma sak med csock, när din kommunikation med enheten är klar.
close(ssock);
return csock;
}