【OpenHarmony】初识设备间互联互通的统一基础:分布式软总线

分布式软总线

前言


很久没有写出一篇能够分享出来的学习心得了,零零散散地写了好多,总是不太满意。今年8月份开始正式投入精力去学习open harmony,记得第一次接触open harmony的那一个星期,我导师(华哥)就跟我说:可以理解一下什么是软总线。


总线的概念当然不是第一次接触,当"软总线"第一次出现在脑子里的时候,立马就联想到了计算机组成原理里的总线。再结合平常积累的知识,比如说鸿蒙OS的特征,计算机科学常用逻辑上的、概念上的、虚拟的...

猜测:应该是把所有搭载open harmony的设备抽象成一台电脑里面的各个部件、用软件的方式去模拟硬件总线,实现数据在不同设备之间的传输类似一台电脑里的CPU、内存和IO接口等之间的数据传输。总线是物理上的线路,软总线是逻辑上的线路。

点这里进入open harmony社区(博主目前在学习社区5.0的代码)

话说回来,"什么是软总线",我始终没有给华哥一个正式的解答。我希望有一天,当华哥再次问我的时候,我能够从它的设计思想、框架、流程、优点...当前的不足以及未来的展望等一顿嘎嘎输出。

好了,分享一下最近的学习心得。

软总线

毋庸置疑,分布式软总线在open harmony中扮演了非常重要的角色,为设备间的互联互通提供了强大的支持。因为在计算机硬件系统中,总线就是导线,连接计算机内各个部件(CPU、内存...),是传送信息的线路。当计算机内各个部件能够进行信息之间的传输交互,才能够协同工作。没有总线,其他的东西都是扯淡。而软总线,模拟硬件总线,用一条逻辑上的线路,将需要进行信息传输交互的终端设备、例如计算机、智能手机、平板等抽象成计算机内的部件,连接起来,能够在这条逻辑线路上进行信息之间的传输交互 。open harmony为我们提供这样的服务,这项服务叫做 分布式软总线服务,需要用软件来实现。

open harmony的技术架构如下:

看到这份技术架构的时候,梳理一下重点,open harmony把自己分成了四层,分别是内核层、系统服务层、框架层和应用层。分布式软总线自然归属于系统服务层。

现在分布式软总线服务按照我的理解,有两个功能:

  • 功能1:能够用一条逻辑上的线路(软总线),将需要进行信息传输交互的终端设备、例如计算机、智能手机、平板等抽象成计算机内的部件,连接起来。
  • 功能2:连接在一条软总线上的设备,能够在这条逻辑线路上进行信息传输交互。

使用分布式软总线服务的前提条件:设备之间已经建立好物理上的通信通道,可以使用ETH、WIFI或者蓝牙等建立。你想,如果没有物理上的通信通道,数据是不会凭空从一台电脑刷地拷贝一份自己跑到另外一台电脑上的,所以分布式软总线基于物理通信通道。最终使用软总线进行信息传输交互的用户,他们的视角就只是一条软总线,不需要关心你使用什么物理通信通道。

功能1的实现需要经历"发现"、"连接"、"组网"三大步骤,当组网成功以后,就可以快乐地在软总线上传输信息了。

我想,为什么会分成"发现"、"连接"和"组网"三大步骤,大概是这样的一种思想。

对于用户来说,希望以下设备能互相传输数据进行交互,就需要建立物理通信通道(ETH 或WIFI 或蓝牙等方式),将自身构建到同一网络中。这个时候,使用分布式软总线服务的必备条件就准备好了。

想象现在有一条软总线。
"发现" :发现设备处于同一个网络中,有物理通信的通道,可以把它挂在软总线上。

"连接" :将你希望使用软总线进行信息传输交互的设备,挂在软总线上。

"连接"完以后设备的状态,就类似于用网线的方式组局域网,只完成了两端设备插上网线的步骤。(网线方式组局域网,ETH方式,第一步:插上网线,第二步:配置IP等)
"组网":类似于用网线组局域网,配置IP等步骤,不过软总线组网肯定不是简单地配置IP信息等了,哈哈哈,维护的东西更多、做的操作更加复杂。

上面我画的软总线,可以更加细致一些。硬件总线是处于计算机内部件外的导线,可以画在部件的外面,而软总线,虽然将终端设备看作部件,但这项服务需要由部件内的软件 + 部件外的通信通道共同来实现。

软总线代码目录

c 复制代码
//foundation/communication/dsofts
├── adaptor               # 适配层代码
├── components			  # 依赖组件代码
├── core                  # 核心代码
│	├── adaptor           # 适配层代码
│	├── authentication    # 认证代码
│	├── bus_center        # 组网代码
│	├── common            # 通用代码
│	├── connection        # 连接代码
│	├── discover          # 发现代码
│	├── frame             # 框架代码
│	└── transmission      # 传输代码
├── interfaces            # 对外接口代码
├── sdk                   # 运行业务进程代码
│	├── bus_center        # 组网代码
│	├── discovery         # 发现代码
│	├── frame             # 框架代码
│	└──transmission       # 传输代码
├── tests                 # 测试代码
└── tools                 # 工具代码

我必须批评一下自己,在学习软总线的前一个月一直没有直视代码目录结构。现在逐步精简一下目录,来不断地分析,学习如何通过代码了解软总线服务。

c 复制代码
//foundation/communication/dsofts
├── adaptor           # 适配层代码
├── components        # 依赖组件代码
├── core              # 核心代码
├── interfaces        # 对外接口代码
├── sdk               # 运行业务进程代码
├── tests             # 测试代码
└── tools             # 工具代码
  • 测试代码,测试什么东西,可以暂时不关心。
  • 工具代码,里面也不是重点,可以暂时不关心。
  • 适配层代码,一般适配层的存在,是我需要使用某一块功能,但这块功能提供给我们的接口,因为一些原因不能拿来直接用,就需要适配一下。可以暂时不关心,后面再慢慢跳转回来学习。
  • 依赖组件代码,现在可以知道软总线需要依赖某些组件,但我们还没有进去看代码,当前不知道它具体依赖什么,后面涉及到,再跳转到"依赖组件代码component"来学习。

所以重点是下面三个:

c 复制代码
//foundation/communication/dsofts
├── core               # 核心代码
├── interfaces         # 对外接口代码就会你你你你你你你、错错错存储方法烦烦烦、、、、、、、、、、、、、、、、、
└── sdk                # 运行业务进程代码

学习一项服务,首先需要知道这项服务的作用、然后了解如何才能使用这项服务,最后再了解这项服务的内部流程。

在前面我们已经知道分布式软总线服务的作用了,通过interfaces里面放的对外接口,我们可以知道如何使用这项服务,而sdk和core属于软总线服务的内部流程,调动接口开始运行业务,运行的核心业务会使用core。举一个比较日常的例子,餐厅服务,餐厅服务的作用是填饱肚子。

软总线四大模块,发现、连接、组网、传输。

分布式软总线可以从传输模块快速入手,逐步往下学习,所以可以假设设备间已经组网完成,去学习传输模块。

软总线传输模块概述

组网成功后,设备已经能够用软总线。但对于希望使用分布式软总线服务的用户来说,还不能直接使用软总线传输数据,需要建立通信的端点,发送和接收数据都要基于这个通信端点。在软总线建立通信端点、发送数据和接收数据的维护都属于传输模块的工作。

传输模块,重点关注的目录。

c 复制代码
//foundation/communication/dsofts
├── core                  # 核心代码
│	├── common            # 通用代码
│	├── frame             # 框架代码
│	├── transmission      # 传输代码
├── interfaces            # 对外接口代码
├── sdk                   # 运行业务进程代码
│	├── frame             # 框架代码
│	├── transmission      # 传输代码

软总线支持传输四种数据类型:字节bytes、消息message、流stream和文件file。

传输模块主要对外接口和使用方式

传输模块里面有两个让人迷惑的头文件,session.hsocket.h,对外接口应该看哪个头文件?session.hsocket.h主要的几个接口如下:

c 复制代码
//session.h文件
int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener *listener);
int RemoveSessionServer(const char *pkgName, const char *sessionName);
int OpenSession(const char *mySessionName, const char *peerSessionName, const char *peerNetworkId,
    const char *groupId, const SessionAttribute* attr);
void CloseSession(int sessionId);
int SendBytes(int sessionId, const void *data, unsigned int len);
int SendMessage(int sessionId, const void *data, unsigned int len);
int SendStream(int sessionId, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
int SetFileReceiveListener(const char *pkgName, const char *sessionName,
int SetFileSendListener(const char *pkgName, const char *sessionName, const IFileSendListener *sendListener);
int SendFile(int sessionId, const char *sFileList[], const char *dFileList[], uint32_t fileCnt);

//socket.h文件
int32_t Socket(SocketInfo info);
int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
int32_t BindAsync(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
int32_t SendBytes(int32_t socket, const void *data, uint32_t len);
int32_t SendMessage(int32_t socket, const void *data, uint32_t len);
int32_t SendStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
int32_t SendFile(int32_t socket, const char *sFileList[], const char *dFileList[], uint32_t fileCnt);
void Shutdown(int32_t socket);

它们共有的接口

c 复制代码
//发送字节数据
int32_t SendBytes(int32_t , const void *data, uint32_t len);
//发送消息数据
int32_t SendMessage(int32_t , const void *data, uint32_t len);
//发送流数据
int32_t SendStream(int32_t , const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
//发送文件数据
int32_t SendFile(int32_t , const char *sFileList[], const char *dFileList[], uint32_t fileCnt);

现在的软总线对外提供了两套接口,每一套都可以用来达成Send数据的目的。两套接口的本质都是基于软总线建立通信端点,用session.h里的接口建立的通信端点叫做session,用socket.h里的接口建立的通信端点叫做socket ,它们使用方式不同。
session.h提供的接口的使用方式

socket.h提供的接口使用的方式

在学习计算机网络的时候,我们也学过套接字Socket,当时套接字的含义就是通信端点。

相关推荐
孙同学_2 小时前
【Liunx篇】基础开发工具 - vim
linux·开源
zhongcx012 小时前
鸿蒙NEXT开发案例:保质期计算
华为·harmonyos·鸿蒙·鸿蒙next
君莫笑111113 小时前
HarmonyOS中那些不为人知的坑点
harmonyos
华为云开源3 小时前
融合创新,智领未来 | 华为云云原生精彩亮相2024华为云开源开发者论坛
云原生·开源·华为云
Austindatabases3 小时前
OceanBase4.0 跟我学--分布式到底可靠不可靠,到底丢不丢数 ---- 什么是PALF
分布式
HarmonyOS_SDK4 小时前
设备间无缝互联,开启智能“对话”新时代
harmonyos
anthonyzhu4 小时前
鸿蒙next-微博SDK集成
服务器·华为·harmonyos
怪咖码农5 小时前
rabbitMq的rabbitmqctl status报错
java·spring boot·分布式·spring cloud·rabbitmq
重生之Java开发工程师5 小时前
RabbitMQ如何保证消息不被重复消费
分布式·rabbitmq