discovery_service提供了设备的发布接口。网络
鸿蒙OS支持的设备多线程
discovery\discovery_service\include\common_info_manager.h中,定义了目前鸿蒙OS支持的设备类型和设备级别,从定义不难看出,目前鸿蒙OS只支持L0和L1的设备。分布式
这里要补充一下,因为L0的设备不支持多线程而且只支持轻量级的TCP/IP协议,所以在涉及多线程和网络通讯的代码,多会看到以下的条件编译语句:函数
上述条件编译表示其中到代码是专门为L0设备提供的。spa
上述条件编译表示其中代码是专门为L1设备提供。.net
用户使用发现功能时,须要保证发现端设备与被发现端设备在同一个局域网内,而且互相能收到对方如下流程的报文。线程
(1)发现端设备,发起discover请求后,使用coap协议在局域网内发送广播。3d
(2)被发现端设备使用PublishService接口发布服务,接收端收到广播后,发送coap协议单播给发现端。blog
(3)发现端设备收到报文会更新设备信息。接口
下面是设备的定义,分为本地设备(被发现端设备)和外部设备,从中不难看出鸿蒙OS的分布式特性,本地设备能够经过PublishService函数将自身的服务发布出去,供外部设备发现并使用。鸿蒙OS的设备发现机制是被发现设备在COAP端口监听来自发现设备的广播包,这也符合按需使用的原则。
PublishService的启动过程
被发现端设备经过调用PublishService向外部发布设备的能力,接口使用示例以下:
咱们分2段来看PublishService这个函数。
PublishService首先将检查是否有发布权限以及检查了一些发布参数的合法性,其次确认发布协议是否是COAP。
而后,考虑到被发现端上可能有多个设备对外部发布服务,所以建立了一个信号量g_serviceSemId来防止冲突。进入信号量以后,
主要调用InitService函数来启动服务,并将模块注册到全局变量g_publishModule中,服务注册到g_capabilityData中。
下面咱们来看一下服务启动函数InitService,由于InitService可能被多个设备所调用,所以经过全局变量g_isServiceInit来确认服务是否启动,若是其余设备以及启动则直接略过。若是没有,则须要作不少初始化工做。
服务启动函数InitService首先调用InitCommonManager,InitCommonManager再调用InitLocalDeviceInfo初始化本地设备信息。本地设备的信息被保存在g_deviceInfo这个全局变量中。接下来,服务启动函数InitService初始化了两个全局变量,g_publishModule和g_capabilityData,分别用来存放发布的模块和能力描述数据。以后,调用CoapInit函数,CoapInit则会调用NSTACKX_Init,NSTACKX_Init调用CoapInitDiscovery来启动COAP端口监听。CoapInitDiscovery的解析详见润小云解读鸿蒙OS系列(三):分布式软总线之COAP协议。