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のようなソケットがBTPROTO_L2CAP
)。プロトコルはBluetoothプロトコルL2CAP( BTPROTO_L2CAP
)です。
ssock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
我々はそれが成功したことを確認したい:
if (ssock < 0) {
perror("Opening L2CAP socket failed");
return -1;
}
ワイルドカードアドレスでソースアドレス構造を埋める必要があります。したがって、任意のアドレスを持つBluetoothデバイスは、私たちに接続できます。ワイルドカードアドレスは、 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オプションを設定すると、必要に応じて素早くバインドを呼び出すことができます(省略することもできます)。
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がパッシブソケットであり、接続を受け入れることをカーネルに伝えることができます。 2番目のパラメータはバックログです。あなたがもっと知りたいのであれば、聞くマンページに必要なすべての情報が含まれています。
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;
}