Ограничить характеристику чтения BLE до успешного завершения процесса сопряжения - PullRequest
0 голосов
/ 20 декабря 2018

Мы можем прочитать характеристику BLE до завершения процесса сопряжения.Мы хотим ограничить это так, чтобы клиентские приложения не могли читать какие-либо данные, если они не были успешно сопряжены

Мы используем bluez-5.48 с ядром linux 4.1.15.

Мы создали l2cap_socketи он ожидает любого соединения на accept ().Для ввода пароля с мобильного устройства мы указали io-cap как DISPLAY_ONLY.

При подключении к этому bleGattServer процесс сопряжения начинается, но перед подтверждением безопасности smp состояние соединения отображается как подключенное, а характеристики BLE обнаруживаются до подтверждения сопряжения.

Ниже приведена функция, в которой sec = BT_SECURITY_MEDIUM и src_type = BDADDR_LE_PUBLIC вызывается из нашего пользовательского приложения bleGattServer.

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

Как мы можем остановить показ рекламы, пока сопряжение не будет успешно завершено.Или есть способ минимизировать продолжительность, в течение которой признак является видимым, до завершения процесса сопряжения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...