2026/7/21 12:33:48

分布式软总线组网模块

分布式软总线组网模块 一、概述LNNLocal Nearest Neighbor组网模块是DSoftBus分布式软总线系统的协调中枢位于core/bus_center/lnn/目录下。它不直接参与设备发现、物理连接建立或数据传输而是负责网络拓扑管理、节点状态维护、通道选择分配和主节点选举等协调工作。核心定位LNN是整个DSoftBus架构中的编排协调层对上承接Transmission传输请求对下调用Connection建立物理通道、调用Authentication完成设备认证。二、模块架构总览2.1 目录结构core/bus_center/ ├── interface/ # 【接口层】对外API │ ├── bus_center_manager.h # 组网管理器接口 │ └── bus_center_info_key.h # 信息键值定义 ├── ipc/ # 【IPC通信层】 │ ├── mini/ # 轻量级IPC实现 │ ├── small/ # 小型IPC实现 │ └── standard/ # 标准IPC实现 └── lnn/ # 【LNN组网核心】 ├── net_builder/ # 网络构建器 ├── net_ledger/ # 网络账本 ├── net_buscenter/ # 网络管理器 ├── lane_hub/ # 通道枢纽 ├── disc_mgr/ # 组网内CoAP发现封装 ├── decision_center/ # 决策中心 └── meta_node/ # 元节点管理2.2 核心子模块职责子模块路径核心职责关键文件Net Builderlnn/net_builder/网络构建、连接FSM、拓扑管理lnn_net_builder.c、lnn_connection_fsm.cNet Ledgerlnn/net_ledger/节点信息存储、本地/分布式账本lnn_node_info.h、lnn_net_ledger.hNet BusCenterlnn/net_buscenter/网络协议调度、物理子网抽象lnn_network_manager.cLane Hublnn/lane_hub/通道选择、评分、分配、心跳lnn_lane.c、lnn_lane_select.cDisc Mgrlnn/disc_mgr/LNN内部的CoAP发现封装lnn_discovery_manager.cDecision Centerlnn/decision_center/网络决策策略lnn_decision_center.hMeta Nodelnn/meta_node/元节点管理lnn_meta_node_interface.h三、详细设计分析3.1 接口层Bus Center Manager文件:core/bus_center/interface/bus_center_manager.h职责: 作为LNN模块的对外统一接口提供节点管理、信息查询、组网操作等API。核心API分类:// 1. 服务发布与发现封装Discovery模块 int32_t LnnPublishService(const char *pkgName, const PublishInfo *info, bool isInnerRequest, int32_t callingPid); int32_t LnnStartDiscDevice(const char *pkgName, const SubscribeInfo *info, const InnerCallback *cb, bool isInnerRequest, int32_t callingPid); // 2. 远程节点信息查询键值对形式 int32_t LnnGetRemoteStrInfo(const char *networkId, InfoKey key, char *info, uint32_t len); int32_t LnnGetRemoteNumInfo(const char *networkId, InfoKey key, int32_t *info); // 3. 本地节点信息管理 int32_t LnnSetLocalStrInfo(InfoKey key, const char *info); int32_t LnnGetLocalDeviceInfo(NodeBasicInfo *info); // 4. 在线节点管理 int32_t LnnGetAllOnlineNodeInfo(NodeBasicInfo **info, int32_t *infoNum); bool LnnIsMasterNode(void); // 5. 组网操作 int32_t LnnServerJoin(ConnectionAddr *addr, const char *pkgName, bool isForceJoin); int32_t LnnServerLeave(const char *networkId, const char *pkgName); // 6. 通道属性类型 typedef enum { LNN_MESSAGE_LANE 1, // 消息通道 LNN_BYTES_LANE, // 字节通道 LNN_FILE_LANE, // 文件通道 LNN_STREAM_LANE, // 流媒体通道 LNN_LANE_PROPERTY_BUTT, } LnnLaneProperty;设计特点:封装Discovery模块: 对外隐藏发现细节提供统一的发布/订阅接口键值对信息管理: 通过InfoKey枚举定义信息类型支持字符串、数字、字节等多种数据类型通道属性抽象: 定义LnnLaneProperty区分不同类型的通道消息、字节、文件、流媒体3.2 网络构建器Net Builder文件路径:core/bus_center/lnn/net_builder/核心职责: 负责设备加入网络Join、离开网络Leave、连接状态机管理、拓扑信息同步。3.2.1 连接有限状态机Connection FSM文件:lnn_connection_fsm.c设计模式: 采用**有限状态机FSM - Finite State Machine**管理设备连接的生命周期。状态定义:typedef enum { STATE_AUTH_INDEX 0, // 【认证态】等待设备认证 STATE_CLEAN_INVALID_CONN_INDEX, // 【清理态】清理无效连接 STATE_ONLINE_INDEX, // 【在线态】设备已上线 STATE_LEAVING_INDEX, // 【离开态】设备正在离开 STATE_CONN_NUM_MAX, } ConnFsmStateIndex;状态转换图:连接标志位Flag:#define LNN_CONN_INFO_FLAG_JOIN_REQUEST 0x01 // 主动加入请求 #define LNN_CONN_INFO_FLAG_JOIN_AUTO 0x02 // 自动加入 #define LNN_CONN_INFO_FLAG_JOIN_PASSIVE 0x04 // 被动加入被邀请 #define LNN_CONN_INFO_FLAG_LEAVE_REQUEST 0x08 // 主动离开请求 #define LNN_CONN_INFO_FLAG_LEAVE_AUTO 0x10 // 自动离开 #define LNN_CONN_INFO_FLAG_LEAVE_PASSIVE 0x20 // 被动离开超时在线类型OnlineType:typedef enum { ONLINE_TYPE_INVALID 1, ONLINE_TYPE_WIFI 2, // WiFi在线 ONLINE_TYPE_BLE 3, // BLE在线 ONLINE_TYPE_BLE_THREE_STATE 4, // BLE三态待机/广播/连接 ONLINE_TYPE_BR 5, // 蓝牙经典Bluetooth Classic BR/EDR } OnlineType;3.2.2 主节点选举Master Election文件:lnn_net_builder.c-UpdateLocalMasterNode()选举机制: 基于**节点权重Node Weight**的选主算法权重高的节点当选为主节点。void UpdateLocalMasterNode(bool isCurrentNode, const char *masterUdid, int32_t weight) { // 1. 更新本地存储的主节点UDID (void)LnnSetLocalStrInfo(STRING_KEY_MASTER_NODE_UDID, masterUdid); // 2. 更新主节点权重 (void)LnnSetLocalNumInfo(NUM_KEY_MASTER_NODE_WEIGHT, weight); // 3. 通知其他节点主节点变更 LnnNotifyMasterNodeChanged(isCurrentNode, masterUdid, weight); }选举消息同步:int32_t SyncElectMessage(const char *networkId) { // 构建JSON格式的选举消息 cJSON *json cJSON_CreateObject(); AddStringToJsonObject(json, MasterUdid, masterUdid); // 主节点UDID AddNumberToJsonObject(json, MasterWeight, masterWeight); // 主节点权重 // 通过LNN_INFO_TYPE_MASTER_ELECT消息类型同步给对端 LnnSendSyncInfoMsg(LNN_INFO_TYPE_MASTER_ELECT, networkId, ...); }3.3 网络账本Net Ledger文件路径:core/bus_center/lnn/net_ledger/核心职责: 作为LNN的数据存储层管理节点信息、网络能力、设备状态等核心数据。3.3.1 节点信息结构NodeInfo文件:lnn_node_info.htypedef struct { // 标识信息 char networkId[NETWORK_ID_BUF_LEN]; // 网络唯一ID char uuid[UUID_BUF_LEN]; // 通用唯一标识符兼容Nearby char masterUdid[UDID_BUF_LEN]; // 主节点UDID char nodeAddress[SHORT_ADDRESS_MAX_LEN]; // 节点地址 // 连接状态 ConnectStatus status; // 连接状态在线/离线 ConnectRole role; // 角色Controller/Leaf DiscoveryType discoveryType; // 发现类型WiFi/BLE/BR/P2P/LSA // 网络能力 uint32_t staticNetCap; // 静态网络能力 uint32_t netCapacity; // 网络容量 uint32_t authCapacity; // 认证能力 uint32_t heartbeatCapacity; // 心跳能力 // P2P信息 P2pInfo p2pInfo; // P2P配置信息 // 元信息 MetaInfo metaInfo; // 元节点信息 BatteryInfo batteryInfo; // 电池信息 DeviceBasicInfo deviceInfo; // 设备基本信息 // ... 更多字段 } NodeInfo;3.3.2 发现类型枚举typedef enum { DISCOVERY_TYPE_UNKNOWN 0, DISCOVERY_TYPE_WIFI, // WiFi发现 DISCOVERY_TYPE_BLE, // BLE发现 DISCOVERY_TYPE_BR, // 蓝牙经典发现 DISCOVERY_TYPE_P2P, // P2P发现 DISCOVERY_TYPE_LSA, // 本地服务发现LSA - Local Service Access DISCOVERY_TYPE_SESSION_KEY, // 会话密钥发现 DISCOVERY_TYPE_COUNT, } DiscoveryType;3.3.3 账本初始化// lnn_net_ledger.h int32_t LnnInitNetLedger(void); // 初始化账本 int32_t LnnInitNetLedgerDelay(void); // 延迟初始化账本 int32_t LnnUpdateLocalDeviceInfo(void); // 更新本地设备信息 void RestoreLocalDeviceInfo(void); // 恢复本地设备信息 void LnnDeinitNetLedger(void); // 销毁账本3.4 网络管理器Net BusCenter文件路径:core/bus_center/lnn/net_buscenter/核心职责: 管理和协调不同物理子网Physical Subnet的接入提供统一的网络接口抽象层。3.4.1 网络协议管理器文件:lnn_network_manager.c核心数据结构:// 协议管理器结构 typedef struct LnnProtocolManager { int32_t (*init)(struct LnnProtocolManager *self); // 初始化 void (*deinit)(struct LnnProtocolManager *self); // 销毁 int32_t (*enable)(struct LnnProtocolManager *self, LnnNetIfMgr *netifMgr); // 启用 int32_t (*disable)(struct LnnProtocolManager *self, LnnNetIfMgr *netifMgr); // 禁用 ListenerModule (*getListenerModule)(ListenerMode mode); // 获取监听模块 ProtocolType id; // 协议类型 LnnNetIfType supportedNetif; // 支持的网络接口类型 uint16_t pri; // 优先级 } LnnProtocolManager; // 网络接口管理器 typedef struct { ListNode node; LnnNetIfType type; // 接口类型ETH/WLAN/BR/BLE char ifName[NET_IF_NAME_LEN]; // 接口名称如wlan0、ble0 } LnnNetIfMgr;网络接口类型:#define LNN_NETIF_TYPE_ETH (0x1) // 以太网 #define LNN_NETIF_TYPE_WLAN (0x1 1) // WiFi #define LNN_NETIF_TYPE_BR (0x1 2) // 蓝牙经典BR/EDR #define LNN_NETIF_TYPE_BLE (0x1 3) // 低功耗蓝牙协议注册机制:// 注册协议管理器 int32_t LnnRegistProtocol(LnnProtocolManager *impl); // 获取协议监听模块 ListenerModule LnnGetProtocolListenerModule(ProtocolType protocol, ListenerMode mode); // 遍历网络接口 bool LnnVisitNetif(VisitNetifCallback callback, void *data); // 遍历协议管理器 bool LnnVisitProtocol(VisitProtocolCallback callback, void *data);3.4.2 物理子网管理文件:lnn_physical_subnet_manager.c职责: 管理系统中的物理网络接口Physical Network Interface将不同类型的网络接口抽象为统一的管理结构。3.5 通道枢纽Lane Hub文件路径:core/bus_center/lnn/lane_hub/核心职责:通道Lane是DSoftBus中数据传输路径的抽象Lane Hub负责通道的选择Selection、评分Scoring、分配Assignment和生命周期管理。Lane Hub子模块结构:lane_hub/ ├── common/ # 通道枢纽核心 │ ├── include/lnn_lane_hub.h │ └── src/lnn_lane_hub.c ├── lane_manager/ # 【通道管理器 - 核心】 │ ├── src/lnn_lane.c # 通道主管理 │ ├── src/lnn_lane_select.c # 通道选择算法 │ ├── src/lnn_lane_score.c # 通道评分 │ ├── src/lnn_lane_link.c # 通道链路管理 │ ├── src/lnn_trans_lane.c # 传输通道 │ ├── src/lnn_trans_free_lane.c # 空闲通道 │ ├── src/lnn_ctrl_lane.c # 控制通道 │ └── src/lnn_lane_prelink.c # 通道预连接 ├── heartbeat/ # 心跳机制 │ ├── src/lnn_heartbeat_fsm.c # 心跳FSM │ ├── src/lnn_heartbeat_strategy.c # 心跳策略 │ ├── src/lnn_ble_heartbeat.c # BLE心跳 │ └── src/lnn_ble_lpdevice.c # BLE低功耗设备 ├── lane_qos/ # 通道QoS └── time_sync/ # 时间同步3.5.1 通道类型定义typedef enum { LANE_BR 0, // 蓝牙经典 LANE_BLE, // 低功耗蓝牙 LANE_P2P, // P2P直连 LANE_HML, // HMLHybrid Media Link混合媒体链路 LANE_WLAN_2P4G, // WiFi 2.4G LANE_WLAN_5G, // WiFi 5G LANE_ETH, // 以太网 LANE_P2P_REUSE, // P2P复用 LANE_BLE_DIRECT, // BLE直连 LANE_COC, // BLE Connection Oriented Channel LANE_COC_DIRECT, // BLE直连COC LANE_LINK_TYPE_BUTT, } LaneLinkType;3.5.2 通道选择算法文件:lnn_lane_select.c选择流程:链路评分接口:// 每个链路类型都有一个评分函数 LinkAttribute *linkAttr GetLinkAttrByLinkType(resList[i]); resListScore[resList[i]] linkAttr-getLinkScore(networkId, expectedBw);3.5.3 心跳机制Heartbeat文件:heartbeat/心跳FSM状态:typedef enum { STATE_HB_NONE_INDEX 0, // 【无心跳态】未加入网络 STATE_HB_NORMAL_NODE_INDEX, // 【普通节点态】普通节点心跳 STATE_HB_MASTER_NODE_INDEX, // 【主节点态】主节点心跳 STATE_HB_INDEX_MAX, } HeartbeatStateIndex;心跳状态转换:心跳事件处理:// 普通节点心跳处理器 static LnnHeartbeatStateHandler g_normalNodeHandler[] { {EVENT_HB_SEND_ONE_BEGIN, OnSendOneHbBegin}, // 发送心跳开始 {EVENT_HB_SEND_ONE_END, OnSendOneHbEnd}, // 发送心跳结束 {EVENT_HB_CHECK_DEV_STATUS, OnCheckDevStatus}, // 检查设备状态 {EVENT_HB_PROCESS_SEND_ONCE, OnProcessSendOnce}, // 处理单次发送 {EVENT_HB_AS_MASTER_NODE, OnTransHbFsmState}, // 切换为主节点 {EVENT_HB_IN_NONE_STATE, OnTransHbFsmState}, // 切换为无心跳 {EVENT_HB_SET_MEDIUM_PARAM, OnSetMediumParam}, // 设置介质参数 {EVENT_HB_UPDATE_SEND_INFO, OnUpdateSendInfo}, // 更新发送信息 {EVENT_HB_STOP_SPECIFIC, OnStopHbByType}, // 停止特定心跳 };心跳类型:lnn_ble_heartbeat.c: BLE心跳 - 通过BLE广播/扫描传输心跳lnn_ble_lpdevice.c: BLE低功耗设备 - 针对低功耗设备的特殊心跳策略3.6 组网内发现封装Disc Mgr文件路径:core/bus_center/lnn/disc_mgr/职责: 这是LNN模块内部对CoAP发现的封装层不是完整的Discovery模块。发现实现类型:typedef enum { LNN_DISC_IMPL_TYPE_COAP, // 仅支持CoAP协议发现 LNN_DISC_IMPL_TYPE_MAX, } LnnDiscoveryImplType; // 发现回调接口 static LnnDiscoveryImplCallback g_discoveryCallback { .onDeviceFound DeviceFound, // 设备被发现回调 };注意: 完整的Discovery模块位于core/discovery/目录包括BLE发现、CoAP发现、USB发现等多种发现策略。LNN的disc_mgr只是调用Discovery模块的封装。3.7 决策中心Decision Center文件路径:core/bus_center/lnn/decision_center/职责: 基于网络状态和策略做出网络优化决策如通道切换、负载均衡等。3.8 元节点管理Meta Node文件路径:core/bus_center/lnn/meta_node/元节点信息结构:typedef struct { bool isMetaNode; // 是否为元节点 uint32_t metaDiscType; // 元节点发现类型 } MetaInfo;元节点特性:元节点是网络中具有特殊职责的节点支持元节点发现Meta Discovery元节点信息会记录在NodeInfo的metaInfo字段中四、模块间协作关系4.1 LNN在DSoftBus中的位置4.2 LNN内部模块协作流程五、核心设计模式总结5.1 设计模式一览设计模式应用场景示例有限状态机FSM连接生命周期、心跳状态lnn_connection_fsm.c、lnn_heartbeat_fsm.c工厂模式Factory网络接口创建NetifMgrFactory()观察者模式Observer设备发现回调g_discoveryCallback.onDeviceFound策略模式Strategy通道评分算法getLinkScore()函数指针中介者模式MediatorLNN作为协调中心Bus Center统一管理发布-订阅模式服务发布/订阅LnnPublishService()/LnnStartDiscDevice()5.2 消息类型枚举// 连接FSM消息类型 typedef enum { FSM_MSG_TYPE_JOIN_LNN, // 加入LNN请求 FSM_MSG_TYPE_AUTH_DONE, // 认证完成 FSM_MSG_TYPE_LEAVE_INVALID_CONN, // 离开无效连接 FSM_MSG_TYPE_LEAVE_LNN, // 离开LNN请求 FSM_MSG_TYPE_NOT_TRUSTED, // 不可信设备 FSM_MSG_TYPE_DISCONNECT, // 断开连接 FSM_MSG_TYPE_JOIN_LNN_TIMEOUT, // 加入超时 FSM_MSG_TYPE_SYNC_OFFLINE_DONE, // 同步离线完成 FSM_MSG_TYPE_LEAVE_LNN_TIMEOUT, // 离开超时 FSM_MSG_TYPE_INITIATE_ONLINE, // 主动上线 FSM_MSG_TYPE_FORCE_JOIN_LNN, // 强制加入 } StateMessageType; // 心跳FSM事件类型 typedef enum { EVENT_HB_CHECK_DEV_STATUS 0, // 检查设备状态 EVENT_HB_START_PROCESS, // 开始心跳处理 EVENT_HB_STOP_SPECIFIC, // 停止特定心跳 EVENT_HB_AS_MASTER_NODE, // 作为主节点 EVENT_HB_AS_NORMAL_NODE, // 作为普通节点 EVENT_HB_IN_NONE_STATE, // 进入无心跳状态 EVENT_HB_SEND_ONE_BEGIN, // 发送一次心跳开始 EVENT_HB_SEND_ONE_END, // 发送一次心跳结束 EVENT_HB_PROCESS_SEND_ONCE, // 处理单次发送 EVENT_HB_SET_MEDIUM_PARAM, // 设置介质参数 EVENT_HB_UPDATE_SEND_INFO, // 更新发送信息 EVENT_HB_SCREEN_OFF_CHECK_STATUS, // 屏幕关闭检查状态 EVENT_HB_RESTART_HB_PROCESS, // 重启心跳处理 } HeartbeatEventType;六、总结6.1 LNN模块核心定位维度描述定位DSoftBus的协调编排层Orchestration Layer不直接做设备发现、物理连接建立、数据传输核心做网络拓扑管理、节点状态维护、通道选择分配对上接收Transmission模块的通道请求对下调用Discovery发现设备、调用Connection建立连接、调用Authentication完成认证6.2 核心子系统职责子系统核心职责关键设计Net Builder网络构建、连接FSM4状态FSMAuth→Online→Clean→LeavingNet Ledger节点信息存储Local Ledger Distributed LedgerNet BusCenter网络协议调度Protocol Manager Physical Subnet ManagerLane Hub通道选择分配多策略评分算法 心跳FSM6.3 与其他模块的关系LNN是整个DSoftBus系统的大脑负责协调各模块工作、维护网络拓扑、选择最优传输路径确保分布式设备能够高效、可靠地通信。