连接模块分析
整体架构概览连接模块位于 core/connection/ 目录下采用策略模式设计通过ConnectFuncInterface统一接口抽象不同连接类型由ConnServerInit()在初始化时注册各连接类型的实现到全局数组g_connManager[CONNECT_TYPE_MAX]中。连接模块目录结构: ├── manager/ # 连接管理器统一入口 ├── interface/ # 对外接口定义 ├── common/ # 公共组件socket、监听器、数据头转换 ├── br/ # BR连接 ├── ble/ # BLE连接 ├── tcp/ # TCP连接 ├── wifi_direct_cpp/ # WiFi Direct (P2P/HML)连接 └── coap/ # CoAP连接1. 连接管理器 (Connection Manager)核心文件: softbus_conn_manager.c / softbus_conn_manager.h设计模式策略模式 观察者模式连接管理器是整个连接模块的统一入口和调度中心核心设计如下1.1 连接类型路由ConnectFuncInterface *g_connManager[CONNECT_TYPE_MAX] { 0 };全局数组g_connManager以ConnectType为索引存储各连接类型的实现。支持的连接类型定义在 softbus_conn_interface.h枚举值类型说明CONNECT_TCP 1TCPWiFi局域网TCP连接CONNECT_BR 2BR蓝牙基础速率连接CONNECT_BLE 3BLE蓝牙低功耗连接CONNECT_P2P 4P2PWiFi Direct P2P连接CONNECT_P2P_REUSE 5P2P_REUSEP2P连接复用CONNECT_BLE_DIRECT 6BLE_DIRECTBLE直连CONNECT_HML 7HML增强型P2P(HML)连接1.2 ConnectFuncInterface 统一接口typedef struct { int32_t (*ConnectDevice)(const ConnectOption *option, uint32_t requestId, const ConnectResult *result); int32_t (*PostBytes)(uint32_t connectionId, uint8_t *data, uint32_t len, int32_t pid, int32_t flag, int32_t module, int64_t seq); int32_t (*DisconnectDevice)(uint32_t connectionId); int32_t (*DisconnectDeviceNow)(const ConnectOption *option); int32_t (*GetConnectionInfo)(uint32_t connectionId, ConnectionInfo *info); int32_t (*StartLocalListening)(const LocalListenerInfo *info); int32_t (*StopLocalListening)(const LocalListenerInfo *info); bool (*CheckActiveConnection)(const ConnectOption *info, bool needOccupy); int32_t (*UpdateConnection)(uint32_t connectionId, UpdateOption *option); int32_t (*PreventConnection)(const ConnectOption *option, uint32_t time); int32_t (*ConfigPostLimit)(const LimitConfiguration *configuration); } ConnectFuncInterface;每种连接类型BR/BLE/TCP都实现此接口管理器通过connectionId高16位标识连接类型进行路由分发#define CONNECT_TYPE_SHIFT 16 // connectionId (ConnectType 16) | 序号1.3 监听器管理观察者模式typedef struct TagConnListenerNode { ListNode node; ConnModule moduleId; ConnectCallback callback; } ConnListenerNode;各业务模块认证、通道、代理等通过ConnSetConnectCallback()注册回调管理器维护g_listenerList链表。当连接事件发生时遍历所有监听器通知ConnManagerConnected()— 连接建立通知ConnManagerReusedConnected()— 连接复用通知ConnManagerDisconnected()— 连接断开通知ConnManagerRecvData()— 数据接收分发按moduleId路由到对应监听器1.4 初始化流程int32_t ConnServerInit(void) { ConnSocketsAndBaseListenerInit(); // 初始化Socket和基础监听器 g_connManager[CONNECT_TCP] ConnInitTcp(g_connManagerCb); // TCP g_connManager[CONNECT_BR] ConnInitBr(g_connManagerCb); // BR g_connManager[CONNECT_BLE] ConnInitBle(g_connManagerCb); // BLE // 创建监听器链表 g_listenerList CreateSoftBusList(); }1.5 流量控制softbus_conn_flow_control.h 实现了滑动窗口控制器struct ConnSlideWindowController { int32_t (*apply)(struct ConnSlideWindowController *self, int32_t expect); int32_t (*enable)(struct ConnSlideWindowController *self, int32_t windowInMillis, int32_t quotaInBytes); int32_t (*disable)(struct ConnSlideWindowController *self); bool active; int32_t windowInMillis; // 时间窗口(100ms~2s) int32_t quotaInBytes; // 字节配额(10KB~2MB) ListNode histories; };1.6 数据包协议头#define MAGIC_NUMBER 0xBABEFACE typedef struct { int32_t magic; // 魔数 0xBABEFACE int32_t module; // 业务模块ID int64_t seq; // 序列号 int32_t flag; // 优先级标志 uint32_t len; // 数据长度 } __attribute__((packed)) ConnPktHead;2. BR连接 (Bluetooth Basic Rate)核心文件: br/架构分层br/ ├── softbus_conn_br_manager.c/h # BR连接管理器状态机调度 ├── softbus_conn_br_connection.c/h # BR连接实例底层SPP操作 ├── softbus_conn_br_trans.c/h # BR数据传输拥塞控制、ACK机制 ├── softbus_conn_br_send_queue.c/h # BR发送队列 ├── softbus_conn_br_pending_packet.c/h # BR待处理包管理 ├── softbus_conn_br_snapshot.c/h # BR快照DFX诊断 └── softbus_conn_br_hidumper.c/h # BR堆栈信息转储2.1 状态机模型BR管理器采用有限状态机驱动定义在 softbus_conn_br_manager.htypedef struct { char *(*name)(void); void (*enter)(void); void (*exit)(void); void (*connectRequest)(const ConnBrConnectRequestContext *ctx); void (*handlePendingRequest)(void); void (*serverAccepted)(uint32_t connectionId); void (*clientConnected)(uint32_t connectionId); void (*clientConnectFailed)(uint32_t connectionId, int32_t error); void (*clientConnectTimeout)(uint32_t connectionId, const char *address); void (*dataReceived)(ConnBrDataReceivedContext *ctx); void (*connectionException)(uint32_t connectionId, int32_t error); void (*connectionResume)(uint32_t connectionId); void (*disconnectRequest)(uint32_t connectionId); void (*unpend)(const char *addr); void (*reset)(int32_t reason); } ConnBrState;两个核心状态BR_STATE_AVAILABLE— 空闲可接受新连接请求BR_STATE_CONNECTING— 正在连接中新请求进入等待队列设备状态enum ConnBrDeviceState { BR_DEVICE_STATE_INIT, BR_DEVICE_STATE_WAIT_EVENT, BR_DEVICE_STATE_PENDING, BR_DEVICE_STATE_WAIT_SCHEDULE, BR_DEVICE_STATE_SCHEDULING, };2.2 连接实例typedef struct { uint32_t connectionId; ConnSideType side; // CLIENT / SERVER char addr[BT_MAC_LEN]; // 蓝牙MAC地址 uint32_t mtu; // 最大传输单元(3KB) int32_t socketHandle; // SPP socket句柄 enum ConnBrConnectionState state; int32_t connectionRc; // 业务引用计数 int32_t objectRc; // 对象引用计数 // 拥塞控制 int32_t window; // 滑动窗口大小 int64_t sequence; // 发送序列号 int64_t waitSequence; // 等待ACK的序列号 int32_t ackTimeoutCount; // ACK超时计数 } ConnBrConnection;连接状态生命周期CONNECTING → CONNECTED → EXCEPTION → NEGOTIATION_CLOSING → CLOSING → CLOSED2.3 数据传输与拥塞控制BR传输实现了基于ACK的滑动窗口拥塞控制enum BrCtlMessageMethod { BR_METHOD_NOTIFY_REQUEST 1, // 请求引用通知 BR_METHOD_NOTIFY_RESPONSE 2, // 引用通知响应 BR_METHOD_NOTIFY_ACK 4, // ACK确认 BR_METHOD_ACK_RESPONSE 5, // ACK响应 }; // 窗口参数 #define MIN_WINDOW 10 #define MAX_WINDOW 80 #define DEFAULT_WINDOW 20 #define ACK_FAILED_TIMES 3 // ACK失败3次触发异常 #define WAIT_ACK_TIMEOUT_MILLS 100 // ACK超时100ms2.4 ACL碰撞处理BR连接有ACL碰撞检测与避让机制BR_CONNECTION_ACL_RETRY_CONNECT_COLLISION_MILLIS 3s— 碰撞后重试等待BR_CONNECTION_ACL_CONNECT_COLLISION_MILLIS 6s— ACL碰撞等待BR_CONNECT_TIMEOUT_MIN_MILLIS 10s/MAX 20s— 连接超时范围2.5 消息驱动BR管理器使用SoftBusHandlerWrapper消息循环机制enum BrMgrLooperMsg { MSG_NEXT_CMD, MSG_CONNECT_REQUEST, MSG_CONNECT_SUCCESS, MSG_CONNECT_TIMEOUT, MSG_CONNECT_FAIL, MSG_SERVER_ACCEPTED, MSG_DATA_RECEIVED, MSG_CONNECTION_EXECEPTION, MSG_CONNECTION_RESUME, MGR_DISCONNECT_REQUEST, MSG_UNPEND, MSG_RESET, };3. BLE连接 (Bluetooth Low Energy)核心文件: ble/架构分层ble/ ├── softbus_conn_ble_manager.c/h # BLE连接管理器状态机调度 ├── softbus_conn_ble_connection.c/h # BLE连接实例 ├── softbus_conn_ble_client.c/h # GATT客户端 ├── softbus_conn_ble_server.c/h # GATT服务端 ├── softbus_conn_ble_trans.c/h # BLE数据传输 ├── softbus_conn_ble_send_queue.c/h # BLE发送队列 ├── softbus_conn_ble_snapshot.c/h # BLE快照 ├── softbus_conn_ble_hidumper.c/h # BLE堆栈转储 ├── softbus_conn_ble_direct_virtual.c # BLE Direct虚拟实现 ├── ble_protocol_interface_factory.c/h # BLE协议接口工厂 └── softbus_conn_coc_virtual.c # CoC(CoC)虚拟实现3.1 GATT服务架构BLE连接基于GATT (Generic Attribute Profile)协议定义了专用UUID#define SOFTBUS_SERVICE_UUID 11C8B310-80E4-4276-AFC0-F81590B2177F #define SOFTBUS_CHARA_BLENET_UUID 00002B00-0000-1000-8000-00805F9B34FB // 网络控制特征 #define SOFTBUS_CHARA_BLECONN_UUID 00002B01-0000-1000-8000-00805F9B34FB // 连接数据特征 #define SOFTBUS_DESCRIPTOR_CONFIGURE_UUID 00002902-0000-1000-8000-00805F9B34FB // 描述符配置双特征通道设计BLENET特征 (0x2B00)— 网络控制消息引用请求/响应、基本信息交换BLECONN特征 (0x2B01)— 业务数据传输3.2 连接状态机BLE连接状态比BR更复杂因为GATT连接需要服务发现、特征通知订阅、MTU协商等步骤enum ConnBleConnectionState { BLE_CONNECTION_STATE_CONNECTING 0, // 客户端发起连接 BLE_CONNECTION_STATE_CONNECTED, // 服务端已接受 BLE_CONNECTION_STATE_SERVICE_SEARCHING, // 服务发现中 BLE_CONNECTION_STATE_SERVICE_SEARCHED, // 服务发现完成 BLE_CONNECTION_STATE_CONN_NOTIFICATING, // CONN特征通知订阅中 BLE_CONNECTION_STATE_CONN_NOTIFICATED, // CONN特征通知已订阅 BLE_CONNECTION_STATE_NET_NOTIFICATING, // NET特征通知订阅中 BLE_CONNECTION_STATE_NET_NOTIFICATED, // NET特征通知已订阅 BLE_CONNECTION_STATE_MTU_SETTING, // MTU协商中 BLE_CONNECTION_STATE_MTU_SETTED, // MTU协商完成 BLE_CONNECTION_STATE_EXCHANGING_BASIC_INFO, // 基本信息交换中 BLE_CONNECTION_STATE_EXCHANGED_BASIC_INFO, // 基本信息交换完成 BLE_CONNECTION_STATE_NEGOTIATION_CLOSING, // 协商关闭中 BLE_CONNECTION_STATE_CLOSING, // 关闭中 BLE_CONNECTION_STATE_CLOSED, // 已关闭 };3.3 统一协议接口typedef struct { int32_t (*bleClientConnect)(ConnBleConnection *connection); int32_t (*bleClientDisconnect)(ConnBleConnection *connection, bool grace, bool refreshGatt); int32_t (*bleClientSend)(ConnBleConnection *connection, const uint8_t *data, uint32_t dataLen, int32_t module); int32_t (*bleClientUpdatePriority)(ConnBleConnection *connection, ConnectBlePriority priority); int32_t (*bleServerStartService)(void); int32_t (*bleServerStopService)(void); int32_t (*bleServerSend)(ConnBleConnection *connection, const uint8_t *data, uint32_t dataLen, int32_t module); int32_t (*bleServerConnect)(ConnBleConnection *connection); int32_t (*bleServerDisconnect)(ConnBleConnection *connection); int32_t (*bleClientInitModule)(SoftBusLooper *looper, const ConnBleClientEventListener *listener); int32_t (*bleServerInitModule)(SoftBusLooper *looper, const ConnBleServerEventListener *listener); } BleUnifyInterface;通过ble_protocol_interface_factory工厂模式支持GATT和CoC (Connection Oriented Channel)两种底层协议。3.4 BLE连接实例typedef struct { BleProtocolType protocol; // GATT / CoC uint32_t connectionId; ConnSideType side; bool fastestConnectEnable; // 快速连接模式 char addr[BT_MAC_LEN]; uint32_t psm; // CoC的PSM ConnBleReadBuffer buffer; // 数据分片重组缓冲区 int32_t underlayerHandle; // 底层GATT/CoC句柄 uint32_t mtu; // MTU大小(默认512) char udid[UDID_BUF_LEN]; // 设备唯一标识 char networkId[NETWORK_ID_BUF_LEN]; ConnBleFeatureBitSet featureBitSet; // 特性位集 int32_t connectionRc; // 业务引用计数 int32_t objectRc; // 对象引用计数 } ConnBleConnection;3.5 BLE管理器状态机enum BleMgrState { BLE_MGR_STATE_AVAILABLE, // 空闲 BLE_MGR_STATE_CONNECTING, // 连接中 }; enum ConnBleDeviceState { BLE_DEVICE_STATE_INIT, BLE_DEVICE_STATE_WAIT_EVENT, BLE_DEVICE_STATE_WAIT_SCHEDULE, BLE_DEVICE_STATE_SCHEDULING, };3.6 关键特性快速连接模式(fastestConnectEnable): 底层超时设为3.5秒连接复用: 通过UDID查找已有连接进行复用KeepAlive机制: 防止空闲连接被断开超时10秒重试机制: GATT连接最大重试2次空闲超时断开: 60秒无数据自动断开防连接冲突:BlePrevent机制防止短时间内重复连接3.7 数据分片重组BLE由于MTU限制默认512字节需要分片传输typedef struct { uint32_t seq; // 分片序列号 uint32_t size; // 当前分片大小 uint32_t offset; // 偏移量 uint32_t total; // 总大小 } BleTransHeader;4. TCP连接核心文件: tcp/架构tcp/ ├── softbus_tcp_connect_manager.c/h # TCP连接管理器 └── softbus_tcp_connect_virtual.c # 虚拟实现4.1 连接管理TCP连接管理器维护连接信息链表typedef struct TcpConnInfoNode { ListNode node; uint32_t connectionId; ConnectResult result; uint32_t requestId; ConnectStatistics statistics; ConnectionInfo info; } TcpConnInfoNode; static SoftBusList *g_tcpConnInfoList NULL;4.2 核心接口int32_t TcpConnectDevice(const ConnectOption *option, uint32_t requestId, const ConnectResult *result); int32_t TcpDisconnectDevice(uint32_t connectionId); int32_t TcpDisconnectDeviceNow(const ConnectOption *option); int32_t TcpPostBytes(uint32_t connectionId, uint8_t *data, uint32_t len, int32_t pid, int32_t flag, int32_t module, int64_t seq); int32_t TcpGetConnectionInfo(uint32_t connectionId, ConnectionInfo *Info); int32_t TcpStartListening(const LocalListenerInfo *info); int32_t TcpStopListening(const LocalListenerInfo *info);4.3 连接ID计算uint32_t CalTcpConnectionId(int32_t fd) { // fd作为低16位CONNECT_TCP作为高16位 return ((uint32_t)CONNECT_TCP CONNECT_TYPE_SHIFT) | (uint32_t)fd; }4.4 事件驱动TCP连接基于SoftbusBaseListener事件驱动模型static int32_t TcpOnConnectEvent(ListenerModule module, int32_t cfd, const ConnectOption *clientAddr); static int32_t TcpOnDataEvent(ListenerModule module, int32_t events, int32_t fd);TcpOnConnectEvent— 处理新连接接入TcpOnDataEvent— 处理数据到达事件4.5 KeepAlive机制#define AUTH_P2P_KEEP_ALIVE_TIME 10 // 保活时间(秒) #define AUTH_P2P_KEEP_ALIVE_INTERVAL 2 // 保活间隔(秒) #define AUTH_P2P_KEEP_ALIVE_COUNT 5 // 保活探测次数4.6 公共组件支撑TCP依赖 common/ 模块softbus_base_listener.c— 基础监听器epoll/select事件驱动softbus_socket.c— Socket操作封装softbus_tcp_socket.c— TCP Socket专用操作softbus_datahead_transform.c— 数据包头字节序转换softbus_epoll_event_implement.c— epoll事件实现softbus_select_event_implement.c— select事件实现5. WiFi Direct (P2P) 连接核心文件: wifi_direct_cpp/这是连接模块中最复杂的子系统采用C实现基于命令-执行器-处理器架构。架构分层wifi_direct_cpp/ ├── command/ # 命令层ConnectCommand, DisconnectCommand, NegotiateCommand等 ├── processor/ # 处理器层P2pV1Processor, NullProcessor ├── entity/ # 实体层P2pEntity状态机 ├── channel/ # 协商通道Auth/Proxy/Dummy NegotiateChannel ├── data/ # 数据层LinkManager, InterfaceManager, NegotiateMessage等 ├── event/ # 事件系统EventDispatcher, EventQueue ├── protocol/ # 协议层JSON/TLV协议 ├── adapter/ # 适配层P2P适配器 ├── dfx/ # 诊断DFX快照、打点、HiDump └── utils/ # 工具类5.1 连接类型enum WifiDirectConnectType { WIFI_DIRECT_CONNECT_TYPE_AUTH_NEGO_P2P 0, // 认证协商P2P WIFI_DIRECT_CONNECT_TYPE_AUTH_NEGO_HML 1, // 认证协商HML WIFI_DIRECT_CONNECT_TYPE_BLE_TRIGGER_HML 2, // BLE触发HML WIFI_DIRECT_CONNECT_TYPE_AUTH_TRIGGER_HML 3, // 认证触发HML WIFI_DIRECT_CONNECT_TYPE_ACTION_TRIGGER_HML 4, // Action触发HML };5.2 角色模型enum WifiDirectRole { WIFI_DIRECT_ROLE_AUTO 1, // 自动选择 WIFI_DIRECT_ROLE_GO 2, // Group Owner WIFI_DIRECT_ROLE_GC 3, // Group Client WIFI_DIRECT_ROLE_BRIDGE_GC 4, // 桥接GC WIFI_DIRECT_ROLE_NONE 5, // 无角色 WIFI_DIRECT_ROLE_HML 6, // HML角色 };5.3 P2P实体状态机P2pEntity 是P2P连接的核心实体采用状态模式P2pEntity状态: ├── P2pAvailableState → 可用状态可创建/加入组 ├── P2pConnectState → 连接中状态 ├── P2pCreateGroupState → 创建组中状态 ├── P2pDestroyGroupState → 销毁组中状态 └── P2pUnavailableState → 不可用状态状态转换由P2P系统事件驱动OnP2pStateChangeEvent— P2P开关状态变化OnP2pConnectionChangeEvent— P2P连接状态变化5.4 命令-执行器-处理器架构命令:ConnectCommand— 连接命令DisconnectCommand— 断开命令ForceDisconnectCommand— 强制断开命令NegotiateCommand— 协商命令执行器:每个远程设备对应一个WifiDirectExecutorExecutor运行在独立线程中绑定一个WifiDirectProcessor处理具体逻辑处理器:P2pV1Processor— P2P V1版本处理器NullProcessor— 空处理器5.5 协商通道// 三种协商通道: AuthNegotiateChannel → 基于认证通道的协商 ProxyNegotiateChannel → 基于代理通道的协商 DummyNegotiateChannel → 虚拟协商通道5.6 链路类型enum WifiDirectLinkType { WIFI_DIRECT_LINK_TYPE_P2P, // 标准P2P链路 WIFI_DIRECT_LINK_TYPE_HML, // HML(High Molecular Link)增强链路 };HML是增强型P2P连接支持接口名chba0IP前缀172.30.。5.7 数据管理LinkManager— 管理所有WiFi Direct链路InterfaceManager— 管理网络接口p2p0/chba0/wlan0InterfaceInfo— 接口信息IP、角色、带宽等InnerLink— 内部链路抽象NegotiateMessage— 协商消息JSON/TLV序列化5.8 协议层// 两种序列化协议: JsonProtocol → JSON格式协商消息 TlvProtocol → TLV格式协商消息通过WifiDirectProtocolFactory工厂创建。6. CoAP连接核心文件: coap/当前实现状态CoAP连接在开源版本中是虚拟实现stub实际实现在增强包中// conn_coap_manager_virtual.c (开源版本) int32_t ConnCoapStartServerListen(void) { return SOFTBUS_FUNC_NOT_SUPPORT; // 返回不支持 } void ConnCoapStopServerListen(void) { return; }构建配置从 conn.gni 可以看到CoAP的实际实现在增强包路径if (dsoftbus_feature_ex_kits) { import($dsoftbus_root_path/dsoftbus_enhance/core/connection/coap/conn_coap.gni) conn_manager_inc conn_coap_inc conn_manager_src conn_coap_src } else { # 开源版本使用虚拟实现 conn_manager_src [ $dsoftbus_root_path/core/connection/coap/src/conn_coap_manager_virtual.c, ] }CoAP定位CoAP (Constrained Application Protocol) 在分布式软总线中主要用于设备发现阶段的轻量级通信而非数据传输通道。它不注册到g_connManager数组中而是作为独立的服务存在。连接选择策略不同连接类型适用于不同场景连接类型带宽延迟功耗适用场景BR中(3KB MTU)中中蓝牙数据传输、无WiFi场景BLE低(512B MTU)高低设备发现、小数据传输、保活TCP高低中WiFi局域网大数据传输P2P高低高高速直连通道HML高低高增强型P2P高速通道CoAP极低高极低设备发现阶段轻量通信引用计数机制BR和BLE连接都采用双引用计数设计connectionRc— 业务引用计数记录业务使用次数为0时触发断连objectRc— 对象引用计数用于内存管理为0时释放对象通过NotifyRequest/NotifyResponse控制消息协商引用增减实现连接复用。