【已解决】ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

【已解决】ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Thu Sep 29, 2022 1:30 am

开发板 ESP32S3 C。 win11 vscode。

在代码中 ESP_GAP_BLE_AUTH_CMPL_EVT 认证成功事件中,把对端设备的esp_ble_bond_dev_t *dev_list.bd_addr。这个值通过esp_ble_gap_update_whitelist,这个接口添加到白名单中,并设置在广播的时候ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY。只有白名单可以扫描可以连接。但是测试的时候出现了一下现象:
1、连接安卓手机,绑定并添加白名单成功,断开安卓手机,苹果手机和我的WIN11电脑仍然可以扫描到。
2、连接苹果手机,绑定并添加白名单成功,断开苹果手机,安卓手机无法扫描到,但是win11电脑依然可以扫描到。。
3、连接win11电脑,绑定并添加白名单成功,断开win11电脑,按说手机无法扫描到。

麻烦咨询下,是我哪里设置有问题还是白名单机制有问题。
Last edited by xinhaojie on Mon Oct 10, 2022 5:40 am, edited 3 times in total.

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Thu Sep 29, 2022 1:33 am

使用的是BLE4.2协议。

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Sat Oct 08, 2022 9:17 am

我们想实现设备绑定之后就不允许其他手机连接了,现在白名单用不了。我就尝试了使用定向广播的方法,就是在已经有设备和ESP32S3绑定之后后面再发射广播就发射定向广播。

定向广播的方式对安卓手机好使,但是苹果手机经常检测不到信号,搜索不到定向广播。

现在不知道怎么搞了,官方给个建议呗。我该怎么处理才能实现设备绑定之后就不能再和其他手机绑定了,直到清除绑定信息为止。

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby ESP_XuLZ » Sun Oct 09, 2022 3:59 am

xinhaojie wrote:
Thu Sep 29, 2022 1:30 am
开发板 ESP32S3 C。 win11 vscode。

在代码中 ESP_GAP_BLE_AUTH_CMPL_EVT 认证成功事件中,把对端设备的esp_ble_bond_dev_t *dev_list.bd_addr。这个值通过esp_ble_gap_update_whitelist,这个接口添加到白名单中,并设置在广播的时候ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY。只有白名单可以扫描可以连接。但是测试的时候出现了一下现象:
1、连接安卓手机,绑定并添加白名单成功,断开安卓手机,苹果手机和我的WIN11电脑仍然可以扫描到。
2、连接苹果手机,绑定并添加白名单成功,断开苹果手机,安卓手机无法扫描到,但是win11电脑依然可以扫描到。。
3、连接win11电脑,绑定并添加白名单成功,断开win11电脑,按说手机无法扫描到。

麻烦咨询下,是我哪里设置有问题还是白名单机制有问题。
建议在开启白名单广播时,将广播过滤策略更改为 ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST, 这样除了白名单中的设备其他BLE 设备将不能进行连接了

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Sun Oct 09, 2022 4:51 am

其他设备连接不成功,但是还是能搜索到,这个是不是白名单存在问题呀。还有我想用绑定之后定向广播,但是发现安卓下定向广播可以正常连接,但是苹果手机不可以,我设置的定向广播参数如下,麻烦给看下吧。
static esp_ble_adv_params_t alitight_adv_params_connected = {
.adv_int_min = 0x100,
.adv_int_max = 0x100,
.adv_type = ADV_TYPE_DIRECT_IND_LOW,
.peer_addr_type = BLE_ADDR_TYPE_RANDOM,
.own_addr_type = BLE_ADDR_TYPE_PUBLIC,
.channel_map = ADV_CHNL_ALL,
.adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};

ESP_XuLZ wrote:
Sun Oct 09, 2022 3:59 am
xinhaojie wrote:
Thu Sep 29, 2022 1:30 am
开发板 ESP32S3 C。 win11 vscode。

在代码中 ESP_GAP_BLE_AUTH_CMPL_EVT 认证成功事件中,把对端设备的esp_ble_bond_dev_t *dev_list.bd_addr。这个值通过esp_ble_gap_update_whitelist,这个接口添加到白名单中,并设置在广播的时候ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY。只有白名单可以扫描可以连接。但是测试的时候出现了一下现象:
1、连接安卓手机,绑定并添加白名单成功,断开安卓手机,苹果手机和我的WIN11电脑仍然可以扫描到。
2、连接苹果手机,绑定并添加白名单成功,断开苹果手机,安卓手机无法扫描到,但是win11电脑依然可以扫描到。。
3、连接win11电脑,绑定并添加白名单成功,断开win11电脑,按说手机无法扫描到。

麻烦咨询下,是我哪里设置有问题还是白名单机制有问题。
建议在开启白名单广播时,将广播过滤策略更改为 ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST, 这样除了白名单中的设备其他BLE 设备将不能进行连接了

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby ESP_XuLZ » Sun Oct 09, 2022 6:45 am

白名单之外的苹果手机仍然能扫描到,可能与苹果的扫描过滤策略或者 app 缓存有关
定向广播需要设定广播者和发起者的两个广播
own_addr_type 需要看是否使用了 rpa 地址或者 静态随机地址,如 gatt_security_server 示例中就是使用了rpa 地址,这里 own_addr_type = BLE_ADDR_TYPE_RANDOM
peer_addr_type 看对端设备连接过来的地址类型进行判断,一般手机使用的都是 rpa 地址
peer_addr 也必须copy 为对端地址,对端地址可以在首次配对时 ESP_GAP_BLE_AUTH_CMPL_EVT 事件或者 ESP_GATTS_CONNECT_EVT 事件中获取
adv_type 设为 ADV_TYPE_DIRECT_IND_LOW, own_addr_type 、peer_addr_type 、peer_addr都必须设置

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Sun Oct 09, 2022 7:32 am

下面是我修改gatt_security_server这个例程的过程:

Code: Select all

static esp_ble_adv_params_t heart_rate_adv_params = {
    .adv_int_min        = 0x100,
    .adv_int_max        = 0x100,
    .adv_type           = ADV_TYPE_IND,
    .own_addr_type      = BLE_ADDR_TYPE_RANDOM,
    .channel_map        = ADV_CHNL_ALL,
    .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};

static esp_ble_adv_params_t heart_rate_adv_params_c = {
    .adv_int_min        = 0x100,
    .adv_int_max        = 0x100,
    .adv_type           = ADV_TYPE_DIRECT_IND_LOW,
    .peer_addr_type     = BLE_ADDR_TYPE_RANDOM,
    .own_addr_type      = BLE_ADDR_TYPE_RANDOM,
    .channel_map        = ADV_CHNL_ALL,
    .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
};

1、增加一个heart_rate_adv_params_c结构体用于定向连接,参数如上。

Code: Select all

static void xxx_adv_xxx(void){
    int dev_num = esp_ble_get_bond_device_num();
    ESP_LOGI(GATTS_TABLE_TAG, "bond device number = %d", dev_num);
    if (dev_num != 0){
        esp_ble_bond_dev_t *dev_list = (esp_ble_bond_dev_t *)malloc(sizeof(esp_ble_bond_dev_t) * dev_num);
        esp_ble_get_bond_device_list(&dev_num, dev_list);
        memcpy(heart_rate_adv_params_c.peer_addr, dev_list[dev_num-1].bd_addr, sizeof(dev_list[dev_num-1].bd_addr));(这个地方已经保证了复制的是最新设备的mac地址)
        esp_log_buffer_hex("start connected advertising",
                     heart_rate_adv_params_c.peer_addr, sizeof(esp_bd_addr_t));
        free(dev_list);
        esp_ble_gap_start_advertising(&heart_rate_adv_params_c);
    } else {
        esp_ble_gap_start_advertising(&heart_rate_adv_params);
        ESP_LOGI(GATTS_TABLE_TAG, "start advertising");
    }
}
2、增加一个函数,函数如上。这个函数在断开BLE连接的时候调用。

经过上述两步,每次设备开机会正常搜索到信号(因为是正常广播信号), 在苹果手机上连接一次,之后断开还可以连接,但是如果把苹果手机的蓝牙关闭一下再打开这时候就没办法通过定向广播连接了,但是在安卓手机上就不存在这个问题,定向广播一直都可以断开再连接。
ESP_XuLZ wrote:
Sun Oct 09, 2022 6:45 am
白名单之外的苹果手机仍然能扫描到,可能与苹果的扫描过滤策略或者 app 缓存有关
定向广播需要设定广播者和发起者的两个广播
own_addr_type 需要看是否使用了 rpa 地址或者 静态随机地址,如 gatt_security_server 示例中就是使用了rpa 地址,这里 own_addr_type = BLE_ADDR_TYPE_RANDOM
peer_addr_type 看对端设备连接过来的地址类型进行判断,一般手机使用的都是 rpa 地址
peer_addr 也必须copy 为对端地址,对端地址可以在首次配对时 ESP_GAP_BLE_AUTH_CMPL_EVT 事件或者 ESP_GATTS_CONNECT_EVT 事件中获取
adv_type 设为 ADV_TYPE_DIRECT_IND_LOW, own_addr_type 、peer_addr_type 、peer_addr都必须设置

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

Re: ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Sun Oct 09, 2022 7:50 am

现在就是安卓在设备断开什么的都没有问题,就是苹果,关闭了设置里面的蓝牙再打开就无法搜索到定型广播的信号了。换了个苹果手机还是一样的问题。。。。

我看蓝牙协议上说是定向广播的时间间隔比较低,超过1.28s之后就不再广播了。咱们的控制器也是这么实现的吗?我刚才测试了一下,在设备未连接的情况一下,定时2秒 stop adv一次 再start adv一次。来保证设备是一直在处于定向广播的过程中。但是苹果还是现在这个状态,关闭蓝牙之后再打开还是无法连接。

感觉也不像是苹果手机的问题,因为我的蓝牙鼠标和苹果绑定之后无论重启手机,还是关掉蓝牙,在蓝牙再次打开的时候,只要鼠标在定向广播模式(因为这时候鼠标是不能被其他设备发现的,应该是定向广播模式)下就能立马连上。

xinhaojie
Posts: 57
Joined: Wed Feb 23, 2022 10:56 am

Re: 【已解决】ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby xinhaojie » Mon Oct 10, 2022 5:41 am

解决方案:
最终我没有用白名单,也没有用定向广播的方式解决了绑定设备只能和绑定手机通信的功能。利用了如果设备绑定之后就不再发射全部广播信息的功能,至发射最简单的空包广播,让绑定设备可以搜索到,没绑定的设备不能搜索到就实现了。。。

RogerWY
Posts: 4
Joined: Mon Jul 19, 2021 9:34 am

Re: 【已解决】ESP32S3 BLE 把对端地址加入白名单并设置白名单可扫描可连接,苹果手机依然能扫描到

Postby RogerWY » Wed Nov 16, 2022 5:53 am

您好,我现在也遇到一样的问题,请问可以分享一下您具体是怎么解决这个问题的吗?

Who is online

Users browsing this forum: No registered users and 38 guests