润小云解读鸿蒙OS系列(五):分布式软总线之discovery_service

discovery_service提供了设备的发布接口。网络

 

鸿蒙OS支持的设备多线程

discovery\discovery_service\include\common_info_manager.h中,定义了目前鸿蒙OS支持的设备类型和设备级别,从定义不难看出,目前鸿蒙OS只支持L0L1的设备。分布式

 

这里要补充一下,因为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首先调用InitCommonManagerInitCommonManager再调用InitLocalDeviceInfo初始化本地设备信息。本地设备的信息被保存在g_deviceInfo这个全局变量中。接下来,服务启动函数InitService初始化了两个全局变量,g_publishModuleg_capabilityData,分别用来存放发布的模块和能力描述数据。以后,调用CoapInit函数,CoapInit则会调用NSTACKX_InitNSTACKX_Init调用CoapInitDiscovery来启动COAP端口监听。CoapInitDiscovery的解析详见润小云解读鸿蒙OS系列(三):分布式软总线之COAP协议

相关文章
相关标签/搜索