按照网站上的说明,使用AT+BTSECPARAM对经典蓝牙设置PIN码。
然后用手机连接模组,发现手机不需要输入PIN码就可以直接连接。
附件里有我测试手机的视频。
测试AT见附图,过程是完全参考网站的:https://docs.espressif.com/projects/esp ... mples.html
经典蓝牙设置PIN码不起作用
Moderator: ESP_XCGuang
经典蓝牙设置PIN码不起作用
- Attachments
-
- 测试AT.jpg (50.85 KiB) Viewed 32335 times
-
- 4ebc2eedbb08345465a6be324d55196b.7z
- (2.16 MiB) Downloaded 928 times
Re: 经典蓝牙设置PIN码不起作用
你给的链接答非所问,题主是希望esp32模块作为BT蓝牙spp从机,在手机端配对esp32时,手机端需要输入一个固定配对密码(比如0000或1234)来与esp32配对,而不是手机生成一个pin码来让esp32回复这个pin码后配对,建议你看看串口蓝牙透传模块HC05,有一个配对pin码,通常是1234,手机与HC05配对时,需要在手机端输入pin码1234来与HC05配对。我这边测试了esp32pin码设置的各种模式,无法实现手机端输入pin码来与esp32配对。
Re: 经典蓝牙设置PIN码不起作用
你给的链接里配置方法都没用,无法实现像串口透传蓝牙模块HC05配对时需要手机端输入1234配对码进行配对。ESP_Sun wrote: ↑Mon Jan 15, 2024 12:59 pm请参考示例:https://docs.espressif.com/projects/esp ... yboardonly
Re: 经典蓝牙设置PIN码不起作用
在 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 中为每个函数实现一个空函数,如下所示如下:
实现这些功能后,尝试再次编译项目,检查问题是否解决。
之后给 ESP 设备烧录编译好的 AT 固件,并执行以下 AT 命令:
此时在手机端输入密码 “0000"或者是”1234",此时在 ESP 设备端会打印类似 +BTPINREQ:"bc:1a:e4:6b:36:81" 日志,然后在 ESP 端回复以下 AT 命令即可配对成功。
禁用 Secure Simple Pairing (SSP) 将导致相关 AT 命令不可用。
很好奇你们为什么一定要使用 Legacy Pairing 呢?
例如,如果遇到“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
Code: Select all
AT+BTPINREPLY=0,"0000"
OK
很好奇你们为什么一定要使用 Legacy Pairing 呢?
Who is online
Users browsing this forum: No registered users and 14 guests