分布式软总线是 OpenHarmony 的重要能力,设计目标是实现多设备间的通信方式。分布式软总线是分布式硬件和分布式软总线的重要基础,分布式软总线提供一种不区分链路的设备间发现、组网和传输的能力:
- 发现:应用 WiFi,蓝牙相关协议实现设备发现能力;
- 组网:提供统一的设备组网和拓扑管理能力;
- 传输:提供数据传输能力,支持消息、字节、流,文件的数据传输能力;
概述
在 OpenHarmony 的源码里和系统功能相关的部分大多都放在 foundation 这个文件夹里,而通讯相关的部分则是在 communication 这个文件夹内。我们本篇要分析的软总线功能就是在 foundation/communication/dsoftbus 路径下,具体目录结构如下:
.
├── 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 路由或者近场通信范围内)
- 组网前需要有设备认证过程(绑定)
架构简析
- 根据目录结构和内部文件及编译框架总结架构如下:
- 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 提供网络协议服务)
功能简析
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调用
- distributedhardware(分布式硬件管理),由以下几个部分组成:
- devicemanager:DeviceManager 组件在 OpenHarmony 上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。
- distributedcamera:分布式相机是多个设备的相机同时协同使用的能力。分布式相机部件是为分布式硬件子系统提供这一能力的部件。本部件不直接对接应用,只向分布式硬件框架子系统提供 C++ 接口。应用可以通过相机框架的接口使用分布式相机部件操作其他设备的 Camera,使用方式与本地相机一致。
- distributedhardwarefwk:分布式硬件管理框架是为分布式硬件子系统提供信息管理能力的部件。分布式硬件管理框架为分布式硬件子系统提供统一的硬件接入、查询和使能等能力。
- distributedscreen:分布式屏幕是一种屏幕虚拟化能力,支持用户指定组网认证过的其他 OpenHarmony 设备的屏幕作为 Display 的显示区域。在分布式硬件子系统中,分布式屏幕组件提供跨设备屏幕能力调用,为 OpenHarmony 操作系统提供系统投屏、屏幕镜像、屏幕分割等能力的实现。
- tools(分布式软总线工具),提供打印本地设备信息和分布式软总线上发现的远程节点信息;
- 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 建立,配置,管理的接口
- 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:软总线的权限配置
- softbus_adapter,软总线适配层,对接底层系统接口(kernel),对接 ssl 加密通道(mbedtls 或 openssl),并为核心服务提供功能实现;
- 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)
总结
- 软总线服务依赖于监听系统事件和网络扫描(coap,br,ble)进行设备发现和认证后的设备连接;
- 软总线服务不对应用层直接提供调用接口,通过分布式设备管理提供 NAPI 接口供应用层调用;
为了帮助到大家能够更有效的学习OpenHarmony 开发的内容,下面特别准备了一些相关的参考学习资料:
OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy
《OpenHarmony源码解析》:https://qr18.cn/CgxrRy
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
系统架构分析:https://qr18.cn/CgxrRy
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……