连接模块分析
整体架构概览
连接模块位于 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 = 1 |
TCP | WiFi局域网TCP连接 |
CONNECT_BR = 2 |
BR | 蓝牙基础速率连接 |
CONNECT_BLE = 3 |
BLE | 蓝牙低功耗连接 |
CONNECT_P2P = 4 |
P2P | WiFi Direct P2P连接 |
CONNECT_P2P_REUSE = 5 |
P2P_REUSE | P2P连接复用 |
CONNECT_BLE_DIRECT = 6 |
BLE_DIRECT | BLE直连 |
CONNECT_HML = 7 |
HML | 增强型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.h:
typedef 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 → CLOSED
2.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超时100ms
2.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— 协商命令
执行器:
- 每个远程设备对应一个
WifiDirectExecutor - Executor运行在独立线程中
- 绑定一个
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连接,支持接口名 chba0,IP前缀 172.30.。
5.7 数据管理
- LinkManager — 管理所有WiFi Direct链路
- InterfaceManager — 管理网络接口(p2p0/chba0/wlan0)
- InterfaceInfo — 接口信息(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 控制消息协商引用增减,实现连接复用。
更多推荐


所有评论(0)