经典蓝牙设置PIN码不起作用

Moderator: ESP_XCGuang

djch2023
Posts: 3
Joined: Mon Oct 23, 2023 3:33 am

经典蓝牙设置PIN码不起作用

Postby djch2023 » Mon Oct 23, 2023 3:51 am

按照网站上的说明,使用AT+BTSECPARAM对经典蓝牙设置PIN码。
然后用手机连接模组,发现手机不需要输入PIN码就可以直接连接。

附件里有我测试手机的视频。

测试AT见附图,过程是完全参考网站的:https://docs.espressif.com/projects/esp ... mples.html
Attachments
测试AT.jpg
测试AT.jpg (50.85 KiB) Viewed 29906 times
4ebc2eedbb08345465a6be324d55196b.7z
(2.16 MiB) Downloaded 801 times

linuxboy
Posts: 10
Joined: Thu Nov 02, 2023 10:11 am

Re: 经典蓝牙设置PIN码不起作用

Postby linuxboy » Wed Nov 08, 2023 6:42 am

出现同样的问题。

请问这个问题如何解决的呢?

ESP_Sun
Posts: 320
Joined: Thu Dec 30, 2021 9:52 am

Re: 经典蓝牙设置PIN码不起作用

Postby ESP_Sun » Mon Jan 15, 2024 12:59 pm


WCZS12
Posts: 2
Joined: Tue Aug 13, 2024 5:09 am

Re: 经典蓝牙设置PIN码不起作用

Postby WCZS12 » Tue Aug 13, 2024 5:16 am

你给的链接答非所问,题主是希望esp32模块作为BT蓝牙spp从机,在手机端配对esp32时,手机端需要输入一个固定配对密码(比如0000或1234)来与esp32配对,而不是手机生成一个pin码来让esp32回复这个pin码后配对,建议你看看串口蓝牙透传模块HC05,有一个配对pin码,通常是1234,手机与HC05配对时,需要在手机端输入pin码1234来与HC05配对。我这边测试了esp32pin码设置的各种模式,无法实现手机端输入pin码来与esp32配对。

WCZS12
Posts: 2
Joined: Tue Aug 13, 2024 5:09 am

Re: 经典蓝牙设置PIN码不起作用

Postby WCZS12 » Tue Aug 13, 2024 5:21 am

ESP_Sun wrote:
Mon Jan 15, 2024 12:59 pm
请参考示例:https://docs.espressif.com/projects/esp ... yboardonly
你给的链接里配置方法都没用,无法实现像串口透传蓝牙模块HC05配对时需要手机端输入1234配对码进行配对。

ESP_Sun
Posts: 320
Joined: Thu Dec 30, 2021 9:52 am

Re: 经典蓝牙设置PIN码不起作用

Postby ESP_Sun » Thu Sep 05, 2024 6:15 am

在 AT 中,经典蓝牙默认启用了 Secure Simple Pairing (SSP)。如果对端(手机端)支持 SSP,则会使用 SSP 配对;如果不支持,则会回退到 Legacy Pairing,这时可能需要使用 PIN 码,并且是否弹出密码框取决于两端的 IO 能力(IO Capability)。如果您希望手机端弹出密码框,可以自行编译 AT 固件,并在 ./build.py menuconfig 中禁用 Secure Simple Pairing(路径:Component config > Bluetooth > Bluedroid Options > []Secure Simple Pairing)。但需要注意,AT 固件不支持直接禁用 SSP,因为禁用后可能会导致部分函数未被定义的编译错误,您需要在 AT 外部将这些函数定义为空函数。

例如,如果遇到“undefined reference to esp_bt_gap_set_security_param,undefined reference to `esp_bt_gap_ssp_passkey_reply',undefined reference to `esp_bt_gap_ssp_confirm_reply'” 之类的错误,可以在 ESP-IDF 项目中找到 esp_bt_gap_set_security_param ,esp_bt_gap_ssp_passkey_reply,esp_bt_gap_ssp_confirm_reply 这些函数,然后在 ESP-AT 项目的 main/app_main.c 中为每个函数实现一个空函数,如下所示如下:

Code: Select all

typedef enum {
    ESP_BT_SP_IOCAP_MODE = 0,                            /*!< Set IO mode */
    //ESP_BT_SP_OOB_DATA, //TODO                         /*!< Set OOB data */
} esp_bt_sp_param_t;

typedef uint8_t esp_bd_addr_t[6];

esp_err_t esp_bt_gap_set_security_param(esp_bt_sp_param_t param_type, void *value, uint8_t len)
{
    return ESP_FAIL;
}

esp_err_t esp_bt_gap_ssp_passkey_reply(esp_bd_addr_t bd_addr, bool accept, uint32_t passkey)
{
    return ESP_FAIL;
}

esp_err_t esp_bt_gap_ssp_confirm_reply(esp_bd_addr_t bd_addr, bool accept)
{
    return ESP_FAIL;
}

实现这些功能后,尝试再次编译项目,检查问题是否解决。
之后给 ESP 设备烧录编译好的 AT 固件,并执行以下 AT 命令:

Code: Select all

AT+BTINIT=1
OK
AT+BTSPPINIT=2
OK
AT+BTNAME="EXAMPLE"
OK
AT+BTSCANMODE=2
OK
AT+BTSPPSTART
OK
此时在手机端输入密码 “0000"或者是”1234",此时在 ESP 设备端会打印类似 +BTPINREQ:"bc:1a:e4:6b:36:81" 日志,然后在 ESP 端回复以下 AT 命令即可配对成功。

Code: Select all

AT+BTPINREPLY=0,"0000"
OK
禁用 Secure Simple Pairing (SSP) 将导致相关 AT 命令不可用。
很好奇你们为什么一定要使用 Legacy Pairing 呢?

Who is online

Users browsing this forum: No registered users and 13 guests