我们能够在配对过程完成之前读取BLE特性。我们希望对此进行限制,以使客户端应用程序除非成功配对,否则将无法读取任何数据
我们正在将bluez-5.48与Linux内核4.1.15一起使用。
我们已经创建了l2cap_socket,它正在等待accept()上的任何连接。我们已将io-cap设置为DISPLAY_ONLY,以便从移动设备输入密码。
连接到此bleGattServer时,配对过程开始,但是在smp安全确认之前,连接状态显示为已连接,并且在确认配对之前可以发现BLE特性。
下面是从自定义bleGattServer应用程序中调用sec = BT_SECURITY_MEDIUM,而src_type = BDADDR_LE_PUBLIC的函数。
static int l2cap_le_att_listen_and_accept(bdaddr_t *src, int sec,
uint8_t src_type)
{
int sk, nsk;
struct sockaddr_l2 srcaddr, addr;
socklen_t optlen;
struct bt_security btsec;
char ba[18];
sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP);
if (sk < 0) {
perror("Failed to create L2CAP socket");
return -1;
}
/* Set up source address */
memset(&srcaddr, 0, sizeof(srcaddr));
srcaddr.l2_family = AF_BLUETOOTH;
srcaddr.l2_cid = htobs(ATT_CID);
srcaddr.l2_bdaddr_type = src_type;
bacpy(&srcaddr.l2_bdaddr, src);
if (bind(sk, (struct sockaddr *) &srcaddr, sizeof(srcaddr)) < 0) {
perror("Failed to bind L2CAP socket");
goto fail;
}
/* Set the security level */
memset(&btsec, 0, sizeof(btsec));
btsec.level = sec;
if (setsockopt(sk, SOL_BLUETOOTH, BT_SECURITY, &btsec,
sizeof(btsec)) != 0) {
ERROR( "Failed to set L2CAP security level\n");
goto fail;
}
if (listen(sk, 10) < 0) {
perror("Listening on socket failed");
goto fail;
}
VERBOSE("Started listening on ATT channel. Waiting for connections\n");
memset(&addr, 0, sizeof(addr));
optlen = sizeof(addr);
nsk = accept(sk, (struct sockaddr *) &addr, &optlen);
if (nsk < 0) {
perror("Accept failed");
goto fail;
}
ba2str(&addr.l2_bdaddr, ba);
VERBOSE("Connect from %s\n", ba);
close(sk);
return nsk;
fail:
close(sk);
return -1;
}
在配对成功完成之前,我们如何停止特色广告。或者有没有办法使特征可见的持续时间最小化,直到完成配对过程。