OpenHarmony开发者论坛

标题: 简析OpenHarmony软总线能力 [打印本页]

作者: 深开鸿_王石    时间: 2023-11-6 09:35
标题: 简析OpenHarmony软总线能力
[md]作者:王石

分布式软总线是OpenHarmony的重要能力,设计目标是实现多设备间的通信方式。分布式软总线是分布式硬件和分布式软总线的重要基础,分布式软总线提供一种不区分链路的设备间发现、组网和传输的能力:

* 发现:应用WiFi,蓝牙相关协议实现设备发现能力;
* 组网:提供统一的设备组网和拓扑管理能力;
* 传输:提供数据传输能力,支持消息、字节、流,文件的数据传输能力;

#### 概述

在OpenHarmony的源码里和系统功能相关的部分大多都放在foundation这个文件夹里,而通讯相关的部分则是在communication这个文件夹内。我们本篇要分析的软总线功能就是在foundation/communication/dsoftbus路径下,具体目录结构如下:

```bash
.
├── adapter                                                                        //适配层               
│   ├── BUILD.gn
│   ├── common                                                                //适配层管理,网络适配,协议适配等
│   └── default_config                                                //适配层配置
├── BUILD.gn
├── bundle.json
├── check_sub_module.py
├── components                                                                //依赖组件
│   ├── mbedtls                                                                //开源ssl库,在三方库里
│   └── nstackx                                                                //tcp/ip协议管理模块
├── config.py
├── core                                                                        //核心层
│   ├── adapter                                                                //适配接口       
│   ├── authentication                                                //认证接口
│   ├── BUILD.gn
│   ├── bus_center                                                        //组网代码
│   ├── common                                                                //通用代码
│   ├── connection                                                        //连接代码
│   ├── discovery                                                        //发现代码
│   ├── frame                                                                //框架代码
│   └── transmission                                                //传输代码
├── dsoftbus.gni
├── figures
│   ├── dsoftbus-architecture.png
│   └── dsoftbus-architecture_zh.png
├── hisysevent.yaml
├── interfaces                                                                //对外头文件
│   ├── inner_kits
│   └── kits
├── Kconfig
├── LICENSE
├── OAT.xml
├── README.md
├── README_zh.md
├── sdk                                                                                //对外应用sdk
│   ├── BUILD.gn
│   ├── bus_center                                                        //组网
│   ├── discovery                                                        //发现
│   ├── frame                                                                //框架
│   └── transmission                                                //传输
├── tests
│   ├── adapter
│   ├── BUILD.gn
│   ├── core
│   ├── include
│   └── sdk
└── tools                                                                        //工具
    ├── BUILD.gn
    └── device_info
```

* 约束:
  * 设备发现需要在同二层网络中(即同交换机,同WiFi路由或者近场通信范围内)
  * 组网前需要有设备认证过程(绑定)

#### 架构简析

* 根据目录结构和内部文件及编译框架总结架构如下:
  ![#盲盒+码#简析OpenHarmony软总线能力-开源基础软件社区](https://dl-harmonyos.51cto.com/i ... rocess=image/resize,w_820,h_588 "#盲盒+码#简析OpenHarmony软总线能力-开源基础软件社区")
  * SDK:为其他业务提供软总线的能力接口,如发现设备,发布服务,设备连接,远端设备信息获取,时间同步,注册回调接收设备上下线消息,设备信息变更消息;SDK对外提供softbus\_client.so,头文件均在interfaces/kits目录里;
  * Tools:提供SoftBusDumpDeviceInfo工具,可以查看本地的设备信息和所有发现的设备信息;
  * Core:软总线的核心实现部分,提供softbus\_server库,实现system ability框架提供系统能力;
    * discovery:提供对网络设备和蓝牙设备的发布,发现,连接的能力,
    * authentication:设备认证模块,对不同类型的连接方式提供不同的认证实现和统一的认证能力,并为分布式设备业务提供DeviceAuthCallback;设备认证模块依赖//base/security/device\_auth/services:deviceauth\_sdk库。认证模块提供认证连接对应的处理,如连接处理(OnConnectResult),数据处理(OnDataReceived),断开处理(OnDisconnected)三个基础入口,提供设备的连接认证能力;
    * connection:提供ble,br,tcp,p2p连接方式。连接模块会启动一个后台连接服务,此连接服务提供默认的tcp,ble,br,p2p的连接处理接口,服务内部通过一个线程池处理连接的任务;认证模块通过连接模块进行认证连接,同时连接模块也提供回调接口,为业务模块提供数据返回。连接模块就是通过具体的连接业务实现代码为业务模块提供设备连接和信息传输通道;目前主要提供的连接方式为socket或者蓝牙两种;其中接口声明在interface目录下;
    * transmission:提供消息发送接口,可以发送加密信息或者不加密信息,加密方式根据认证的信息确认,使用认证会话的key作为key值,加密方式为aes加密。
    * bus\_center:提供核心的LNN本地网络服务接口,包括网络服务发现,连接,服务发布等核心能力,以及设备管理能力。bus\_center作为软总线的管理节点提供本地网络拓扑账本(NetLedger),消息处理回环(BusLooper),事件处理对象(Netlink,Product,Lwip,Wifi,BtState,Driver,ScreenState,DeviceName),网络发现服务(Coap),网络接口(Netif,   softbus\_feature\_config.c里写死),消息网络构造(NetBuilder),本地网络路由管理(LaneHub),节点地址分配(NodeAddrAllocator)。软总线设计目标为无感的设备互联互通,所以每个标准设备都可以作为一个网络节点也可以作为一个网关,而bus\_center就是作为网关实现的部分。软总线服务通过收听系统的事件,包括设备事件,网络事件以感知本设备的每一处变化,然后根据变化来决定是否可以感知到周围新的节点设备加入网络,并提供设备认证,连接,传输数据的服务;
    * common:核心部分的基础代码,如bitmap(位图),dfx(DesignForX,未来设计),json,messagehandler(软总线信令),network(网络频率参数),queue(队列),security(权限认证),property(软总线配置),utils(工具集,timeout,hextobytes,random,等等)
    * frame:框架层,不同类型的系统(小型系统L0,轻量系统L1,标准系统L2)提供不同的对外接口实现;
    * adapter:适配层,目前适配不同的设备类型,如WiFi,蓝牙等;
  * Adapter:软总线适配层,对不同系统进行裁剪和能力配置,对外部依赖进行包装和调用;
  * Component:组件,mbedtls(SSL算法库),nstackx(网络协议库,为coap提供网络协议服务)

#### 功能简析

```sequence
distributedhardware和tools -->> softbus_client(sdk): so库引用,接口调用
softbus_client(sdk) --> bus_center_sdk_deps: 链接对应服务so,c++调用
softbus_client(sdk) --> trans_session_manager_sdk_deps: 链接对应服务so,c++调用
softbus_client(sdk) --> softbus_adapter: 链接对应服务so,c++调用
softbus_client(sdk) --> softbus_utils: 链接对应服务so,c++调用
bus_center_sdk_deps-->ipc_single: 链接对应的idlso,c接口调用
bus_center_sdk_deps-->samgr: 应用SystemAbility服务框架
trans_session_manager_sdk_deps-->nstackx(FillpSo/congestion/dfile/util): 链接对应服务so,c调用
```

1. distributedhardware(分布式硬件管理),由以下几个部分组成:
   * devicemanager:DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。
   * distributedcamera:分布式相机是多个设备的相机同时协同使用的能力。分布式相机部件是为分布式硬件子系统提供这一能力的部件。本部件不直接对接应用,只向分布式硬件框架子系统提供C++接口。应用可以通过相机框架的接口使用分布式相机部件操作其他设备的Camera,使用方式与本地相机一致。
   * distributedhardwarefwk:分布式硬件管理框架是为分布式硬件子系统提供信息管理能力的部件。分布式硬件管理框架为分布式硬件子系统提供统一的硬件接入、查询和使能等能力。
   * distributedscreen:分布式屏幕是一种屏幕虚拟化能力,支持用户指定组网认证过的其他OpenHarmony设备的屏幕作为Display的显示区域。在分布式硬件子系统中,分布式屏幕组件提供跨设备屏幕能力调用,为OpenHarmony操作系统提供系统投屏、屏幕镜像、屏幕分割等能力的实现。
2. tools(分布式软总线工具),提供打印本地设备信息和分布式软总线上发现的远程节点信息;
3. softbus\_client(sdk),分布式软总线的框架层接口,利用ipc通信同softbus\_server交互实现具体功能,包括以下部分:
   * bus\_center\_sdk\_src:包括bus\_center\_service\_sdk\_src和bus\_center\_manager\_sdk\_src,软总线管理层接口;
   * disc\_sdk\_src:网络节点发现接口;
   * softbus\_client\_frame\_src:框架层接口实现;
   * trans\_session\_manager\_sdk\_src:传输层接口实现,包括(trans\_ipc\_proxy\_sdk\_src,trans\_session\_sdk\_src,trans\_channel\_sdk\_src)
     * trans\_ipc\_proxy\_sdk\_src:提供传输通道,通过systemability获取服务并进行交互的能力;
     * trans\_session\_sdk\_src:应用ipc传输代理提供传输会话建立,配置的接口
     * trans\_channel\_sdk\_src:应用ipc传输代理提供传输channel建立,配置,管理的接口
4. softbus\_server(core):分布式软总线的核心服务库,以system ability为框架,支持ipc通信;
   * auth\_server\_src:认证服务;
   * bus\_center\_server\_src:主服务;
   * conn\_manager\_src:连接服务;
   * disc\_server\_src:发现服务;
   * trans\_session\_src:会话服务;
   * softbus\_permission\_src:软总线的权限配置
5. softbus\_adapter,软总线适配层,对接底层系统接口(kernel),对接ssl加密通道(mbedtls或openssl),并为核心服务提供功能实现;
6. softbus\_utils,软总线的通用库,核心层里的公共库,提供基础方法的实现,包括:
   * bitmap:位图,目前是用于蓝牙设备Capability标识;
   * dfx:面向未来设计,实现hidumper(信息打印)和hisystemevent(OpenHarmony的事件埋点,通过在关键路径埋点记录系统在运行过程中的重要信息,辅助开发者定位问题);
   * json\_utils:提供cjson的功能适配,软总线的信令均使用json数据传输,此功能为信令的收发服务;
   * message\_handler:提供软总线报文处理机制,包括报文处理Looper,报文同步发送、异步发送接口等,所有待处理的报文在Looper的队列里管理,到期后调用具体模块的handler处理,处理报文的handler包括(auth,lnnlane,lnntimesync,lnnnetbuilder,buscenternotify,lnnasync,lnnstatemachine,hisysevent,bleconnnect,blegattclient,blegattserver,p2plink,bledisc,trans)

### 总结

1. 软总线服务依赖于监听系统事件和网络扫描(coap,br,ble)进行设备发现和认证后的设备连接;
2. 软总线服务不对应用层直接提供调用接口,通过分布式设备管理提供NAPI接口供应用层调用;

[/md]
作者: jjdw    时间: 2023-11-6 19:26
有软总线的使用样例嘛
作者: 深开鸿_王石    时间: 2023-11-7 09:06
回复 jjdw: 有的,sample里的分布式认证提供了组网认证过程:https://gitee.com/openharmony/ap ... butedAuthenticationhttps://gitee.com/openharmony/ap ... re/Connectivity/RPC提供通信演示,还有其他分布式计算器,分布式数据库等
作者: 91winter    时间: 2023-11-8 11:22
[md]👍
[/md]
作者: 91winter    时间: 2023-11-8 11:22
[md]👍
[/md]
作者: 91winter    时间: 2023-11-8 11:24
刚发完问题,就得到了答案,
作者: faceoh    时间: 2023-11-29 15:30
[md]你好,楼主。有测试软总线传输能力的方法吗?比如传输带宽,速率,丢包率等
[/md]
作者: 深开鸿_王石    时间: 2023-11-29 17:51
回复 faceoh: 利用软总线的最简单形式就是用应用写个ipc通信的样例,这样两个板子就能通信并测试了;主要还是看你的场景
作者: faceoh    时间: 2023-11-30 09:46
回复 深开鸿_王石: 应用是指hap应用吗?
作者: shixiaocheng    时间: 2023-12-21 10:25
你好,我rk3568上运行SoftBusDumpDeviceInfo,报错输出
------Local Device Info------
4 nStackXLog: SetLogCallback:[76] :log callback changed
LnnGetLocalNodeInfo Fail!

请问这是存在什么问题
作者: koubo    时间: 2024-5-23 11:24
回复 深开鸿_王石: 使用了组网认证的样例,两个设备连接同一个wifi,但并没有互相识别,请问下是还需要其他组网条件吗
作者: 深开鸿_王石    时间: 2024-5-23 14:07
回复 shixiaocheng: 是不是没连上啥,所以没有建立设备
作者: shixiaocheng    时间: 2024-5-23 17:44
回复 深开鸿_王石: 不是,是权限没给全
作者: Hazel    时间: 2024-5-24 15:24
回复 shixiaocheng: 请问是如何解决的,要什么权限




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5