bluetooth
저에너지 통신을위한 개방형 L2CAP 소켓
수색…
C에서, Bluez
int get_l2cap_connection () {
첫째로, 우리가 필요로하는 모든 변수들에 대한 설명은 적절한 지점에서 뒤따를 것입니다.
int ssock = 0;
int csock = 0;
int reuse_addr = 1;
struct sockaddr_l2 src_addr;
struct bt_security bt_sec;
int result = 0;
먼저 소켓을 만들어서 연결을 받아 들일 수 있어야합니다. 소켓 패밀리는 PF_BLUETOOTH
이고, 소켓 유형은 SOCK_SEQPACKET
(원시가 아닌 TCP와 비슷한 소켓을 원합니다)이고 프로토콜은 Bluetooth 프로토콜 L2CAP ( BTPROTO_L2CAP
)입니다.
ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
우리는 그것이 성공했는지 확인하기를 원합니다.
if (ssock < 0) {
perror("Opening L2CAP socket failed");
return -1;
}
와일드 카드 주소로 소스 주소 구조를 채워야하므로 주소가있는 모든 블루투스 장치가 우리에게 연결할 수 있습니다. 와일드 카드 주소는 bluetooth.h
BDADDR_ANY
로 정의됩니다. 주소 구조에 복사하려면 bacpy
함수를 사용할 수 있습니다. 또한 주소 패밀리, 주소 유형 및 채널 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);
SO_REUSEADDR 옵션을 설정하면 필요한 경우 신속하게 다시 bind를 호출 할 수 있습니다 (생략 할 수 있습니다).
setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
다음으로 방금 정의한 소스 주소 구조로 소켓을 바인딩해야합니다. 다시 반환 값을 확인하여 제대로 작동하는지 확인합니다.
result = bind(ssock, (struct sockaddr*) &src_addr, sizeof(src_addr));
if (result < 0) {
perror("Binding L2CAP socket failed");
return -1;
}
다음은 보안 수준을 설정하는 것입니다. 이 단계는 선택 사항이지만 보안 수준을 MEDIUM으로 설정하면 장치와 자동 페어링 할 수 있습니다 (커널이 실제 페어링을 처리 함).
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;
}
이제 우리는 ssock이 연결을 받아들이는 수동 소켓임을 커널에 알릴 수 있습니다. 두 번째 매개 변수는 백 로그입니다. 더 많이 알고 싶으면 맨 페이지에 필요한 모든 정보가 들어 있습니다.
result = listen(ssock, 10);
if (result < 0) {
perror("Listening on L2CAP socket failed");
return -1;
}
이제 우리는 들어오는 연결을 기다릴 수 있습니다. peer_addr 구조체에는 accept가 반환되면 연결된 장치의 주소가 포함됩니다. csock은 우리가 읽고 쓸 수있는 소켓의 파일 디스크립터이며 연결된 장치와 통신한다.
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;
}
연결된 장치의 주소를 인쇄 할 수 있습니다 (물론 선택 사항). batostr 함수를 사용하여 Bluetooth 주소를 문자열로 변환 할 수 있습니다.
printf("Accepted connection from %s", batostr(&peer_addr->l2_bdaddr));
다른 장치를 연결하지 않으려면 서버 소켓을 닫아야합니다. 장치와의 통신이 끝나면 csock으로 같은 작업을하십시오.
close(ssock);
return csock;
}