一、问题
我们在使用电子设备的时候,经常遇到的情况,多个设备之间想要共享数据,发现会非常麻烦。比如说两个手机传送文件,需要连接网络,需要登录软件,需要选择文件,需要发送,想想就累。
再麻烦一点,我家里有智能家居,我当然希望我回到家,所有的设备可以直接连接上我的手机,我可以随时获取他们的信息,然后可以发送,设定数据给所有的电器。但我不希望我回到家后,花上半个小时一个个连接。
你说你不怕麻烦?
OK,那假设你的智能手表不具有WiFi功能,只有蓝牙,而你的电脑没有蓝牙功能。
请问他们之间如何传输数据?
这个时候也简单,我们的手机蓝牙和wifi不是都有吗?
那么我们可以手动的,用手机从手表取出数据,发送给电脑。
嗯,累不累?
二、解决方法
这咋办呢?有没有一个方法,可以让我的设备之间自己组网,自己进行数据交互,还可以兼容各种不同的设备,各种通信形式?
有的,有的。
这就是分布式软总线技术。
三、分布式软总线技术介绍
分布式软总线技术,顾名思义,分布式的软的总线。我们挨个拆解
3.1、什么是总线?
其实这个概念是从计算机中引入的,计算机中有很多的设备,需要进行数据通信和任务通信,为了解决这个问题,于是就出现了总线技术。
总线就像计算机内部的 “超级高速公路”,专门负责让 CPU、存储器、各种控制器(如键盘控制器、硬盘控制卡等)之间顺畅沟通。在下图中
图里的 CMOS 存储器、显示器控制卡、USB 控制卡等设备,都靠这三条 “路” 和 CPU 连接,就像城市里的建筑通过公路、交通信号系统协作,最终让计算机各部件高效配合,进行数据通信,完成各种任务。
3.2、什么是软总线?
计算机中的总线是电路搭建起来的硬件电路。
而软总线通过软件代码、协议算法构建 “虚拟通道”,不依赖计算机硬件总线那样固定的物理电路(如主板上的地址线、数据线等硬件线路),也无需设备统一物理接口,这是 “软” 的核心体现。
3.3、什么是分布式?
可以看到计算机总线中,所有的数据都是流向CPU,或者从CPU流出,此时,CPU就是中心设备。而分布式的意思是,所有的设备等级平行,数据可以通过这条总线总线在任意两条设备之间流动。
四、实现原理
假设我们有A,B,C,D,E五个设备
其中A,B,C支持wifi与蓝牙,D只有wifi,E只有蓝牙,且E连接C。
此时所有的设备都在一个局域网下。
如何让他们自行组网呢?
那么主要有以下几个过程
4.1、设备发现
1. 多协议广播发现
- A/B/C 设备:
同时开启蓝牙广播(BLE)和WiFi UDP 广播,发送包含设备 ID、IP 地址、支持协议(WiFi/BT)的数据包。
- D 设备:
仅通过 WiFi 发送 UDP 广播,携带自身 IP 和 “仅支持 WiFi” 标识。
- E 设备:
仅通过蓝牙广播设备 ID 和 “仅支持蓝牙” 标识。
2.连接信息存储
每个设备维护一个本地设备目录,记录自身支持的协议能发现的所有设备的 ID、IP、协议类型等信息。
例如:D 的本地目录中没有 E 的信息,因为 D 无法接收蓝牙广播。
3. 核心设备选择
动态选举主节点:
A/B/C 中选择一个作为主节点(如 A),负责维护全局设备列表和各个设备的信息。
选举依据:CPU 性能、电量、网络稳定性(如优先选择 A,因 A 已连接 E)。
4.2、设备连接
1.直接连接
- 当其中一个设备(如 B)需要与另一个设备(如 C)进行数据交互时,B 根据本地设备目录中记录的 C 的 IP 地址,通过 WiFi 网络向 C 发起 TCP 或 UDP 连接请求。例如,如果是文件传输可能使用 TCP 协议保证数据的可靠传输;如果是实时性要求高的音视频流传输可能使用 UDP 协议减少延迟。
2.跨协议设备间的连接
- D 需要与 E 进行数据交互时,由于 D 的本地设备目录中没有 E 的信息(D不支持蓝牙),但 D 知道主节点 A 的信息(因为在设备发现阶段 D 发现了 A)。D 根据本地目录中记录的 A 的 IP 地址,通过 WiFi 网络向 A 发送数据交互请求,请求中包含目标设备 E 的 ID。
- 主节点处理:主节点 A 接收到 D 的请求后,在其维护的全局设备列表中查找 E 的信息,发现 E 是仅支持蓝牙的设备。
- 信息查询:主节点 A 接收到 D 的请求后,在其维护的全局设备列表中查找 E 的信息,得知 E 已通过蓝牙连接到 C。
- 路径规划:A 根据网络状况和设备状态,规划出 D 与 E 之间的通信路径,即 D→A→C→E。
- 这里要注意,任何一种跨协议的数据传输都需要经过A,因为主节点 A 是唯一掌握全局设备列表和协议转换能力的节点,无主节点参与时,设备无法识别跨协议目标。
4.3、数据交互
1.直接连接
- 数据传输:连接建立成功后,B 将数据封装成符合对应协议格式的数据包,通过 WiFi 网络发送给 C,C 接收到数据包后进行解包和处理。
2.跨协议设备间的连接
- D 到 A:D 将需要传输的数据封装成符合 WiFi 协议格式的数据包,通过 WiFi 网络发送给 A。
- A 到 C:主节点 A 接收到 D 发送的数据包后,对其进行解析,然后根据 C 的 IP 地址(或其他标识信息),将数据重新封装成适合在网络中传输的格式,通过 WiFi 网络发送给 C。
- C 到 E:C 接收到 A 发送的数据后,将其从 WiFi 协议格式转换为蓝牙协议格式,再通过之前建立的蓝牙连接将数据包发送给 E。
4.4、设备退出
1、主动退出流程
当设备要主动退出网络时,需按以下步骤操作:
1.发送退出通知
- 具备多协议的设备(A/B/C):会同时借助蓝牙和 WiFi 这两种方式,广播带有自身 ID 的退出消息。
- 仅支持 WiFi 的设备(D):通过 UDP 广播发送退出通知。
- 仅支持蓝牙的设备(E):利用蓝牙广播宣告退出。
2.主节点处理
- 主节点(例如 A)在接收到设备的退出通知后,会从全局设备列表中将该设备的信息删除。
- 主节点会立即生成一个包含更新后信息的新的全局设备列表。
3.全网同步
- 主节点通过多协议广播的形式,把更新后的全局设备列表发送给所有在线的设备。
- 其他设备收到新的全局设备列表后,会对各自的本地设备目录进行更新。
4.断开连接
- 所有与退出设备有直接连接的设备,会主动关闭相关的 TCP/UDP 连接或者蓝牙连接。
- 举例来说,如果 D 之前和 C 有连接,那么 D 会主动断开与 C 的 WiFi 连接。
2、异常退出处理
当设备出现异常退出情况(如断电、网络突然中断)时,按以下方式处理:
1.检测异常
- 主节点会定期对设备进行存活检测,比如通过发送心跳包。
- 当设备在规定的时间内(例如 30 秒)没有响应心跳包时,就会被判定为异常退出。
2.触发主动退出流程
- 主节点会模拟设备主动退出的流程,从全局设备列表中删除该设备,并将更新后的列表同步给其他设备。
3.跨协议连接调整
- 若 E 原本通过 C 连接到网络,而 C 异常退出,那么 E 需要重新搜索可连接的蓝牙设备,如 A 或 B。
- E 成功连接到新的设备后,新的设备会将 E 的信息上报给主节点,主节点会更新全局设备列表。
3、主节点退出特殊流程
当主节点(如 A)退出网络时,会触发以下操作:
1.启动新主节点选举
- 剩余的 A/B/C 设备会依据之前设定的选举依据(如 CPU 性能、电量、网络稳定性),重新选举出一个新的主节点,例如 B。
- 新主节点会生成一个全新的全局设备列表。
2.跨协议通信恢复
- 新主节点会重新建立与其他设备的连接,以确保跨协议通信能够正常进行。
- 例如,D 需要通过新主节点 B 与 E 进行通信。
3.旧主节点资源释放
- 所有设备会主动删除与旧主节点(A)相关的连接信息。
4.4、新加入设备
1. 新设备广播
- 协议匹配:新设备根据自身支持的协议(WiFi/BT)发送广播
双协议设备:同时发送 BLE 广播和 WiFi UDP 广播
单协议设备:仅发送对应协议广播
- 广播内容:设备 ID、支持的协议类型、IP 地址(WiFi 设备)、设备能力参数(如 CPU 性能、电量等)
2. 现有设备发现
- 多协议监听:
- A/B/C 设备同时接收蓝牙和 WiFi 广播
- D 设备仅接收 WiFi 广播
- E 设备仅接收蓝牙广播
- 信息初步存储:
- 各设备将发现的新设备信息暂存到本地临时目录
- 例如:D 发现新设备 F(WiFi),会记录 F 的 IP 和协议类型
3. 主节点信息收集
- 主动上报:
- 所有设备(包括新设备)在发现新节点后,立即向主节点 A 发送更新请求
- 新设备 F 会主动向主节点 A 发送自身完整信息
- 信息验证:
- 主节点 A 通过多源数据校验(如对比 WiFi 和蓝牙广播的 ID 一致性)
- 验证新设备的协议支持情况和网络可达性
4. 全局设备列表更新
- 主节点处理:
-.将新设备 F 加入全局设备列表
-.记录其协议类型、IP 地址、设备能力参数
-.标记设备状态(如是否支持协议转换)
- 信息同步:
- 主节点 A 通过 WiFi 多播向全网设备发送更新通知
- 各设备根据更新内容同步本地目录
- 例如:E 设备通过 C 的蓝牙连接获取新设备信息
5. 主节点重新选举(可选)
- 触发条件:
- 新设备 F 的 CPU 性能 / 电量 / 网络稳定性优于当前主节点 A
- 主节点 A 主动发起选举(如检测到自身资源不足)
- 选举过程:
主节点 A 广播选举请求
所有候选设备(A/B/C/F)上报自身参数
全网设备投票选出最优设备
新主节点初始化全局设备列表
6. 连接建立与路径更新
- 直接连接:
- 同类协议设备可直接建立连接(如 F 与 D 通过 WiFi 连接)
- 双协议设备优先选择最优协议连接(如 F 与 C 优先用 WiFi)
- 跨协议路径更新:
- 主节点 A 根据新设备位置重新规划路径
- 例如:新增 F→A→C→E 的传输路径
- 旧有路径(如 D→A→C→E)保持可用
7. 网络优化
- 负载均衡:
- 主节点 A 根据设备负载动态分配流量
- 例如:若 F 的 WiFi 带宽更高,将部分 D→C 的流量转移到 F
- 冗余路径:
- 自动生成备用路径(如 F→B→C→E)
当主路径故障时自动切换
特殊场景处理
1.仅蓝牙设备加入:
- 必须通过现有蓝牙节点(如 C/E)间接接入
- 主节点 A 通过 C 的蓝牙连接获取该设备信息
2.多主节点冲突:
- 通过设备 ID 哈希值进行冲突检测
- 哈希值较小的设备自动降级为从节点
3.协议扩展:
- 新增协议设备(如 ZigBee)需先连接到桥接设备
- 桥接设备向主节点注册协议转换能力
当然,上述过程均由分布式软总线技术实现,无需人工干预,我们只需要在手机上点击即可。
五、相关代码
分布式软中线代码仓库地址如下:
- communication_interfaces_kits_softbuskit_lite
https://gitee.com/openharmony/communication_interfaces_kits_softbuskit_lite
- communication_services_softbus_lite
https://gitee.com/openharmony/communication_services_softbus_lite
为省去篇幅,本篇暂时不讲代码,下一篇开启代码以及测试教程。
六、总结
6.1、结构分层
这个过程中,我们将整个网络可以分为三:应用层,网络层,链路层
其中每一层的功能如下
应用层(你直接用的功能)
- 就像你手机里的「文件传输」APP 或「智能家居控制」界面
- 你点一下「传文件」或「开空调」,这就是应用层在工作
- 它只关心「要传什么」和「要控制什么」,不关心怎么传过去
网络层(幕后的快递调度中心)
- 类似快递公司的总调度室
- 当你要从手机传文件到电脑(不管是蓝牙还是 WiFi),它会:
- 就像你网购时,快递系统自动帮你选顺丰陆运还是空运
链路层(具体的运输道路)
- 就像现实中的高速公路、乡村土路等不同道路类型
- 决定数据用什么「交通工具」传输:
- 蓝牙:适合短距离、低功耗的「电动车」(比如传照片到智能手表)
- WiFi:适合中距离、高速的「卡车」(比如传视频到电视)
- 未来可能支持的 5G/zigbee 等,就是更高级的「高铁」「飞机」
- 这些道路可以同时存在,系统会根据情况自动切换
举个例子:
你用手机给空调发指令「制冷」:
- 应用层:你在 APP 点「制冷」
- 网络层:自动找到空调的位置,发现空调只支持 WiFi,而手机同时有 WiFi 和蓝牙,于是规划路径:手机 WiFi→路由器→空调 WiFi
- 链路层:数据通过 WiFi「卡车」运输,中间不需要你操作蓝牙或连热点
6.2、技术特点
如此我们便实现所需的需求,即满足设备的数据之间共享。
其技术主要有以下特点
本文为本人查阅资料后编写,才疏学浅,如有错误,请提出宝贵意见,即可更改。
参考资料
1.https://www.cnblogs.com/rxwest/p/14290923.html
2.华为开发者文章