继上一章节分析完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;
}
该函数主要做了四件事:
- 调用RegisterAllCapBitmap将能力注册到g_subscribeMgr中。
- 调用DiscCoapSetFilterCapability将能力保存到本地的g_filterCapabilityBitmap中。
- 调用DiscCoapStopDiscovery停止上一轮的发现处理。
- 调用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