11免费建网站密友购app开发公司

当前位置: 首页 > news >正文

11免费建网站,密友购app开发公司,中国交通建设集团有限公司待遇,厦门市住房建设网站蓝牙 GAP#xff08;通用访问配置文件#xff09;模块是蓝牙协议栈的核心组件#xff0c;负责设备发现、连接管理及基础属性暴露等关键功能。本文围绕 Android蓝牙协议栈 GAP 模块的初始化流程与连接管理实现展开#xff0c;结合代码解析其核心函数#xff08;GAP_Init、g…蓝牙 GAP通用访问配置文件模块是蓝牙协议栈的核心组件负责设备发现、连接管理及基础属性暴露等关键功能。本文围绕 Android蓝牙协议栈 GAP 模块的初始化流程与连接管理实现展开结合代码解析其核心函数GAP_Init、gap_conn_init、gap_attr_db_init的功能逻辑以及关键数据结构tGAP_CONN、tGAP_CCB、tGAP_ATTR等的设计意图。通过分析 GAP 模块与 L2CAP 层的协议交互、连接状态机管理以及 GATT 属性数据库的初始化过程揭示 GAP 模块在蓝牙设备发现、配对及连接中的基础支撑作用。 一、概述 蓝牙 GAP 模块作为协议栈的 “入口”其核心目标是为上层应用提供统一的设备管理接口并确保底层协议如 L2CAP、GATT的高效协作。本文聚焦以下核心内容 1.1 GAP 模块初始化流程GAP_Init GAP_Init是 GAP 模块的基础初始化入口函数设计上确保 “每次栈调用仅执行一次”。其通过调用两个子函数完成初始化 gap_conn_init初始化 GAP 连接管理模块通过注册 L2CAP 层事件回调如连接请求、数据到达建立与 L2CAP 的协议交互通道 gap_attr_db_init初始化 GAP 的 GATT 属性数据库向外暴露 BLE 设备的基础属性如设备名称、图标、地址解析状态支撑设备发现与配对。
1.2 连接管理核心gap_conn_init与数据结构 gap_conn_init的核心任务是初始化连接管理的全局状态并建立与 L2CAP 层的事件交互。通过memset清零全局结构体tGAP_CONN确保初始状态可控随后为reg_info成员注册 L2CAP 事件回调如gap_connect_ind处理连接请求、gap_data_ind处理数据到达实现对 L2CAP 事件的响应。 关键数据结构tGAP_CONN通过ccb_pool数组管理最多 30 个并发连接GAP_MAX_CONNECTIONS每个连接由tGAP_CCB结构体控制。tGAP_CCB通过状态机con_state如IDLE→LISTENING→CONNECTED和标志位con_flags如配置完成、安全验证完成严格管理连接生命周期并通过队列tx_queue、rx_queue实现流量控制确保数据可靠传输。 1.3 属性数据库初始化gap_attr_db_init gap_attr_db_init的核心是在 GATT 服务器中创建 GAP 服务并初始化其属性数据库向外暴露 BLE 设备的基础信息。通过以下步骤实现 注册 GATT 服务通过GATT_Register创建应用实例获取 GATT 接口句柄gatt_if 定义服务与特征声明主服务UUID 0x1800并添加设备名称0x2A00、图标0x2A01、地址解析0x2AA6等特征部分场景外设模式添加首选连接参数0x2A04特征 绑定属性缓存将 GATT 服务器分配的特征句柄与本地数组gatt_attr绑定便于后续快速访问或修改属性值如更新设备名称。
二、源码解析 GAP_Init packages/modules/Bluetooth/system/stack/gap/gap_conn.cc /** This routine should not be called except once per stack invocation./ void GAP_Init(void) {gap_conn_init();gap_attr_db_init(); } GAP 模块的基础初始化确保后续功能正确运行。 gap_conn_init packages/modules/Bluetooth/system/stack/gap/gap_conn.cc namespace { tGAP_CONN conn; } // namespace/******************************************************************************** Function gap_conn_init** Description This function is called to initialize GAP connection* management** Returns void*****************************************************************************/ void gap_conn_init(void) {memset(conn, 0, sizeof(tGAP_CONN));// 注册 L2CAP 层回调函数建立协议层交互通道conn.reg_info.pL2CA_ConnectInd_Cb gap_connect_ind;conn.reg_info.pL2CA_ConnectCfm_Cb gap_connect_cfm;conn.reg_info.pL2CA_ConfigInd_Cb gap_config_ind;conn.reg_info.pL2CA_ConfigCfm_Cb gap_config_cfm;conn.reg_info.pL2CA_DisconnectInd_Cb gap_disconnect_ind;conn.reg_info.pL2CA_DataInd_Cb gap_data_ind;conn.reg_info.pL2CA_CongestionStatus_Cb gap_congestion_ind;conn.reg_info.pL2CA_TxComplete_Cb gap_tx_complete_ind;conn.reg_info.pL2CA_Error_Cb gap_on_l2cap_error; } GAP模块的连接管理部分主要实现 GAP 连接管理模块的初始化逻辑。为conn.reg_info注册信息结构体中的L2CAP 层事件回调函数指针赋值建立 GAP 模块与 L2CAP 层的事件交互通道。每个回调函数对应 L2CAP 层的一个关键事件 回调函数指针含义与作用pL2CA_ConnectInd_CbL2CAP 连接请求指示回调。当底层收到 L2CAP 连接请求时触发gap_connect_ind处理如验证请求、分配资源。pL2CA_ConnectCfm_CbL2CAP 连接确认回调。当 L2CAP 连接成功建立后触发gap_connect_cfm通知上层如更新连接状态。pL2CA_ConfigInd_CbL2CAP 配置请求指示回调。当收到 L2CAP 连接参数配置请求时触发gap_config_ind处理如协商 MTU、QoS。pL2CA_ConfigCfm_CbL2CAP 配置确认回调。当配置完成后触发gap_config_cfm同步最终配置结果。pL2CA_DisconnectInd_CbL2CAP 断开连接指示回调。当 L2CAP 连接断开时触发gap_disconnect_ind清理资源如释放连接句柄。pL2CA_DataInd_CbL2CAP 数据到达指示回调。当收到 L2CAP 层数据时触发gap_data_ind向上层传递数据如 GATT/ATT 处理。pL2CA_CongestionStatus_CbL2CAP 拥塞状态变化回调。当底层发生拥塞或恢复时触发gap_congestion_ind调整发送策略如暂停发数据。pL2CA_TxComplete_CbL2CAP 数据发送完成回调。当数据成功发送到底层时触发gap_tx_complete_ind释放发送缓冲区。pL2CA_Error_CbL2CAP 错误通知回调。当 L2CAP 层发生错误如协议异常时触发gap_on_l2cap_error处理错误如断开连接。 tGAP_CONN packages/modules/Bluetooth/system/stack/gap/gap_conn.cc // LE 信用模式Credit-Based连接的信用管理 // 背景在蓝牙 LE 的 L2CAP 面向连接通道CoC中信用模式Credit-Based Flow Control用于流量控制。发送方需根据接收方授予的信用值每信用代表 1 个数据包限制发送量 //作用记录信用值的接收和消耗状态确保发送方不会超出接收方的处理能力 struct tGAP_COC_CREDITS {uint16_t credits_received; // 已接收的信用值对端允许发送的数据包数量uint16_t credit_count; // 当前可用的信用值剩余可发送的数据包数量 };// GAP 连接事件回调数据联合体 union tGAP_CB_DATA {tGAP_COC_CREDITS coc_credits; // 当事件与LE信用模式相关时存储信用值数据uint16_t l2cap_result; // 当事件与L2CAP操作结果相关时存储结果状态如成功/失败码 };// GAP 连接事件回调函数指针 / Callback function for connection services / typedef void(tGAP_CONN_CALLBACK)(uint16_t gap_handle, uint16_t event,tGAP_CB_DATA data);// 增强重传模式ERTM配置
// 背景ERTM 是 L2CAP 的一种传输模式支持重传和流量控制用于提高数据传输可靠性 // 作用配置连接的 ERTM 模式影响 L2CAP 层的数据重传策略和错误处理方式
/* Define the structure that applications use to create or accept* connections with enhanced retransmission mode./ typedef struct {uint8_t preferred_mode; // 首选的ERTM模式如基本模式、增强模式 } tL2CAP_ERTM_INFO;typedef uint8_t tBT_TRANSPORT;// LE L2CAP 面向连接通道CoC配置 / Define a structure to hold the configuration parameter for LE L2CAP* connection oriented channels./ struct tL2CAP_LE_CFG_INFO {uint16_t result; / Only used in confirm messages /uint16_t mtu 100;uint16_t mps 100; // 最大数据包大小字节默认100字节uint16_t credits L2CA_LeCreditDefault(); // 初始信用值默认由L2CAP层定义uint8_t number_of_channels L2CAP_CREDIT_BASED_MAX_CIDS; // 最大支持的CoC通道数 };// 单个 L2CAP 连接的状态管理核心结构存储连接的生命周期状态、配置参数和交互接口 / Define the GAP Connection Control Block / typedef struct { // 通过状态迁移如IDLE → LISTENING → CONN_SETUP → CFG_SETUP → CONNECTED严格管理连接的生命周期确保各阶段操作如连接请求、参数协商按顺序执行 #define GAP_CCB_STATE_IDLE 0 #define GAP_CCB_STATE_LISTENING 1 #define GAP_CCB_STATE_CONN_SETUP 2 #define GAP_CCB_STATE_CFG_SETUP 3 #define GAP_CCB_STATE_CONNECTED 5uint8_t con_state;// 通过位掩码快速标记连接的关键里程碑如是否完成配置、安全验证避免复杂的状态判断逻辑 #define GAP_CCB_FLAGS_IS_ORIG 0x01 #define GAP_CCB_FLAGS_HIS_CFG_DONE 0x02 // 标志位对端配置已完成对端参数协商完成 #define GAP_CCB_FLAGS_MY_CFG_DONE 0x04 // 标志位本地配置已完成本地参数协商完成 #define GAP_CCB_FLAGS_SEC_DONE 0x08 #define GAP_CCB_FLAGS_CONN_DONE 0x0Euint8_t con_flags;// 存储连接的基础标识信息如句柄、CID、地址和协商参数如对端 MTU用于在协议栈各层GAP、L2CAP、BTM间传递连接上下文uint8_t service_id; / Used by BTM /uint16_t gap_handle; / GAP handle /uint16_t connection_id; / L2CAP CID /bool rem_addr_specified;uint8_t chan_mode_mask; / Supported channel modes (FCR) /RawAddress rem_dev_address;uint16_t psm;uint16_t rem_mtu_size;// 流量控制与队列管理// 蓝牙底层可能因处理能力限制出现拥塞需通过队列缓存数据并控制发送速率bool is_congested;fixed_queue_t tx_queue; /* Queue of buffers waiting to be sent /fixed_queue_t rx_queue; /* Queue of buffers waiting to be read /uint32_t rx_queue_size; / Total data count in rx_queue /// 回调与配置参数tGAP_CONN_CALLBACK p_callback; /* Users callback function /tL2CAP_CFG_INFO cfg; / Configuration /tL2CAP_ERTM_INFO ertm_info; / Pools and modes for ertm /tBT_TRANSPORT transport; / Transport channel BR/EDR or BLE /tL2CAP_LE_CFG_INFO local_coc_cfg; / local configuration for LE Coc /tL2CAP_LE_CFG_INFO peer_coc_cfg; / local configuration for LE Coc / } tGAP_CCB;/ The maximum number of simultaneous GAP L2CAP connections. / #ifndef GAP_MAX_CONNECTIONS #define GAP_MAX_CONNECTIONS 30 #endiftypedef struct {tL2CAP_APPL_INFO reg_info; / L2CAP Registration info /tGAP_CCB ccb_pool[GAP_MAX_CONNECTIONS]; } tGAP_CONN; GAP模块中与连接管理相关的核心数据结构用于管理L2CAP连接的状态、配置及事件交互。 这些结构体共同构成了 GAP 连接管理模块的核心数据模型 tGAP_CONN作为全局管理结构通过reg_info与 L2CAP 层交互并通过ccb_pool管理所有活动连接。 tGAP_CCB每个连接的 “状态控制器”通过状态机con_state、标志位con_flags和配置参数如local_coc_cfg管理连接的生命周期。 tGAP_CONN_CALLBACK上层应用的 “事件入口”确保连接事件如数据到达、断开能被及时处理。
通过这套数据结构GAP 模块实现了对 L2CAP 连接的高效管理如连接建立、参数协商、流量控制是蓝牙协议栈中连接层的核心基础。 gap_attr_db_init packages/modules/Bluetooth/system/stack/gap/gap_ble.cc // BLE 首选连接参数 typedef struct {uint16_t int_min; // 最小连接间隔单位1.25ms范围0x0006~0x0C80uint16_t int_max; // 最大连接间隔需≥int_minuint16_t latency; // 从机延迟允许从机跳过的连接事件数uint16_t sp_tout; // 监督超时时间单位10ms范围0x000A~0x0C80 } tGAP_BLE_PREF_PARAM;// GAP 属性值联合体 typedef union {tGAP_BLE_PREF_PARAM conn_param; // BLE首选连接参数当属性类型为连接参数时RawAddress reconn_bda; // 重连地址当属性类型为重连地址时uint16_t icon; // 设备图标类型当属性类型为图标时uint8_t
p_dev_name; // 设备名称指针当属性类型为设备名称时uint8_t addr_resolution; // 地址解析标志当属性类型为地址解析时 } tGAP_BLE_ATTR_VALUE;// GAP 属性描述结构体 typedef struct {uint16_t handle; // GATT属性句柄唯一标识GATT数据库中的属性uint16_t uuid; // 属性UUID标识属性类型如设备名称、图标tGAP_BLE_ATTR_VALUE attr_value; // 属性值根据UUID类型选择对应存储方式 } tGAP_ATTR;constexpr int GAP_MAX_CHAR_NUM 4; // GAP服务最多包含4个特征属性 /* LE GAP attribute database / std::arraytGAP_ATTR, GAP_MAX_CHAR_NUM gatt_attr; // 存储所有GAP属性的数组 tGATT_IF gatt_if; // GATT接口标识符用于关联GATT服务器实例/******************************************************************************** Function btm_ble_att_db_init** Description GAP ATT database initalization.** Returns void.******************************************************************************/ void gap_attr_db_init(void) { // 1. 创建并注册 GATT 服务/ Fill our internal UUID with a fixed pattern 0x82 /std::arrayuint8_t, Uuid::kNumBytes128 tmp; // 创建固定模式的128位UUID用于应用标识tmp.fill(0x82);Uuid app_uuid Uuid::From128BitBE(tmp);gatt_attr.fill({});// 注册GATT服务获取接口句柄gatt_ifgatt_if GATT_Register(app_uuid, Gap, gap_cback, false);GATT_StartIf(gatt_if); // 启动GATT接口// 2. 定义 GAP 服务的 GATT 数据库元素Uuid svc_uuid Uuid::From16Bit(UUID_SERVCLASS_GAP_SERVER); // GAP服务UUID标准16位Uuid name_uuid Uuid::From16Bit(GATT_UUID_GAP_DEVICE_NAME); // 设备名称特征UUIDUuid icon_uuid Uuid::From16Bit(GATT_UUID_GAP_ICON); // 设备图标特征UUIDUuid addr_res_uuid Uuid::From16Bit(GATT_UUID_GAP_CENTRAL_ADDR_RESOL); // 地址解析特征UUID// 定义GATT数据库元素服务特征btgatt_db_element_t service[] {{ / 主服务 /.uuid svc_uuid,.type BTGATT_DB_PRIMARY_SERVICE,},{ / 设备名称特征 /.uuid name_uuid,.type BTGATT_DB_CHARACTERISTIC,.properties GATT_CHAR_PROP_BIT_READ, // 可读属性.permissions GATT_PERM_READ_IF_ENCRYPTED_OR_DISCOVERABLE}, // 加密或可发现时可读{ / 设备图标特征 /.uuid icon_uuid,.type BTGATT_DB_CHARACTERISTIC,.properties GATT_CHAR_PROP_BIT_READ,.permissions GATT_PERM_READ // 无条件可读}, { / 中心地址解析特征 /.uuid addr_res_uuid,.type BTGATT_DB_CHARACTERISTIC,.properties GATT_CHAR_PROP_BIT_READ,.permissions GATT_PERM_READ} #if (BTM_PERIPHERAL_ENABLED TRUE) / Only needed for peripheral testing /,{ / 首选连接参数特征仅外设需要 /.uuid Uuid::From16Bit(GATT_UUID_GAP_PREF_CONN_PARAM),.type BTGATT_DB_CHARACTERISTIC,.properties GATT_CHAR_PROP_BIT_READ,.permissions GATT_PERM_READ} #endif};// 3. 向 GATT 服务器添加服务// 将定义好的服务和特征添加到 GATT 服务器的数据库中使其他设备如手机可以通过 GATT 协议发现并访问这些属性/ Add a GAP service /GATTS_AddService(gatt_if, service,sizeof(service) / sizeof(btgatt_db_element_t));// 4. 初始化本地属性缓存gatt_attr// 设备名称属性gatt_attr[0].uuid GATT_UUID_GAP_DEVICE_NAME;gatt_attr[0].handle service[1].attribute_handle; // 特征句柄由GATT服务器分配// 设备图标属性gatt_attr[1].uuid GATT_UUID_GAP_ICON;gatt_attr[1].handle service[2].attribute_handle;// 地址解析属性初始值设为0gatt_attr[2].uuid GATT_UUID_GAP_CENTRAL_ADDR_RESOL;gatt_attr[2].handle service[3].attribute_handle;gatt_attr[2].attr_value.addr_resolution 0;#if (BTM_PERIPHERAL_ENABLED TRUE) / Only needed for peripheral testing */// 外设模式初始化连接参数gatt_attr[3].uuid GATT_UUID_GAP_PREF_CONN_PARAM;// 默认最大间隔61.25ms7.5msgatt_attr[3].attr_value.conn_param.int_max GAP_PREFER_CONN_INT_MAX; / 6 */// 默认最小间隔01.25ms0ms实际需≥6gatt_attr[3].attr_value.conn_param.int_min GAP_PREFER_CONN_INT_MIN; / 0 /gatt_attr[3].attr_value.conn_param.latency GAP_PREFER_CONN_LATENCY; / 0 */// 默认监督超时200010ms20sgatt_attr[3].attr_value.conn_param.sp_tout GAP_PREFER_CONN_SP_TOUT; / 2000 */gatt_attr[3].handle service[4].attribute_handle; #endif } 完成GAP GATT 属性数据库的初始化用于向外暴露 BLE 设备的基础属性如设备名称、图标、地址解析状态等。这些属性是 BLE 设备发现、配对和连接的基础其他设备如手机通过读取这些属性可获取设备的基本信息和能力从而完成后续交互如连接参数协商。 主服务BTGATT_DB_PRIMARY_SERVICE声明这是一个主 GAP 服务UUID 为标准的UUID_SERVCLASS_GAP_SERVER0x1800。 特征BTGATT_DB_CHARACTERISTIC每个特征对应一个具体属性 设备名称GATT_UUID_GAP_DEVICE_NAME0x2A00存储设备的友好名称如 “我的蓝牙耳机” 设备图标GATT_UUID_GAP_ICON0x2A01标识设备类型的图标如耳机图标对应的数值 中心地址解析GATT_UUID_GAP_CENTRAL_ADDR_RESOL0x2AA6指示是否支持地址解析隐私功能相关 首选连接参数GATT_UUID_GAP_PREF_CONN_PARAM0x2A04仅在外设模式启用存储设备希望的连接参数如int_min/int_max。 将 GATT 服务器分配的特征句柄attribute_handle与本地gatt_attr数组绑定后续上层可通过gatt_attr快速访问或修改属性值如更新设备名称。 GATT_Register、GATT_StartI f和 GATTS_AddService分析见【Bluedroid】蓝牙启动之gatt_init 流程源码解析 三、GAP 模块初始化流程图 四、GAP 模块初始化时序图 五、总结 蓝牙 GAP 模块通过 “初始化流程 - 连接管理 - 属性暴露” 的协同设计实现了对蓝牙设备发现、连接建立及基础属性交互的核心支撑 初始化流程GAP_Init确保模块在生命周期内仅执行一次基础配置避免资源重复分配 连接管理gap_conn_init与tGAP_CONN/tGAP_CCB通过状态机、队列和协议回调实现对 L2CAP 连接的高效控制如参数协商、流量控制 属性数据库gap_attr_db_init与gatt_attr通过 GATT 协议向外暴露设备信息是其他设备如手机发现、配对和协商连接参数的基础。
这些设计共同保障了蓝牙设备间的互操作性与通信可靠性是蓝牙协议栈中连接层的核心基础。