4.3.4. APP - Bluetooth Dual-Mode Central

4.3.4.1. 概述

  • Central中心设备是使用GATT的client角色,在SDK中是以主机Master的方式实现,主动发起搜索和连接其他BLE设备。连接成功后遍历从机GATT的Services信息数据。最大支持16个Sevices遍历。

  • SDK的例子是以杰理的数传SDK的BLE的设备中Services为搜索目标,用户根据需求也可自行搜索过滤其他的Services。

  • 支持的板级: br25、br23、bd19、br34

  • 支持的芯片: AC636N、AC635N、AC632N、AC638N

4.3.4.2. 工程配置

  • 代码工程:apps/spp_and_le/board/bd19/AC632N_spp_and_le.cbp

  • 先配置板级board_config.h和对应配置文件中蓝牙ble使能

*/\**
 *  板级配置选择
 */
#define CONFIG_BOARD_AC632N_DEMO       \ *// CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER*

#include "board_ac632n_demo_cfg.h"
  • 配置只支持ble模块

#define TCFG_USER_BLE_ENABLE                      1   //BLE功能使能
#define TCFG_USER_EDR_ENABLE                      0   //EDR功能使能
  • 配置app选择

//app case 选择,只能选1个,要配置对应的board_config.h
#define CONFIG_APP_CENTRAL 1 //ble client,中心设备

4.3.4.3. 主要代码说明

  • BLE实现文件 ble_central.c,负责模块初始化、处理GATT模块事件和命令数据控制发送等。

  • 配置GATT client的模块基本要素。

static const sm_cfg_t cetl_sm_init_config = {

static gatt_ctrl_t cetl_gatt_control_block = {

static const gatt_client_cfg_t central_client_init_cfg = {
    .event_packet_handler = cetl_client_event_packet_handler,
};
  • 配置搜索的GATT服务以及记录搜索到的信息,支持16bit和128 bit的UUID。

  • 配置扫描匹配的设备

*//配置多个扫描匹配设备*
static const u8 cetl_test_remoter_name1[] = "AC897N_MX(BLE)";\ *//*
static client_match_cfg_t cetl_match_device_table[] = {
#if MATCH_CONFIG_NAME
  • 搜索匹配设备会发聩事件处理

case GATT_COMM_EVENT_SCAN_DEV_MATCH: {
        log_info("match_dev:addr_type= %d\n", packet[0]);
        put_buf(&packet[1], 6);
        if (packet[8] == 2) {
            log_info("is TEST_BOX\n");
        }
        client_match_cfg_t *match_cfg = ext_param;
        if (match_cfg) {
            log_info("match_mode: %d\n", match_cfg->create_conn_mode);

                if (match_cfg->compare_data_len) {
                put_buf(match_cfg->compare_data, match_cfg->compare_data_len);
                }
                }

        }

break;
  • 配置连上后搜索的uuid

*//指定搜索uuid*
*//指定搜索uuid*
static const target_uuid_t  jl_cetl_search_uuid_table[] = {

    *// for uuid16*
    *// PRIMARY_SERVICE, ae30*
    *// CHARACTERISTIC,  ae01, WRITE_WITHOUT_RESPONSE | DYNAMIC,*
    *// CHARACTERISTIC,  ae02, NOTIFY,*
{

.services_uuid16 = 0xae30,
.characteristic_uuid16 = 0xae01,
.opt_type = ATT_PROPERTY_WRITE_WITHOUT_RESPONSE,
},

{
.services_uuid16 = 0xae30,
.characteristic_uuid16 = 0xae02,
.opt_type = ATT_PROPERTY_NOTIFY,
},
  • 查找到匹配的UUID和handle,处理事件,并且可以记录操作handle。

case GATT_COMM_EVENT_GATT_SEARCH_MATCH_UUID: {
        opt_handle_t *opt_hdl = packet;
        log_info("match:server_uuid= %04x,charactc_uuid= %04x,value_handle= %04x\n", \\
                 opt_hdl->search_uuid->services_uuid16, opt_hdl->search_uuid->characteristic_uuid16, opt_hdl->value_handle);
#if cetl_TEST_WRITE_SEND_DATA
        *//for test*
        if (opt_hdl->search_uuid->characteristic_uuid16 == 0xae01) {
            cetl_ble_client_write_handle = opt_hdl->value_handle;
        }
#endif
}

break;
  • 配置扫描和连接参数:扫描参数以0.625ms为单位,设置如下所示:

#define SET_SCAN_TYPE       SCAN_ACTIVE
#define SET_SCAN_INTERVAL   48
#define SET_SCAN_WINDOW     16
  • 连接参数interval是以1.25ms为单位,timeout是以10ms为单位,如下图:

#define SET_CONN_INTERVAL   0x30
#define SET_CONN_LATENCY    0
#define SET_CONN_TIMEOUT    0x180
  • 以上两组参数请慎重修改,必须按照蓝牙的协议规范来定义修改。