在 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 命令即可配对成功。
禁用 Secure Simple Pairing (SSP) 将导致相关 AT 命令不可用。
很好奇你们为什么一定要使用 Legacy Pairing 呢?