4.3.3. Bluetooth Dual-Mode Dongle

4.3.3.1. 概述

  • 蓝牙dongle符合USB和BLE或EDR传输标准,具有即插即用,方便实用的特点。它可用于蓝牙设备之间的数据传输,让电脑能够和周边的蓝牙设备进行无线连接和数据的通讯,自动发现和管理远程蓝牙设备、资源和服务,实现蓝牙设备之间的绑定和自动连接。

  • 蓝牙dongle支持BLE和2.4G两种连接模式;支持连接指定蓝牙名或mac地址;应用示例是连接杰理的鼠标。

  • 蓝牙dongle支持EDR,支持连接指定蓝牙名或mac地址,连接杰理的键盘设备。

  • 蓝牙双模dongle不能同时打开,会降低搜索效率。

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

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

4.3.3.2. 工程配置

  • 代码工程:apps/spp_and_le/board/br25/AC636N_spp_and_le.cbp

  • APP选择,配置app_config.h

//app case 选择,只能选1个,要配置对应的board_config.h
#define CONFIG_APP_DONGLE 1//usb + 蓝牙(ble 主机),PC hid设备
  • 使用EDR模式,还必现打印如下主机搜索使能

#define EDR_EMITTER_EN 1 //蓝牙(edr主机)
  • 板级选择, 配置board_config.h。目前只有AC6368B_DONGLE板子支持蓝牙dongle

//#define CONFIG_BOARD_AC636N_DEMO
#define CONFIG_BOARD_AC6368B_DONGLE //CONFIG_APP_DONGLE
// #define CONFIG_BOARD_AC6363F_DEMO
  • 使能USB和BLE ,需配置board_ac6368b_dongle_cfg.h

#define TCFG_PC_ENABLE ENABLE_THIS_MOUDLE//PC模块使能
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE//U盘模块使能
#define TCFG_OTG_USB_DEV_EN BIT(0)//USB0 = BIT(0) USB1 = BIT(1)
#define TCFG_USER_BLE_ENABLE 1 //BLE或2.4G功能使能
#define TCFG_USER_EDR_ENABLE 0 //EDR功能使能
  • 模式选择,配置BLE或2.4G模式;若选择2.4G配对码必须跟对方的配对码一致

    //2.4G模式: 0—ble, 非0—2.4G配对码 #define CFG_RF_24G_CODE_ID (0) //<=24bits

  • 如果选择BLE模式,则蓝牙dongle默认是按蓝牙名连接从机,需要配置连接的从机蓝牙名

static const u8 dongle_remoter_name1[] = "AC696X_1(BLE)";//
static const u8 dongle_remoter_name2[] = "AC632N_HID123(BLE)";// 自动连接同名的从机
  • 默认上电10秒根据信号强度rssi配对近距离的设备,若配对失败,停止搜索。回连已有的配对设备。

//dongle 上电开配对管理,若配对失败,没有配对设备,停止搜索
#define POWER_ON_PAIR_START      (1)//
#define POWER_ON_PAIR_TIME       (10000)//unit ms,持续配对搜索时间
#define DEVICE_RSSI_LEVEL        (-50)
#define POWER_ON_KEEP_SCAN       (0)//配对失败,保持一直搜索配对

4.3.3.3. 主要代码说明

  • 蓝牙dongle实现文件 app_dongle.c和ble_dg_central,负责模块初始化、处理协议栈事件和命令数据控制发送等。

  • HID描述符, 描述为一个鼠标

static const u8 sHIDReportDesc[] = {
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
0x09, 0x02, // Usage (Mouse)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x09, 0x01, // Usage (Pointer)
  • 使用指定的uuid与从机通信, 需要与从机配合, 省掉了搜索uuid的时间

static const target_uuid_t dongle_search_ble_uuid_table[] = {
{
.services_uuid16 = 0x1812,
.characteristic_uuid16 = 0x2a4d,
.opt_type = ATT_PROPERTY_NOTIFY,
},

{
.services_uuid16 = 0x1812,
.characteristic_uuid16 = 0x2a33,
.opt_type = ATT_PROPERTY_NOTIFY,
},

{
.services_uuid16 = 0x1801,
.characteristic_uuid16 = 0x2a05,
.opt_type = ATT_PROPERTY_INDICATE,
},

};

/*
确定留给从机发数据的3个notify handle
\*/
static const u16 mouse_notify_handle[3] = {0x0027, 0x002b, 0x002f};
  • 用于监听蓝牙数据上报, 并通过USB向PC转发蓝牙数据

*//edr 接收设备数据*
static void dongle_edr_hid_input_handler(u8 *packet, u16 size, u16 channel)
{
    log_info("hid_data_input:chl=%d,size=%d", channel, size);
    put_buf(packet, size);

*//ble 接收设备数据*
void dongle_ble_hid_input_handler(u8 *packet, u16 size)
{
#if TCFG_PC_ENABLE
    hid_send_data(packet, size);
#endif
}
  • 配置BLE的连接方式配置,可以选择通过地址或设备名等方式连接

static const client_match_cfg_t dg_match_device_table[] = {
    {
        .create_conn_mode = BIT(CLI_CREAT_BY_NAME),
        .compare_data_len = sizeof(dg_test_remoter_name1) - 1, *//去结束符*
        .compare_data = dg_test_remoter_name1,
    },

4.3.3.4. OTA升级功能

  • 新增了支持使用PC电脑和安装手机平台升级 Usb Dongle 和 连接的远端HID设备固件。详细的配置和使用说明见发布包文档《Usb Dongle OTA升级使用说明》。