发现模块分析

发布时间:2026/7/15 3:43:06

发现模块分析 整体架构概览发现模块位于 core/discovery/采用分层架构 策略模式设计由5个子模块协同工作1. 发现管理框架Manager核心文件disc_manager.h — 对外接口定义disc_interface.h — 内部模块接口disc_manager.c — 核心实现softbus_disc_server.c — 服务端初始化职责作为发现模块的中枢调度层统一管理所有发现介质BLE/CoAP/USB协调发布与订阅的生命周期。核心数据结构// 统一发现函数接口策略模式的核心 typedef struct { int32_t (*Publish)(const PublishOption *option); int32_t (*StartScan)(const PublishOption *option); int32_t (*Unpublish)(const PublishOption *option); int32_t (*StopScan)(const PublishOption *option); int32_t (*StartAdvertise)(const SubscribeOption *option); int32_t (*Subscribe)(const SubscribeOption *option); int32_t (*Unsubscribe)(const SubscribeOption *option); int32_t (*StopAdvertise)(const SubscribeOption *option); void (*LinkStatusChanged)(LinkStatus status); void (*UpdateLocalDeviceInfo)(InfoTypeChanged type); } DiscoveryFuncInterface; // 三大介质接口实例 static DiscoveryFuncInterface *g_discCoapInterface NULL; static DiscoveryFuncInterface *g_discBleInterface NULL; static DiscoveryFuncInterface *g_discUsbInterface NULL;初始化流程disc_manager.c:1312int32_t DiscMgrInit(void) { g_discMgrMediumCb.OnDeviceFound DiscOnDeviceFound; g_discCoapInterface DiscCoapInit(g_discMgrMediumCb); // 初始化CoAP发现 g_discBleInterface DiscBleInit(g_discMgrMediumCb); // 初始化BLE发现 g_discUsbInterface DiscUsbDispatcherInit(g_discMgrMediumCb); // 初始化USB发现 // 创建发布/订阅信息链表 g_publishInfoList CreateSoftBusList(); g_discoveryInfoList CreateSoftBusList(); // 初始化能力位图链表 for (int32_t i 0; i CAPABILITY_MAX_BITNUM; i) { ListInit(g_capabilityList[i]); } }介质分发逻辑CallInterfaceByMediumCOAP仅调用 CoAP 接口BLE仅调用 BLE 接口AUTO同时调用 CoAP BLE 接口任一成功即返回成功USB仅调用 USB 接口对外提供的核心APIAPI功能DiscPublishService发布自身设备信息DiscUnPublishService取消发布DiscStartDiscovery开始发现周围设备DiscStopDiscovery停止发现DiscSetDiscoverCallback设置发现回调DiscLinkStatusChanged链路状态变更通知DiscDeviceInfoChanged本地设备信息变更通知2. BLE发现核心文件disc_ble_dispatcher.h — BLE调度器接口disc_ble_dispatcher.c — BLE调度器实现disc_ble.h — BLE核心接口disc_ble.c — BLE核心实现架构特点采用二级调度器模式BLE Dispatcher 作为中间层根据**能力位图capabilityBitmap**将请求分发到具体的BLE子实现。调度器核心结构typedef struct { bool (*IsConcern)(uint32_t capability); // 判断是否关注该能力 DiscoveryFuncInterface *mediumInterface; // 对应的发现接口 } DiscoveryBleDispatcherInterface; static DiscoveryBleDispatcherInterface *g_dispatchers[DISPATCHER_SIZE]; // 最多6个调度器5种BLE发现子类型按业务场景划分子类型目录说明Touch BLEtouch_ble/触碰发现NFC/触碰触发Approach BLEapproach_ble/靠近发现距离感知触发Share BLEshare_ble/分享发现跨设备分享场景OOP BLEoop_ble/OOP发现对象导向协议发现Virtual Link BLEvirtual_link_ble/虚拟链路BLE发现调度器初始化disc_ble_dispatcher.cstatic int32_t DiscBleInitExt(DiscInnerCallback *discInnerCb) { DiscoveryBleDispatcherInterface *touchInterface DiscTouchBleInit(discInnerCb); DiscoveryBleDispatcherInterface *approachInterface DiscApproachBleInit(discInnerCb); DiscoveryBleDispatcherInterface *shareInterface DiscShareBleInit(discInnerCb); DiscoveryBleDispatcherInterface *vlinkInterface DiscVLinkBleInit(discInnerCb); DiscoveryBleDispatcherInterface *oopInterface DiscOopBleInit(discInnerCb); // 注册到 g_dispatchers 数组 }分发逻辑根据capabilityBitmap查找匹配的 Dispatcher再调用其mediumInterface中对应的函数static DiscoveryFuncInterface *FindDiscoveryFuncInterface(uint32_t capability) { for (uint32_t i 0; i g_dispatcherSize; i) { if (g_dispatchers[i]-IsConcern(capability)) { return g_dispatchers[i]-mediumInterface; } } return NULL; }BLE核心实现disc_ble.c负责BLE广播Advertising的创建与管理可连接/不可连接两种广播BLE扫描Scanning与过滤设备信息的编解码BLE广播包中携带设备信息消息处理机制基于Looper的异步消息处理3. CoAP发现核心文件disc_coap.h — CoAP发现接口disc_coap.c — CoAP发现实现disc_nstackx_adapter.h — NSTACKX适配层disc_nstackx_adapter.c — NSTACKX适配实现disc_coap_capability.h — 能力处理disc_coap_parser.h — CoAP报文解析架构特点基于NSTACKX协议栈实现 Wi-Fi 层面的设备发现使用 CoAP受限应用协议进行多播/单播通信。核心数据结构// CoAP发布/订阅管理器 typedef struct { bool isUpdate; // 能力是否有更新 bool isEmpty; // 是否已清空 int16_t capCount[MAX_CAP_NUM]; // 各能力的引用计数 uint32_t allCap[CAPABILITY_NUM]; // 聚合的能力位图 SoftBusMutex lock; // 互斥锁 } DiscCoapInfo; static DiscCoapInfo *g_publishMgr NULL; // 发布管理器 static DiscCoapInfo *g_subscribeMgr NULL; // 订阅管理器NSTACKX适配层提供的关键接口接口功能DiscNstackxInit/DiscNstackxDeinit初始化/反初始化NSTACKX协议栈DiscCoapRegisterCb注册发现回调DiscCoapRegisterCapability注册能力位图DiscCoapSetFilterCapability设置过滤能力DiscCoapStartDiscovery/DiscCoapStopDiscovery启动/停止CoAP发现DiscCoapUpdateLocalIp更新本地IP地址DiscCoapSendRsp发送CoAP发现响应CoAP发现流程注册能力位图 →RegisterAllCapBitmap聚合所有发布者的能力启动发现 →DiscCoapStartDiscovery调用NSTACKX发送CoAP多播收到设备信息 →DiscCoapProcessDeviceInfo解析NSTACKX设备信息解析保留字段 →ParseReservedInfo提取WiFi IP、账号哈希、昵称等回调上层 →OnDeviceFound通知发现管理框架特殊处理CoAP不支持Approach 能力靠近发现设备名称拼接考虑了多语言中文的/英文-和账号匹配4. USB发现核心文件disc_usb.h — USB发现接口disc_usb_dispatcher.h — USB调度器disc_usb_dispatcher.c — USB调度器实现架构特点与BLE发现采用完全相同的调度器模式但当前仅支持1个DispatcherDISPATCHER_SIZE 1。调度器结构与BLE对称typedef struct { bool (*IsConcern)(uint32_t capability); DiscoveryFuncInterface *mediumInterface; } DiscoveryUsbDispatcherInterface; static DiscoveryUsbDispatcherInterface *g_usbDispatchers[DISPATCHER_SIZE]; // 1个初始化流程DiscoveryFuncInterface *DiscUsbDispatcherInit(DiscInnerCallback *discInnerCb) { DiscoveryUsbDispatcherInterface *usbInterface DiscUsbInit(discInnerCb); // 注册到 g_usbDispatchers 数组 }USB调度器提供与BLE调度器完全对称的8个函数接口UsbDispatchStartActivePublish/UsbDispatchStopActivePublishUsbDispatchStartPassivePublish/UsbDispatchStopPassivePublishUsbDispatchStartActiveDiscovery/UsbDispatchStopActiveDiscoveryUsbDispatchStartPassiveDiscovery/UsbDispatchStopPassiveDiscoveryUsbDispatchLinkStatusChanged/UsbDispatchUpdateLocalDeviceInfo设计说明USB发现是2024年新增的介质用于USB直连场景下的设备发现当前实现以virtual空实现为主框架已就绪具体业务逻辑可扩展。5. 事件管理Event Manager核心文件disc_event_manager.h — 事件管理接口disc_event_manager.c — 事件管理实现职责统一管理和初始化各BLE子类型的事件模块是BLE发现的事件基础设施。实现disc_event_manager.cint32_t DiscEventManagerInit(void) { int32_t ret DiscApproachBleEventInit(); // 靠近发现事件初始化 ret DiscVLinkBleEventInit(); // 虚拟链路事件初始化 ret DiscTouchBleEventInit(); // 触碰发现事件初始化 ret DiscOopBleEventInit(); // OOP发现事件初始化 return SOFTBUS_OK; } void DiscEventManagerDeinit(void) { DiscApproachBleEventDeinit(); DiscVLinkBleEventDeinit(); DiscTouchBleEventDeinit(); DiscOopBleEventDeinit(); }事件管理覆盖的BLE子类型子类型事件初始化函数说明Approach BLEDiscApproachBleEventInit靠近发现定时扫描/广播事件Virtual Link BLEDiscVLinkBleEventInit虚拟链路连接事件Touch BLEDiscTouchBleEventInit触碰触发事件OOP BLEDiscOopBleEventInitOOP发现事件注意Share BLE 没有独立的事件模块其事件由BLE核心模块统一管理。模块间协作关系关键设计模式策略模式DiscoveryFuncInterface统一接口BLE/CoAP/USB 各自实现二级调度器BLE 和 USB 都有 Dispatcher 层按能力位图分发到具体子实现引用计数管理CoAP 使用capCount[]管理能力的注册/注销确保多发布者共享同一能力时正确聚合AUTO介质管理框架支持 AUTO 模式同时启动 CoAP BLE 双介质发现

相关新闻