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升级使用说明》。