软总线源码分析6:发现模块(二)

本文深入分析HarmonyOS软总线的StartDiscovery接口,包括CoapStartAdvertise和CoapSubscribe的实现,以及OnDeviceFound接口的触发链和实现。StartDiscovery接口在主动发现时通过CoapStartAdvertise和CoapSubscribe处理,而OnDeviceFound接口在接收到设备发现数据后,通过设备信息解析和回调机制通知上层应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继上一章节分析完PublishService接口后,本章节我们开始分析StartDiscovery接口。

StartDiscovery接口

根据g_discCoapFuncInterface的接口可以知道,当为主动发现时,调用CoapStartAdvertise函数,当为被动发现时,调用CoapSubscribe函数完成对应的处理。下面我们分别介绍这两种实现:

CoapStartAdvertise

CoapStartAdvertise的源码如下所示:

static int32_t CoapStartAdvertise(const SubscribeOption *option)
{
    if (option == NULL || g_subscribeMgr == NULL) {
        return SOFTBUS_INVALID_PARAM;
    }

    if (pthread_mutex_lock(&(g_subscribeMgr->lock)) != 0) {
        LOG_ERR("pthread mutex lock failed.");
        return SOFTBUS_LOCK_ERR;
    }
    if (RegisterAllCapBitmap(CAPABILITY_NUM, option->capabilityBitmap, g_subscribeMgr, MAX_CAP_NUM) != SOFTBUS_OK) {
        (void)pthread_mutex_unlock(&(g_subscribeMgr->lock));
        LOG_ERR("merge discovery capability failed.");
        return SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL;
    }
    if (g_subscribeMgr->isUpdate) {
        if (DiscCoapSetFilterCapability(CAPABILITY_NUM, g_subscribeMgr->allCap) != SOFTBUS_OK) {
            (void)pthread_mutex_unlock(&(g_subscribeMgr->lock));
            LOG_ERR("set all filter capability to dfinder failed.");
            return SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL;
        }
    }
    if (DiscCoapStopDiscovery() != SOFTBUS_OK) {
        (void)pthread_mutex_unlock(&(g_subscribeMgr->lock));
        LOG_ERR("coap stop discovery failed.");
        return SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL;
    }
    if (DiscCoapStartDiscovery(ACTIVE_DISCOVERY) != SOFTBUS_OK) {
        (void)pthread_mutex_unlock(&(g_subscribeMgr->lock));
        LOG_ERR("coap start advertise failed.");
        return SOFTBUS_DISCOVER_COAP_START_DISCOVER_FAIL;
    }
    (void)pthread_mutex_unlock(&(g_subscribeMgr->lock));
    LOG_INFO("coap start active discovery.");
    return SOFTBUS_OK;
}

该函数主要做了四件事:

  1. 调用RegisterAllCapBitmap将能力注册到g_subscribeMgr中。
  2. 调用DiscCoapSetFilterCapability将能力保存到本地的g_filterCapabilityBitmap中。
  3. 调用DiscCoapStopDiscovery停止上一轮的发现处理。
  4. 调用DiscCoapStartDiscovery完成发现处理。

RegisterAllCapBitmap函数和DiscCoapSetFilterCapability函数比较简单,因此不展开介绍。我们主要对DiscCoapStopDiscovery函数和DiscCoapStartDiscovery函数展开。

DiscCoapStopDiscovery

DiscCoapStopDiscovery调用NSTACKX_StopDeviceFind函数,该函数使用PostEvent提交一个事件,其handle为DeviceDiscoverStopInner函数,该函数最终调用CoapServiceDiscoverStopInner函数完成处理,其源码如下:

void CoapServiceDiscoverStopInner(void)
{
    TimerSetTimeout(g_discoverTimer, 0, NSTACKX_FALSE);
    CoapServiceDiscoverStop();
    LOGI(TAG, "device discover stopped");
}

该函数首先调用TimerSetTimeout关闭掉上一轮发现设置的定时器,然后调用CoapServiceDiscoverStop函数,CoapServiceDiscoverStop的源码如下:

static void CoapServiceDiscoverStop(void)
{
    g_discoverCount = 0;
    g_forceUpdate = NSTACKX_FALSE;
    SetModeInfo(DISCOVER_MODE);
    ClearDevices(GetDeviceDBBackup());
    LOGW(TAG, "clear device list backup");
    /* Can call PostDeviceFindWrapper() to notify user if needed. */
    g_userRequest = NSTACKX_FALSE;
}

该函数也比较简单,即清除掉各种标志和设备列表备份中的记录。

DiscCoapStartDiscovery

停止上一轮的发现处理之后,便调用DiscCoapStartDiscovery函数进行发现处理,该函数我们在上一章节介绍CoapPublish时介绍过,该函数在StartDiscovery调用的情况下,根据传入的参数,调用NSTACKX_StartDeviceFind函数。NSTACKX_Sta

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值