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:
Wang Meng Yang 2024-08-07 14:19:42 +08:00
commit 79aa71958c
39 changed files with 409 additions and 54 deletions

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_A2DP_SINK"

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_A2DP_SINK"

View File

@ -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.')

View File

@ -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

View File

@ -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;

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_HID_MOUSE_DEVICE"

View File

@ -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

View File

@ -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();

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_L2CAP_SERVER"

View File

@ -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

View File

@ -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;

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_L2CAP_SERVER"

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_ACCEPTOR"

View File

@ -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

View File

@ -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;

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_ACCEPTOR"

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_VFS_ACCEPTOR"

View File

@ -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

View File

@ -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;

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_SPP_VFS_ACCEPTOR"

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1,2 @@
CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI=y
CONFIG_EXAMPLE_LOCAL_DEVICE_NAME="${CI_PIPELINE_ID}_HFP"

View File

@ -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

View File

@ -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)
{

View File

@ -0,0 +1,2 @@
CONFIG_BT_HFP_AUDIO_DATA_PATH_HCI=y
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_HFP"

View File

@ -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)

View File

@ -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

View File

@ -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) {

View File

@ -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);
}

View File

@ -0,0 +1 @@
CONFIG_EXAMPLE_PEER_DEVICE_NAME="${CI_PIPELINE_ID}_HID_MOUSE_DEVICE"