电子说
现实中多设备间通信方式多种多样(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);
// 注销服务
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);
// 停止发现
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);
// 退网执行结果回调
typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
// 退网请求
int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
// 事件掩码
#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、传输
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);
// 发送字节数据
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
void Shutdown(int32_t socket);
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !