整体架构概览

发现模块位于 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:1312):

int32_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]);
    }
}

介质分发逻辑CallInterfaceByMedium):

  • COAP:仅调用 CoAP 接口
  • BLE:仅调用 BLE 接口
  • AUTO:同时调用 CoAP + BLE 接口(任一成功即返回成功)
  • USB:仅调用 USB 接口

对外提供的核心API

API 功能
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 BLE touch_ble/ 触碰发现(NFC/触碰触发)
Approach BLE approach_ble/ 靠近发现(距离感知触发)
Share BLE share_ble/ 分享发现(跨设备分享场景)
OOP BLE oop_ble/ OOP发现(对象导向协议发现)
Virtual Link BLE virtual_link_ble/ 虚拟链路BLE发现

调度器初始化(disc_ble_dispatcher.c):

static 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发现流程

  1. 注册能力位图 → RegisterAllCapBitmap 聚合所有发布者的能力
  2. 启动发现 → DiscCoapStartDiscovery 调用NSTACKX发送CoAP多播
  3. 收到设备信息 → DiscCoapProcessDeviceInfo 解析NSTACKX设备信息
  4. 解析保留字段 → ParseReservedInfo 提取WiFi IP、账号哈希、昵称等
  5. 回调上层 → OnDeviceFound 通知发现管理框架

特殊处理

  • CoAP 不支持 Approach 能力(靠近发现)
  • 设备名称拼接考虑了多语言(中文"的"/英文"-")和账号匹配

4. USB发现

核心文件

  • disc_usb.h — USB发现接口
  • disc_usb_dispatcher.h — USB调度器
  • disc_usb_dispatcher.c — USB调度器实现

架构特点:与BLE发现采用完全相同的调度器模式,但当前仅支持1个Dispatcher(DISPATCHER_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 / UsbDispatchStopActivePublish
  • UsbDispatchStartPassivePublish / UsbDispatchStopPassivePublish
  • UsbDispatchStartActiveDiscovery / UsbDispatchStopActiveDiscovery
  • UsbDispatchStartPassiveDiscovery / UsbDispatchStopPassiveDiscovery
  • UsbDispatchLinkStatusChanged / UsbDispatchUpdateLocalDeviceInfo

设计说明:USB发现是2024年新增的介质,用于USB直连场景下的设备发现,当前实现以virtual(空实现)为主,框架已就绪,具体业务逻辑可扩展。


5. 事件管理(Event Manager)

核心文件

  • disc_event_manager.h — 事件管理接口
  • disc_event_manager.c — 事件管理实现

职责:统一管理和初始化各BLE子类型的事件模块,是BLE发现的事件基础设施。

实现(disc_event_manager.c):

int32_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 BLE DiscApproachBleEventInit 靠近发现定时扫描/广播事件
Virtual Link BLE DiscVLinkBleEventInit 虚拟链路连接事件
Touch BLE DiscTouchBleEventInit 触碰触发事件
OOP BLE DiscOopBleEventInit OOP发现事件

注意:Share BLE 没有独立的事件模块,其事件由BLE核心模块统一管理。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐