수색…


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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow