简介
现实中多设备间通信方式多种多样(WIFI、蓝牙等),不同的通信方式使用差异大,导致通信问题多;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。分布式软总线实现近场设备间统一的分布式通信管理能力,提供不区分链路的设备间发现连接、组网和传输能力,主要功能如下:
- 发现连接:提供基于Wifi、蓝牙等通信方式的设备发现连接能力。
- 设备组网:提供统一的设备组网和拓扑管理能力,为数据传输提供已组网设备信息。
- 数据传输:提供数据传输通道,支持消息、字节、流、文件的数据传输能力。
业务方通过使用分布式软总线提供的API实现设备间的高速通信,不用关心通信细节,进而实现业务平台的高效部署与运行能力。
系统架构

图 1 分布式软总线组件架构图
约束
- 组网设备需在同一局域网中 或者 距离相近的近场设备间。
- 组网之前,需先完成设备绑定,绑定流程参见安全子系统中说明。
- 传输完成数据收发之后,业务要主动关闭会话,释放资源。
说明
使用说明
须知: 使用跨设备通信时,必须添加权限
ohos.permission.DISTRIBUTED_DATASYNC和ohos.permission.DISTRIBUTED_SOFTBUS_CENTER,该权限类型为 dangerous 。
设备主动发现手机时,手机需打开超级终端的允许被“附近设备”发现开关(设置-超级终端-我的设备-允许被发现-附近设备),才能被设备发现。
1、发现
- 发布流程
- 上层应用需要对外发布自身能力时,调用服务发布接口发布自身能力。
// 发布回调 typedef struct { /** Callback for publish result */ void (*OnPublishResult)(int publishId, PublishResult reason); } IPublishCb; // 发布服务 int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb); - 上层应用不再需要对外发布自身能力时,调用StopPublishLNN接口注销服务。
// 注销服务 int32_t StopPublishLNN(const char *pkgName, int32_t publishId);
- 发现流程
- 上层应用需要发现特定能力设备时,调用发现接口启动发现。
// 发现回调 typedef struct { /** Callback that is invoked when a device is found */ void (*OnDeviceFound)(const DeviceInfo *device); /** Callback for a subscription result */ void (*OnDiscoverResult)(int32_t refreshId, RefreshResult reason); } IRefreshCallback; // 发现服务 int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb); - 当软总线发现到设备时,通过回调接口通知业务所发现的设备信息。
- 上层应用不再需要发现时,调用StopRefreshLNN接口停止设备发现。
// 停止发现 int32_t StopRefreshLNN(const char *pkgName, int32_t refreshId);
2、组网
- 发起组网请求,携带组网连接地址信息,并且提供组网执行结果回调函数。
// 组网连接地址 typedef struct { ConnectionAddrType type; union { struct BrAddr { char brMac[BT_MAC_LEN]; } br; struct BleAddr { char bleMac[BT_MAC_LEN]; uint8_t udidHash[UDID_HASH_LEN]; } ble; struct IpAddr { char ip[IP_STR_MAX_LEN]; uint16_t port; } ip; } info; char peerUid[MAX_ACCOUNT_HASH_LEN]; } ConnectionAddr; // 组网连接地址类型 typedef enum { CONNECTION_ADDR_WLAN = 0, CONNECTION_ADDR_BR, CONNECTION_ADDR_BLE, CONNECTION_ADDR_ETH, CONNECTION_ADDR_MAX } ConnectionAddrType; // 组网请求执行结果回调 typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode); // 发起组网请求 int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb); - 等待组网结果,JoinLNN()返回成功表示软总线接受了组网请求,组网结果通过回调函数通知业务;组网回调函数中addr参数内容和JoinLNN()的入参互相匹配;retCode如果为0,表示组网成功,此时networkId为有效值,后续传输、退网等接口均需使用该参数;retCode如果不为0,表示组网失败,此时networkId为无效值。
- 使用传输相关接口进行数据传输。
- 发送退网请求,携带组网成功后返回的networkId,并且提供退网执行结果回调。
// 退网执行结果回调 typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode); // 退网请求 int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb); - 等待退网完成,OnLeaveLNNResult()的networkId和退网请求接口中的networkId互相匹配;retCode为0表示退网成功,否则退网失败。退网成功后,networkId变为无效值,后续不应该被继续使用。
- 使用节点(即设备)注册和注销接口,监听网络中节点状态变化等事件。
// 事件掩码 #define EVENT_NODE_STATE_ONLINE 0x1 #define EVENT_NODE_STATE_OFFLINE 0x02 #define EVENT_NODE_STATE_INFO_CHANGED 0x04 #define EVENT_NODE_STATUS_CHANGED 0x08 #define EVENT_NODE_STATE_MASK 0xF // 节点信息 typedef struct { char networkId[NETWORK_ID_BUF_LEN]; char deviceName[DEVICE_NAME_BUF_LEN]; uint16_t deviceTypeId; } NodeBasicInfo; // 节点状态事件回调 typedef struct { uint32_t events; // 组网事件掩码 void (*onNodeOnline)(NodeBasicInfo *info); // 节点上线事件回调 void (*onNodeOffline)(NodeBasicInfo *info); // 节点下线事件回调 void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 节点信息变化事件回调 void (*onNodeStatusChanged)(NodeStatusType type, NodeStatus *status); // 设备运行状态变化事件回调 } INodeStateCb; // 注册节点状态事件回调 int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback); // 注销节点状态事件回调 int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
3、传输
- 创建Socket。
typedef struct { char *name; // 本端Socket名称 char *peerName; // 对端Socket名称 char *peerNetworkId; // 对端Socket的网络ID char *pkgName; // 调用者包名 TransDataType dataType; // 传输的数据类型,需要与发送方法一致 } SocketInfo; // 创建Socket int32_t Socket(SocketInfo info); - 服务端启动监听,客户端进行绑定。
// Socket回调函数 typedef struct { void (*OnBind)(int32_t socket, PeerSocketInfo info); void (*OnShutdown)(int32_t socket, ShutdownReason reason); void (*OnBytes)(int32_t socket, const void *data, uint32_t dataLen); void (*OnMessage)(int32_t socket, const void *data, uint32_t dataLen); void (*OnStream)(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param); void (*OnFile)(int32_t socket, FileEvent *event); void (*OnQos)(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCount); } ISocketListener; typedef enum { QOS_TYPE_MIN_BW, // 最小带宽 QOS_TYPE_MAX_LATENCY, // 最大建链时延 QOS_TYPE_MIN_LATENCY, // 最小建链时延 QOS_TYPE_MAX_WAIT_TIMEOUT, // 最大超时时间 QOS_TYPE_MAX_BUFFER, // 最大缓存 QOS_TYPE_FIRST_PACKAGE, // 首包大小 QOS_TYPE_MAX_IDLE_TIMEOUT, // 最大空闲时间 QOS_TYPE_TRANS_RELIABILITY, // 传输可靠性 QOS_TYPE_BUTT, } QosType; typedef struct { QosType qos; int32_t value; } QosTV; // 监听Socket,由服务端开启。 int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener); // 绑定Socket,由客户端开启。 int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener); - 通过Socket向对端设备发送数据。
// 发送字节数据 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); - 关闭Socket。
// 关闭Socket void Shutdown(int32_t socket);
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
总线
+关注
关注
10文章
3057浏览量
91864 -
分布式
+关注
关注
1文章
1114浏览量
76696 -
鸿蒙
+关注
关注
60文章
3017浏览量
46170
发布评论请先 登录
相关推荐
热点推荐
2022全新版!Java分布式架构设计与开发实战(完结)
2022全新版!Java分布式架构设计与开发实战(完结)
分库分表实战:Java海量数据存储架构设计
在现代互联网应用中,随着业务规模的指数级增长,数据库性能瓶颈已成为制约系统发展的
发表于 03-30 15:20
M4-R1 开源鸿蒙(OpenHarmory)开发板丨串口调试助手实战案例
前言开源鸿蒙(OpenHarmony)作为国产分布式操作系统,正在为智能终端与物联网设备构建统一的开放生态。它以开源共建的方式,为多设备协同与产业创新提供坚实基础。M4-R1开发板凭借完善的软硬件
分布式 IO 选型注意事项
定义 分布式IO是一种脱离传统集中式 IO 柜,将输入 / 输出模块分散部署在工业现场设备附近,通过工业总线(如 Profinet、EtherNet/IP、Modbus TCP 等)与 PLC、MES 等控制系统实现数据交互的工业控制设备。其核心架构由 “主站 +
SC-3568HA:解锁鸿蒙全权限API与分布式能力的工业控制平台
传统嵌入式开发面临硬件碎片化、高权限功能缺失、分布式协同复杂及自动化测试不足等痛点。SC-3568HA开发板基于鸿蒙系统,通过统一内核抽象层和硬件驱动框架解决兼容问题,开放全量系统AP
一个面向单片机、事件驱动的嵌入式开发平台介绍
为核心,打造一个统一的嵌入式技术生态,为广大企业用户和嵌入式开发者们,提供搞可靠性的、高性能的、现代且高开发效率的嵌入式开发环境。
EventOS的主要特性列举如下:
1、事件
发表于 12-05 06:26
分布式光伏发电监测系统技术方案
分布式光伏发电监测系统技术方案 柏峰【BF-GFQX】一、系统目标 :分布式光伏发电监测系统旨在通过智能化的监测手段,实现对分布式光伏电站的全方位、高精度、实时化管理。该系统能
蜻蜓FM开源“SmartXPlayer”音频播放组件,打造鸿蒙多端音频播放新引擎
近日,由蜻蜓FM研发的音频播放组件“SmartXPlayer”正式开源并上线 OpenHarmony 三方库中心仓。作为一款专为鸿蒙多端场景打造的音频播放引擎,SmartXPlayer基于鸿蒙系统
分布式光伏总出问题?安科瑞分布式光伏监控系统来“救场”
一、分布式光伏的痛点大揭秘 在 “双碳” 目标的大力推动下,分布式光伏作为绿色能源领域的重要力量,正以前所未有的速度蓬勃发展,越来越多的企业和家庭选择安装分布式光伏系统。然而,随着分布式
开鸿开发板深度体验:从开源鸿蒙开发到AI场景实践
的KaihongBoard-3588S-SBC和KaihongBoard-3576-SBC被评为“2025OpenHarmony明星开发板”,可实现设备快速开源鸿蒙化升级、分布式互联协同、弹性部署等能力。
鸿蒙5开发宝藏案例分享---一多开发实例(音乐)
各位开发者小伙伴们好呀!今天咱们来点硬核干货!最近在鸿蒙文档中心挖到一座“金矿”——官方竟然暗藏了100+实战案例,从分布式架构到交互动效优化应有尽有!这些案例不仅藏着华为工程师的私房
鸿蒙5开发宝藏案例分享---Swiper组件性能优化实战
鸿蒙宝藏:Swiper组件性能优化实战,告别卡顿丢帧!
大家好!最近在鸿蒙开发时,偶然发现了官方文档里埋藏的 性能优化宝藏案例 ,尤其是&l
发表于 06-12 17:53
鸿蒙5开发宝藏案例分享---应用接续提升内容发布体验
?【开发经验分享】鸿蒙应用接续功能实战:这些隐藏案例助你实现跨设备丝滑流转!
各位开发者小伙伴们好呀~今天在肝项目时意外解锁了HarmonyOS的一个\"宝藏技能\"——应用接续
发表于 06-03 18:25
鸿蒙5开发宝藏案例分享---一多开发实例(游戏)
——鸿蒙用****分布式软总线三行代码搞定设备发现!
// 核心代码示例
import distributedDeviceManager from
发表于 06-03 18:22
开源鸿蒙开发新体验,开鸿Bot系列今日开启预售!
,也是一台轻办公开源鸿蒙PC。凭借“新交互、新智能、新生态、新安全”四大显著特性,满足用户基础的轻办公智慧场景。
●新交互:基于KaihongOS分布式软总线能力,只需一键即可轻
发表于 05-16 14:13
鸿蒙实战开发:【分布式软总线组件】
评论