mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 17:49:10 -04:00
Merge branch 'feature/ble_example_pytest_v5.1' into 'release/v5.1'
add pytest for classic bt example(backport v5.1) See merge request espressif/esp-idf!32544
This commit is contained in:
commit
79aa71958c
@ -41,4 +41,9 @@ menu "A2DP Example Configuration"
|
||||
help
|
||||
GPIO number to use for I2S Data Driver.
|
||||
|
||||
config EXAMPLE_LOCAL_DEVICE_NAME
|
||||
string "Local Device Name"
|
||||
default "ESP_SPEAKER"
|
||||
help
|
||||
Use this option to set local device name.
|
||||
endmenu
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include "esp_avrc_api.h"
|
||||
|
||||
/* device name */
|
||||
#define LOCAL_DEVICE_NAME "ESP_SPEAKER"
|
||||
static const char local_device_name[] = CONFIG_EXAMPLE_LOCAL_DEVICE_NAME;
|
||||
|
||||
/* event for stack up */
|
||||
enum {
|
||||
@ -120,7 +120,7 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
|
||||
switch (event) {
|
||||
/* when do the stack up, this event comes */
|
||||
case BT_APP_EVT_STACK_UP: {
|
||||
esp_bt_dev_set_device_name(LOCAL_DEVICE_NAME);
|
||||
esp_bt_dev_set_device_name(local_device_name);
|
||||
esp_bt_gap_register_callback(bt_app_gap_cb);
|
||||
|
||||
assert(esp_avrc_ct_init() == ESP_OK);
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_A2DP_SINK"
|
@ -0,0 +1,15 @@
|
||||
menu "A2DP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_PEER_DEVICE_NAME
|
||||
string "Target Device Name"
|
||||
default "ESP_SPEAKER"
|
||||
help
|
||||
Use this option to set target device name to connect.
|
||||
endmenu
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@ -30,7 +30,6 @@
|
||||
#define BT_RC_CT_TAG "RC_CT"
|
||||
|
||||
/* device name */
|
||||
#define TARGET_DEVICE_NAME "ESP_SPEAKER"
|
||||
#define LOCAL_DEVICE_NAME "ESP_A2DP_SRC"
|
||||
|
||||
/* AVRCP used transaction label */
|
||||
@ -112,6 +111,8 @@ static uint32_t s_pkt_cnt = 0; /* count of packet
|
||||
static esp_avrc_rn_evt_cap_mask_t s_avrc_peer_rn_cap; /* AVRC target notification event capability bit mask */
|
||||
static TimerHandle_t s_tmr; /* handle of heart beat timer */
|
||||
|
||||
static const char remote_device_name[] = CONFIG_EXAMPLE_PEER_DEVICE_NAME;
|
||||
|
||||
/*********************************
|
||||
* STATIC FUNCTION DEFINITIONS
|
||||
********************************/
|
||||
@ -199,7 +200,7 @@ static void filter_inquiry_scan_result(esp_bt_gap_cb_param_t *param)
|
||||
/* search for target device in its Extended Inqury Response */
|
||||
if (eir) {
|
||||
get_name_from_eir(eir, s_peer_bdname, NULL);
|
||||
if (strcmp((char *)s_peer_bdname, TARGET_DEVICE_NAME) == 0) {
|
||||
if (strcmp((char *)s_peer_bdname, remote_device_name) == 0) {
|
||||
ESP_LOGI(BT_AV_TAG, "Found a target device, address %s, name %s", bda_str, s_peer_bdname);
|
||||
s_a2d_state = APP_AV_STATE_DISCOVERED;
|
||||
memcpy(s_peer_bda, param->disc_res.bda, ESP_BD_ADDR_LEN);
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_A2DP_SINK"
|
@ -0,0 +1,10 @@
|
||||
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
# SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
import pytest
|
||||
from pytest_embedded import Dut
|
||||
|
||||
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.generic
|
||||
def test_bt_discovery(dut: Dut) -> None:
|
||||
dut.expect_exact('Discovery started.')
|
@ -0,0 +1,15 @@
|
||||
menu "HID Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_LOCAL_DEVICE_NAME
|
||||
string "Local Device Name"
|
||||
default "HID Mouse Example"
|
||||
help
|
||||
Use this option to set local device name.
|
||||
endmenu
|
@ -23,6 +23,8 @@
|
||||
#define REPORT_PROTOCOL_MOUSE_REPORT_SIZE (4)
|
||||
#define REPORT_BUFFER_SIZE REPORT_PROTOCOL_MOUSE_REPORT_SIZE
|
||||
|
||||
static const char local_device_name[] = CONFIG_EXAMPLE_LOCAL_DEVICE_NAME;
|
||||
|
||||
typedef struct {
|
||||
esp_hidd_app_param_t app_param;
|
||||
esp_hidd_qos_param_t both_qos;
|
||||
@ -430,7 +432,7 @@ void app_main(void)
|
||||
}
|
||||
|
||||
ESP_LOGI(TAG, "setting device name");
|
||||
esp_bt_dev_set_device_name("HID Mouse Example");
|
||||
esp_bt_dev_set_device_name(local_device_name);
|
||||
|
||||
ESP_LOGI(TAG, "setting cod major, peripheral");
|
||||
esp_bt_cod_t cod;
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_HID_MOUSE_DEVICE"
|
@ -0,0 +1,15 @@
|
||||
menu "L2CAP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_PEER_DEVICE_NAME
|
||||
string "Target Device Name"
|
||||
default "ESP_BT_L2CAP_SERVER"
|
||||
help
|
||||
Use this option to set target device name to connect.
|
||||
endmenu
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@ -30,12 +30,12 @@
|
||||
#define L2CAP_TAG "L2CAP_TAG"
|
||||
#define SDP_TAG "SDP_TAG"
|
||||
#define EXAMPLE_DEVICE_NAME "ESP_BT_L2CAP_CLIENT"
|
||||
#define TARGET_DEVICE_NAME "ESP_BT_L2CAP_SERVER"
|
||||
#define L2CAP_DATA_LEN 100
|
||||
#define BT_L2CAP_DYNMIC_PSM 0x1001
|
||||
#define BT_UNUSED_RFCOMM -1
|
||||
#define BT_UNKONWN_PROFILE_VERSION 0x0102
|
||||
|
||||
static const char remote_device_name[] = CONFIG_EXAMPLE_PEER_DEVICE_NAME;
|
||||
static esp_bt_l2cap_cntl_flags_t sec_mask = ESP_BT_L2CAP_SEC_AUTHENTICATE;
|
||||
static char *sdp_service_name = "Unknown_profile";
|
||||
static const uint8_t UUID_UNKNOWN[] = {0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00,
|
||||
@ -125,7 +125,7 @@ static void filter_inquiry_scan_result(esp_bt_gap_cb_param_t *param)
|
||||
/* search for target device in its Extended Inqury Response */
|
||||
if (eir) {
|
||||
get_name_from_eir(eir, peer_bdname, NULL);
|
||||
if (strcmp((char *)peer_bdname, TARGET_DEVICE_NAME) == 0) {
|
||||
if (strcmp((char *)peer_bdname, remote_device_name) == 0) {
|
||||
ESP_LOGI(L2CAP_TAG, "Found a target device, address %s, name %s", bda_str, peer_bdname);
|
||||
ESP_LOGI(L2CAP_TAG, "Cancel device discovery ...");
|
||||
esp_bt_gap_cancel_discovery();
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_L2CAP_SERVER"
|
@ -0,0 +1,15 @@
|
||||
menu "L2CAP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_LOCAL_DEVICE_NAME
|
||||
string "Local Device Name"
|
||||
default "ESP_BT_L2CAP_SERVER"
|
||||
help
|
||||
Use this option to set local device name.
|
||||
endmenu
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@ -29,12 +29,12 @@
|
||||
|
||||
#define L2CAP_TAG "L2CAP_TAG"
|
||||
#define SDP_TAG "SDP_TAG"
|
||||
#define EXAMPLE_DEVICE_NAME "ESP_BT_L2CAP_SERVER"
|
||||
#define L2CAP_DATA_LEN 100
|
||||
#define BT_UNUSED_RFCOMM -1
|
||||
#define BT_L2CAP_DYNMIC_PSM 0x1001
|
||||
#define BT_UNKONWN_PROFILE_VERSION 0x0102
|
||||
|
||||
static const char local_device_name[] = CONFIG_EXAMPLE_LOCAL_DEVICE_NAME;
|
||||
static esp_bt_l2cap_cntl_flags_t sec_mask = ESP_BT_L2CAP_SEC_AUTHENTICATE;
|
||||
static char *sdp_service_name = "Unknown_profile";
|
||||
static const uint8_t UUID_UNKNOWN[] = {0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00,
|
||||
@ -270,7 +270,7 @@ static void esp_hdl_sdp_cb_evt(uint16_t event, void *p_param)
|
||||
case ESP_SDP_CREATE_RECORD_COMP_EVT:
|
||||
ESP_LOGI(SDP_TAG, "ESP_SDP_CREATE_RECORD_COMP_EVT: status:%d\n", sdp_param->create_record.status);
|
||||
if (sdp_param->create_record.status == ESP_SDP_SUCCESS) {
|
||||
esp_bt_dev_set_device_name(EXAMPLE_DEVICE_NAME);
|
||||
esp_bt_dev_set_device_name(local_device_name);
|
||||
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
|
||||
}
|
||||
break;
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_L2CAP_SERVER"
|
@ -0,0 +1,15 @@
|
||||
menu "SPP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_LOCAL_DEVICE_NAME
|
||||
string "Local Device Name"
|
||||
default "ESP_SPP_ACCEPTOR"
|
||||
help
|
||||
Use this option to set local device name.
|
||||
endmenu
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@ -25,11 +25,11 @@
|
||||
|
||||
#define SPP_TAG "SPP_ACCEPTOR_DEMO"
|
||||
#define SPP_SERVER_NAME "SPP_SERVER"
|
||||
#define EXAMPLE_DEVICE_NAME "ESP_SPP_ACCEPTOR"
|
||||
#define SPP_SHOW_DATA 0
|
||||
#define SPP_SHOW_SPEED 1
|
||||
#define SPP_SHOW_MODE SPP_SHOW_SPEED /*Choose show mode: show data or speed*/
|
||||
|
||||
static const char local_device_name[] = CONFIG_EXAMPLE_LOCAL_DEVICE_NAME;
|
||||
static const esp_spp_mode_t esp_spp_mode = ESP_SPP_MODE_CB;
|
||||
static const bool esp_spp_enable_l2cap_ertm = true;
|
||||
|
||||
@ -90,7 +90,7 @@ static void esp_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
|
||||
if (param->start.status == ESP_SPP_SUCCESS) {
|
||||
ESP_LOGI(SPP_TAG, "ESP_SPP_START_EVT handle:%"PRIu32" sec_id:%d scn:%d", param->start.handle, param->start.sec_id,
|
||||
param->start.scn);
|
||||
esp_bt_dev_set_device_name(EXAMPLE_DEVICE_NAME);
|
||||
esp_bt_dev_set_device_name(local_device_name);
|
||||
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
|
||||
} else {
|
||||
ESP_LOGE(SPP_TAG, "ESP_SPP_START_EVT status:%d", param->start.status);
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_ACCEPTOR"
|
@ -0,0 +1,15 @@
|
||||
menu "SPP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_PEER_DEVICE_NAME
|
||||
string "Target Device Name"
|
||||
default "ESP_SPP_ACCEPTOR"
|
||||
help
|
||||
Use this option to set target device name to connect.
|
||||
endmenu
|
@ -43,7 +43,8 @@ static const esp_spp_role_t role_master = ESP_SPP_ROLE_MASTER;
|
||||
esp_bd_addr_t peer_bd_addr = {0};
|
||||
static uint8_t peer_bdname_len;
|
||||
static char peer_bdname[ESP_BT_GAP_MAX_BDNAME_LEN + 1];
|
||||
static const char remote_device_name[] = "ESP_SPP_ACCEPTOR";
|
||||
static const char remote_device_name[] = CONFIG_EXAMPLE_PEER_DEVICE_NAME;
|
||||
|
||||
static const esp_bt_inq_mode_t inq_mode = ESP_BT_INQ_MODE_GENERAL_INQUIRY;
|
||||
static const uint8_t inq_len = 30;
|
||||
static const uint8_t inq_num_rsps = 0;
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_ACCEPTOR"
|
@ -0,0 +1,15 @@
|
||||
menu "SPP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_LOCAL_DEVICE_NAME
|
||||
string "Local Device Name"
|
||||
default "ESP_SPP_ACCEPTOR"
|
||||
help
|
||||
Use this option to set local device name.
|
||||
endmenu
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@ -37,8 +37,8 @@
|
||||
|
||||
#define SPP_TAG "SPP_ACCEPTOR_DEMO"
|
||||
#define SPP_SERVER_NAME "SPP_SERVER"
|
||||
#define EXAMPLE_DEVICE_NAME "ESP_SPP_ACCEPTOR"
|
||||
|
||||
static const char local_device_name[] = CONFIG_EXAMPLE_LOCAL_DEVICE_NAME;
|
||||
static const esp_spp_sec_t sec_mask = ESP_SPP_SEC_AUTHENTICATE;
|
||||
static const esp_spp_role_t role_slave = ESP_SPP_ROLE_SLAVE;
|
||||
|
||||
@ -121,7 +121,7 @@ static void esp_spp_cb(uint16_t e, void *p)
|
||||
if (param->start.status == ESP_SPP_SUCCESS) {
|
||||
ESP_LOGI(SPP_TAG, "ESP_SPP_START_EVT handle:%"PRIu32" sec_id:%d scn:%d", param->start.handle, param->start.sec_id,
|
||||
param->start.scn);
|
||||
esp_bt_dev_set_device_name(EXAMPLE_DEVICE_NAME);
|
||||
esp_bt_dev_set_device_name(local_device_name);
|
||||
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
|
||||
} else {
|
||||
ESP_LOGE(SPP_TAG, "ESP_SPP_START_EVT status:%d", param->start.status);
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_VFS_ACCEPTOR"
|
@ -0,0 +1,15 @@
|
||||
menu "SPP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_PEER_DEVICE_NAME
|
||||
string "Target Device Name"
|
||||
default "ESP_SPP_ACCEPTOR"
|
||||
help
|
||||
Use this option to set target device name to connect.
|
||||
endmenu
|
@ -44,7 +44,8 @@ static const esp_spp_role_t role_master = ESP_SPP_ROLE_MASTER;
|
||||
static esp_bd_addr_t peer_bd_addr;
|
||||
static uint8_t peer_bdname_len;
|
||||
static char peer_bdname[ESP_BT_GAP_MAX_BDNAME_LEN + 1];
|
||||
static const char remote_device_name[] = "ESP_SPP_ACCEPTOR";
|
||||
static const char remote_device_name[] = CONFIG_EXAMPLE_PEER_DEVICE_NAME;
|
||||
|
||||
static const esp_bt_inq_mode_t inq_mode = ESP_BT_INQ_MODE_GENERAL_INQUIRY;
|
||||
static const uint8_t inq_len = 30;
|
||||
static const uint8_t inq_num_rsps = 0;
|
||||
|
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_VFS_ACCEPTOR"
|
@ -0,0 +1,7 @@
|
||||
menu "HFP Example Configuration"
|
||||
config EXAMPLE_LOCAL_DEVICE_NAME
|
||||
string "Local Device Name"
|
||||
default "ESP_HFP_AG"
|
||||
help
|
||||
Use this option to set local device name.
|
||||
endmenu
|
@ -27,6 +27,8 @@
|
||||
|
||||
#define BT_HF_AG_TAG "HF_AG_DEMO_MAIN"
|
||||
|
||||
static const char local_device_name[] = CONFIG_EXAMPLE_LOCAL_DEVICE_NAME;
|
||||
|
||||
/* event for handler "hf_ag_hdl_stack_up */
|
||||
enum {
|
||||
BT_APP_EVT_STACK_UP = 0,
|
||||
@ -53,8 +55,7 @@ static void bt_hf_hdl_stack_evt(uint16_t event, void *p_param)
|
||||
case BT_APP_EVT_STACK_UP:
|
||||
{
|
||||
/* set up device name */
|
||||
char *dev_name = "ESP_HFP_AG";
|
||||
esp_bt_dev_set_device_name(dev_name);
|
||||
esp_bt_dev_set_device_name(local_device_name);
|
||||
|
||||
esp_hf_ag_register_callback(bt_app_hf_cb);
|
||||
|
||||
|
@ -0,0 +1,2 @@
|
||||
CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI=y
|
||||
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_HFP"
|
@ -0,0 +1,15 @@
|
||||
menu "HFP Example Configuration"
|
||||
config EXAMPLE_SSP_ENABLED
|
||||
bool "Secure Simple Pairing"
|
||||
depends on BT_CLASSIC_ENABLED
|
||||
default y
|
||||
help
|
||||
This enables the Secure Simple Pairing. If disable this option,
|
||||
Bluedroid will only support Legacy Pairing
|
||||
|
||||
config EXAMPLE_PEER_DEVICE_NAME
|
||||
string "Target Device Name"
|
||||
default "ESP_HFP_AG"
|
||||
help
|
||||
Use this option to set target device name to connect.
|
||||
endmenu
|
@ -29,8 +29,7 @@
|
||||
esp_bd_addr_t peer_addr = {0};
|
||||
static char peer_bdname[ESP_BT_GAP_MAX_BDNAME_LEN + 1];
|
||||
static uint8_t peer_bdname_len;
|
||||
|
||||
static const char remote_device_name[] = "ESP_HFP_AG";
|
||||
static const char remote_device_name[] = CONFIG_EXAMPLE_PEER_DEVICE_NAME;
|
||||
|
||||
static char *bda2str(esp_bd_addr_t bda, char *str, size_t size)
|
||||
{
|
||||
|
@ -0,0 +1,2 @@
|
||||
CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI=y
|
||||
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_HFP"
|
@ -0,0 +1,158 @@
|
||||
# SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
import os.path
|
||||
from typing import Tuple
|
||||
|
||||
import pexpect
|
||||
import pytest
|
||||
from pytest_embedded_idf.dut import IdfDut
|
||||
|
||||
|
||||
# Case 1: SPP
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.wifi_two_dut
|
||||
@pytest.mark.parametrize(
|
||||
'count, app_path, target, erase_all', [
|
||||
(2,
|
||||
f'{os.path.join(os.path.dirname(__file__), "bt_spp_acceptor")}|{os.path.join(os.path.dirname(__file__), "bt_spp_initiator")}',
|
||||
'esp32|esp32', 'y'),
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_bt_spp_only(app_path: str, dut: Tuple[IdfDut, IdfDut]) -> None:
|
||||
acceptor = dut[0]
|
||||
initiator = dut[1]
|
||||
|
||||
acceptor.expect_exact('ESP_SPP_INIT_EVT', timeout=30)
|
||||
acceptor.expect_exact('ESP_SPP_START_EVT', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_INIT_EVT', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_DISCOVERY_COMP_EVT', timeout=30)
|
||||
initiator_output = initiator.expect(pexpect.TIMEOUT, timeout=5)
|
||||
|
||||
if 'ESP_BT_GAP_KEY_REQ_EVT Please enter passkey!' in str(initiator_output):
|
||||
passkey = acceptor.expect(r'ESP_BT_GAP_KEY_NOTIF_EVT passkey:(\d+)').group(1).decode('utf8')
|
||||
initiator.write(f'spp key {passkey};')
|
||||
acceptor.expect_exact('authentication success', timeout=30)
|
||||
initiator.expect_exact('authentication success', timeout=30)
|
||||
acceptor.expect_exact('ESP_SPP_SRV_OPEN_EVT status:0', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_OPEN_EVT', timeout=30)
|
||||
|
||||
|
||||
# Case 2: SPP_VFS
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.wifi_two_dut
|
||||
@pytest.mark.parametrize(
|
||||
'count, app_path, target', [
|
||||
(2,
|
||||
f'{os.path.join(os.path.dirname(__file__), "bt_spp_vfs_acceptor")}|{os.path.join(os.path.dirname(__file__), "bt_spp_vfs_initiator")}',
|
||||
'esp32|esp32'),
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_bt_spp_vfs(app_path: str, dut: Tuple[IdfDut, IdfDut]) -> None:
|
||||
acceptor = dut[0]
|
||||
initiator = dut[1]
|
||||
|
||||
acceptor.expect_exact('ESP_SPP_INIT_EVT', timeout=30)
|
||||
acceptor.expect_exact('ESP_SPP_VFS_REGISTER_EVT', timeout=30)
|
||||
acceptor.expect_exact('ESP_SPP_START_EVT', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_INIT_EVT', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_VFS_REGISTER_EVT', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_DISCOVERY_COMP_EVT', timeout=30)
|
||||
initiator.expect_exact('ESP_SPP_OPEN_EVT', timeout=30)
|
||||
acceptor.expect_exact('ESP_SPP_SRV_OPEN_EVT status:0', timeout=30)
|
||||
|
||||
|
||||
# Case 3: A2DP
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.wifi_two_dut
|
||||
@pytest.mark.parametrize(
|
||||
'count, app_path, target', [
|
||||
(2,
|
||||
f'{os.path.join(os.path.dirname(__file__), "a2dp_sink")}|{os.path.join(os.path.dirname(__file__), "a2dp_source")}',
|
||||
'esp32|esp32'),
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_bt_a2dp(app_path: str, dut: Tuple[IdfDut, IdfDut]) -> None:
|
||||
sink_dut = dut[0]
|
||||
source_dut = dut[1]
|
||||
source_dut_mac = source_dut.expect(r'Bluetooth MAC: (([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})').group(1).decode('utf8')
|
||||
sink_dut.expect_exact('A2DP PROF STATE: Init Complete', timeout=30)
|
||||
source_dut.expect_exact('a2dp connecting to peer', timeout=30)
|
||||
source_dut.expect_exact('a2dp connected', timeout=30)
|
||||
source_dut.expect_exact('a2dp media start successfully', timeout=30)
|
||||
sink_dut.expect_exact(f'A2DP connection state: Connected, [{source_dut_mac}]', timeout=30)
|
||||
sink_dut.expect_exact('start volume change simulation', timeout=30)
|
||||
|
||||
|
||||
# Case 4: HFP
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.wifi_two_dut
|
||||
@pytest.mark.parametrize(
|
||||
'count, app_path, target, config', [
|
||||
(2,
|
||||
f'{os.path.join(os.path.dirname(__file__), "hfp_ag")}|{os.path.join(os.path.dirname(__file__), "hfp_hf")}',
|
||||
'esp32|esp32', 'all'),
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_bt_hfp(app_path: str, dut: Tuple[IdfDut, IdfDut]) -> None:
|
||||
hfp_ag = dut[0]
|
||||
hfp_hf = dut[1]
|
||||
|
||||
hfp_hf.expect_exact('Found a target device name', timeout=30)
|
||||
hfp_hf.expect_exact('connection state connected', timeout=30)
|
||||
hfp_hf.expect_exact('connection state slc_connected', timeout=30)
|
||||
hfp_ag.expect_exact('connection state CONNECTED', timeout=30)
|
||||
hfp_ag.expect_exact('connection state SLC_CONNECTED', timeout=30)
|
||||
|
||||
|
||||
# # Case 5: HID
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.wifi_two_dut
|
||||
@pytest.mark.parametrize(
|
||||
'count, app_path, target', [
|
||||
(2,
|
||||
f'{os.path.join(os.path.dirname(__file__), "bt_hid_mouse_device")}| \
|
||||
{os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")), "esp_hid_host")}',
|
||||
'esp32|esp32'),
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_bt_hid(app_path: str, dut: Tuple[IdfDut, IdfDut]) -> None:
|
||||
hid_device = dut[0]
|
||||
hid_host = dut[1]
|
||||
|
||||
hid_host_mac = hid_host.expect(r'Bluetooth MAC: (([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})').group(1).decode('utf8')
|
||||
hid_device_mac = hid_device.expect(r'Bluetooth MAC: (([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})').group(1).decode('utf8')
|
||||
|
||||
hid_device.expect_exact('setting hid parameters', timeout=30)
|
||||
hid_device.expect_exact('setting to connectable, discoverable', timeout=30)
|
||||
hid_device.expect_exact(f'connected to {hid_host_mac}', timeout=30)
|
||||
hid_device.expect_exact('making self non-discoverable and non-connectable', timeout=30)
|
||||
hid_host.expect_exact(f'ESP_HIDH_DEMO: {hid_device_mac} OPEN', timeout=30)
|
||||
|
||||
|
||||
# Case 6: L2CAP
|
||||
@pytest.mark.esp32
|
||||
@pytest.mark.wifi_two_dut
|
||||
@pytest.mark.parametrize(
|
||||
'count, app_path, target', [
|
||||
(2,
|
||||
f'{os.path.join(os.path.dirname(__file__), "bt_l2cap_server")}|{os.path.join(os.path.dirname(__file__), "bt_l2cap_client")}',
|
||||
'esp32|esp32'),
|
||||
],
|
||||
indirect=True,
|
||||
)
|
||||
def test_bt_l2cap(app_path: str, dut: Tuple[IdfDut, IdfDut]) -> None:
|
||||
server = dut[0]
|
||||
client = dut[1]
|
||||
|
||||
server.expect_exact('ESP_BT_L2CAP_INIT_EVT: status:0', timeout=30)
|
||||
server.expect_exact('ESP_BT_L2CAP_START_EVT: status:0', timeout=30)
|
||||
server.expect_exact('ESP_SDP_CREATE_RECORD_COMP_EVT: status:0', timeout=30)
|
||||
client.expect_exact('ESP_BT_L2CAP_INIT_EVT: status:0', timeout=30)
|
||||
client.expect_exact('ESP_SDP_SEARCH_COMP_EVT: status:0', timeout=30)
|
||||
client.expect_exact('ESP_BT_L2CAP_OPEN_EVT: status:0', timeout=30)
|
||||
server.expect_exact('ESP_BT_L2CAP_OPEN_EVT: status:0', timeout=30)
|
@ -6,4 +6,10 @@ menu "HID Example Configuration"
|
||||
select BT_NIMBLE_HID_SERVICE
|
||||
help
|
||||
This enables Nimble HID Host
|
||||
|
||||
config EXAMPLE_PEER_DEVICE_NAME
|
||||
string "Target Device Name"
|
||||
default "HID Mouse Example"
|
||||
help
|
||||
Use this option to set target device name to connect.
|
||||
endmenu
|
||||
|
@ -337,38 +337,39 @@ static void handle_bt_device_result(struct disc_res_param *disc_res)
|
||||
uint8_t len = 0;
|
||||
uint8_t *data = 0;
|
||||
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_CMPL_16BITS_UUID, &len);
|
||||
if (data == NULL) {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_INCMPL_16BITS_UUID, &len);
|
||||
}
|
||||
if (data && len == ESP_UUID_LEN_16) {
|
||||
uuid.len = ESP_UUID_LEN_16;
|
||||
uuid.uuid.uuid16 = data[0] + (data[1] << 8);
|
||||
GAP_DBG_PRINTF(", "); print_uuid(&uuid);
|
||||
continue;
|
||||
}
|
||||
do {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_CMPL_16BITS_UUID, &len);
|
||||
if (data == NULL) {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_INCMPL_16BITS_UUID, &len);
|
||||
}
|
||||
if (data && len == ESP_UUID_LEN_16) {
|
||||
uuid.len = ESP_UUID_LEN_16;
|
||||
uuid.uuid.uuid16 = data[0] + (data[1] << 8);
|
||||
GAP_DBG_PRINTF(", "); print_uuid(&uuid);
|
||||
break;
|
||||
}
|
||||
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_CMPL_32BITS_UUID, &len);
|
||||
if (data == NULL) {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_INCMPL_32BITS_UUID, &len);
|
||||
}
|
||||
if (data && len == ESP_UUID_LEN_32) {
|
||||
uuid.len = len;
|
||||
memcpy(&uuid.uuid.uuid32, data, sizeof(uint32_t));
|
||||
GAP_DBG_PRINTF(", "); print_uuid(&uuid);
|
||||
continue;
|
||||
}
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_CMPL_32BITS_UUID, &len);
|
||||
if (data == NULL) {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_INCMPL_32BITS_UUID, &len);
|
||||
}
|
||||
if (data && len == ESP_UUID_LEN_32) {
|
||||
uuid.len = len;
|
||||
memcpy(&uuid.uuid.uuid32, data, sizeof(uint32_t));
|
||||
GAP_DBG_PRINTF(", "); print_uuid(&uuid);
|
||||
break;
|
||||
}
|
||||
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_CMPL_128BITS_UUID, &len);
|
||||
if (data == NULL) {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_INCMPL_128BITS_UUID, &len);
|
||||
}
|
||||
if (data && len == ESP_UUID_LEN_128) {
|
||||
uuid.len = len;
|
||||
memcpy(uuid.uuid.uuid128, (uint8_t *)data, len);
|
||||
GAP_DBG_PRINTF(", "); print_uuid(&uuid);
|
||||
continue;
|
||||
}
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_CMPL_128BITS_UUID, &len);
|
||||
if (data == NULL) {
|
||||
data = esp_bt_gap_resolve_eir_data((uint8_t *)prop->val, ESP_BT_EIR_TYPE_INCMPL_128BITS_UUID, &len);
|
||||
}
|
||||
if (data && len == ESP_UUID_LEN_128) {
|
||||
uuid.len = len;
|
||||
memcpy(uuid.uuid.uuid128, (uint8_t *)data, len);
|
||||
GAP_DBG_PRINTF(", "); print_uuid(&uuid);
|
||||
}
|
||||
} while (0);
|
||||
|
||||
//try to find a name
|
||||
if (name == NULL) {
|
||||
|
@ -51,6 +51,10 @@
|
||||
|
||||
static const char *TAG = "ESP_HIDH_DEMO";
|
||||
|
||||
#if CONFIG_BT_HID_HOST_ENABLED
|
||||
static const char * remote_device_name = CONFIG_EXAMPLE_PEER_DEVICE_NAME;
|
||||
#endif // CONFIG_BT_HID_HOST_ENABLED
|
||||
|
||||
static char *bda2str(esp_bd_addr_t bda, char *str, size_t size)
|
||||
{
|
||||
if (bda == NULL || str == NULL || size < 18) {
|
||||
@ -148,16 +152,26 @@ void hid_demo_task(void *pvParameters)
|
||||
printf("] srv 0x%03x, ", r->bt.cod.service);
|
||||
print_uuid(&r->bt.uuid);
|
||||
printf(", ");
|
||||
if (strncmp(r->name, remote_device_name, strlen(remote_device_name)) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_BT_HID_HOST_ENABLED */
|
||||
printf("NAME: %s ", r->name ? r->name : "");
|
||||
printf("\n");
|
||||
r = r->next;
|
||||
}
|
||||
|
||||
#if CONFIG_BT_HID_HOST_ENABLED
|
||||
if (cr && strncmp(cr->name, remote_device_name, strlen(remote_device_name)) == 0) {
|
||||
esp_hidh_dev_open(cr->bda, cr->transport, cr->ble.addr_type);
|
||||
}
|
||||
#else
|
||||
if (cr) {
|
||||
//open the last result
|
||||
esp_hidh_dev_open(cr->bda, cr->transport, cr->ble.addr_type);
|
||||
}
|
||||
#endif // CONFIG_BT_HID_HOST_ENABLED
|
||||
//free the results
|
||||
esp_hid_scan_results_free(results);
|
||||
}
|
||||
|
1
examples/bluetooth/esp_hid_host/sdkconfig.ci.defaults
Normal file
1
examples/bluetooth/esp_hid_host/sdkconfig.ci.defaults
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_HID_MOUSE_DEVICE"
|
Loading…
x
Reference in New Issue
Block a user