簡介
現(xiàn)實(shí)中多設(shè)備間通信方式多種多樣(WIFI、藍(lán)牙等),不同的通信方式使用差異大,導(dǎo)致通信問題多;同時(shí)還面臨設(shè)備間通信鏈路的融合共享和沖突無法處理等挑戰(zhàn)。分布式軟總線實(shí)現(xiàn)近場設(shè)備間統(tǒng)一的分布式通信管理能力,提供不區(qū)分鏈路的設(shè)備間發(fā)現(xiàn)連接、組網(wǎng)和傳輸能力,主要功能如下:
- 發(fā)現(xiàn)連接:提供基于Wifi、藍(lán)牙等通信方式的設(shè)備發(fā)現(xiàn)連接能力。
- 設(shè)備組網(wǎng):提供統(tǒng)一的設(shè)備組網(wǎng)和拓?fù)涔芾砟芰?,為?shù)據(jù)傳輸提供已組網(wǎng)設(shè)備信息。
- 數(shù)據(jù)傳輸:提供數(shù)據(jù)傳輸通道,支持消息、字節(jié)、流、文件的數(shù)據(jù)傳輸能力。
業(yè)務(wù)方通過使用分布式軟總線提供的API實(shí)現(xiàn)設(shè)備間的高速通信,不用關(guān)心通信細(xì)節(jié),進(jìn)而實(shí)現(xiàn)業(yè)務(wù)平臺的高效部署與運(yùn)行能力。
系統(tǒng)架構(gòu)
圖 1 分布式軟總線組件架構(gòu)圖
約束
- 組網(wǎng)設(shè)備需在同一局域網(wǎng)中 或者 距離相近的近場設(shè)備間。
- 組網(wǎng)之前,需先完成設(shè)備綁定,綁定流程參見安全子系統(tǒng)中說明。
- 傳輸完成數(shù)據(jù)收發(fā)之后,業(yè)務(wù)要主動關(guān)閉會話,釋放資源。
說明
使用說明
須知: 使用跨設(shè)備通信時(shí),必須添加權(quán)限
ohos.permission.DISTRIBUTED_DATASYNC
和ohos.permission.DISTRIBUTED_SOFTBUS_CENTER
,該權(quán)限類型為 dangerous 。
設(shè)備主動發(fā)現(xiàn)手機(jī)時(shí),手機(jī)需打開超級終端的允許被“附近設(shè)備”發(fā)現(xiàn)開關(guān)(設(shè)置-超級終端-我的設(shè)備-允許被發(fā)現(xiàn)-附近設(shè)備),才能被設(shè)備發(fā)現(xiàn)。
1、發(fā)現(xiàn)
- 發(fā)布流程
- 上層應(yīng)用需要對外發(fā)布自身能力時(shí),調(diào)用服務(wù)發(fā)布接口發(fā)布自身能力。
// 發(fā)布回調(diào) typedef struct { /** Callback for publish result */ void (*OnPublishResult)(int publishId, PublishResult reason); } IPublishCb; // 發(fā)布服務(wù) int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb);
- 上層應(yīng)用不再需要對外發(fā)布自身能力時(shí),調(diào)用StopPublishLNN接口注銷服務(wù)。
// 注銷服務(wù) int32_t StopPublishLNN(const char *pkgName, int32_t publishId);
- 發(fā)現(xiàn)流程
- 上層應(yīng)用需要發(fā)現(xiàn)特定能力設(shè)備時(shí),調(diào)用發(fā)現(xiàn)接口啟動發(fā)現(xiàn)。
// 發(fā)現(xiàn)回調(diào) 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; // 發(fā)現(xiàn)服務(wù) int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb);
- 當(dāng)軟總線發(fā)現(xiàn)到設(shè)備時(shí),通過回調(diào)接口通知業(yè)務(wù)所發(fā)現(xiàn)的設(shè)備信息。
- 上層應(yīng)用不再需要發(fā)現(xiàn)時(shí),調(diào)用StopRefreshLNN接口停止設(shè)備發(fā)現(xiàn)。
// 停止發(fā)現(xiàn) int32_t StopRefreshLNN(const char *pkgName, int32_t refreshId);
2、組網(wǎng)
- 發(fā)起組網(wǎng)請求,攜帶組網(wǎng)連接地址信息,并且提供組網(wǎng)執(zhí)行結(jié)果回調(diào)函數(shù)。
// 組網(wǎng)連接地址 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; // 組網(wǎng)連接地址類型 typedef enum { CONNECTION_ADDR_WLAN = 0, CONNECTION_ADDR_BR, CONNECTION_ADDR_BLE, CONNECTION_ADDR_ETH, CONNECTION_ADDR_MAX } ConnectionAddrType; // 組網(wǎng)請求執(zhí)行結(jié)果回調(diào) typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode); // 發(fā)起組網(wǎng)請求 int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb);
- 等待組網(wǎng)結(jié)果,JoinLNN()返回成功表示軟總線接受了組網(wǎng)請求,組網(wǎng)結(jié)果通過回調(diào)函數(shù)通知業(yè)務(wù);組網(wǎng)回調(diào)函數(shù)中addr參數(shù)內(nèi)容和JoinLNN()的入?yún)⒒ハ嗥ヅ洌籸etCode如果為0,表示組網(wǎng)成功,此時(shí)networkId為有效值,后續(xù)傳輸、退網(wǎng)等接口均需使用該參數(shù);retCode如果不為0,表示組網(wǎng)失敗,此時(shí)networkId為無效值。
- 使用傳輸相關(guān)接口進(jìn)行數(shù)據(jù)傳輸。
- 發(fā)送退網(wǎng)請求,攜帶組網(wǎng)成功后返回的networkId,并且提供退網(wǎng)執(zhí)行結(jié)果回調(diào)。
// 退網(wǎng)執(zhí)行結(jié)果回調(diào) typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode); // 退網(wǎng)請求 int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
- 等待退網(wǎng)完成,OnLeaveLNNResult()的networkId和退網(wǎng)請求接口中的networkId互相匹配;retCode為0表示退網(wǎng)成功,否則退網(wǎng)失敗。退網(wǎng)成功后,networkId變?yōu)闊o效值,后續(xù)不應(yīng)該被繼續(xù)使用。
- 使用節(jié)點(diǎn)(即設(shè)備)注冊和注銷接口,監(jiān)聽網(wǎng)絡(luò)中節(jié)點(diǎn)狀態(tài)變化等事件。
// 事件掩碼 #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 // 節(jié)點(diǎn)信息 typedef struct { char networkId[NETWORK_ID_BUF_LEN]; char deviceName[DEVICE_NAME_BUF_LEN]; uint16_t deviceTypeId; } NodeBasicInfo; // 節(jié)點(diǎn)狀態(tài)事件回調(diào) typedef struct { uint32_t events; // 組網(wǎng)事件掩碼 void (*onNodeOnline)(NodeBasicInfo *info); // 節(jié)點(diǎn)上線事件回調(diào) void (*onNodeOffline)(NodeBasicInfo *info); // 節(jié)點(diǎn)下線事件回調(diào) void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 節(jié)點(diǎn)信息變化事件回調(diào) void (*onNodeStatusChanged)(NodeStatusType type, NodeStatus *status); // 設(shè)備運(yùn)行狀態(tài)變化事件回調(diào) } INodeStateCb; // 注冊節(jié)點(diǎn)狀態(tài)事件回調(diào) int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback); // 注銷節(jié)點(diǎn)狀態(tài)事件回調(diào) int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
3、傳輸
- 創(chuàng)建Socket。
typedef struct { char *name; // 本端Socket名稱 char *peerName; // 對端Socket名稱 char *peerNetworkId; // 對端Socket的網(wǎng)絡(luò)ID char *pkgName; // 調(diào)用者包名 TransDataType dataType; // 傳輸?shù)臄?shù)據(jù)類型,需要與發(fā)送方法一致 } SocketInfo; // 創(chuàng)建Socket int32_t Socket(SocketInfo info);
- 服務(wù)端啟動監(jiān)聽,客戶端進(jìn)行綁定。
// Socket回調(diào)函數(shù) 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, // 最大建鏈時(shí)延 QOS_TYPE_MIN_LATENCY, // 最小建鏈時(shí)延 QOS_TYPE_MAX_WAIT_TIMEOUT, // 最大超時(shí)時(shí)間 QOS_TYPE_MAX_BUFFER, // 最大緩存 QOS_TYPE_FIRST_PACKAGE, // 首包大小 QOS_TYPE_MAX_IDLE_TIMEOUT, // 最大空閑時(shí)間 QOS_TYPE_TRANS_RELIABILITY, // 傳輸可靠性 QOS_TYPE_BUTT, } QosType; typedef struct { QosType qos; int32_t value; } QosTV; // 監(jiān)聽Socket,由服務(wù)端開啟。 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向?qū)Χ嗽O(shè)備發(fā)送數(shù)據(jù)。
// 發(fā)送字節(jié)數(shù)據(jù) int32_t SendBytes(int32_t socket, const void *data, uint32_t len); // 發(fā)送消息數(shù)據(jù) int32_t SendMessage(int32_t socket, const void *data, uint32_t len); // 發(fā)送流數(shù)據(jù)# 分布式軟總線組件 int32_t SendStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param); // 發(fā)送文件 int32_t SendFile(int32_t socket, const char *sFileList[], const char *dFileList[], uint32_t fileCnt);
- 關(guān)閉Socket。
// 關(guān)閉Socket void Shutdown(int32_t socket);
審核編輯 黃宇
-
總線
+關(guān)注
關(guān)注
10文章
2857瀏覽量
87893 -
分布式
+關(guān)注
關(guān)注
1文章
854瀏覽量
74434 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2301瀏覽量
42681
發(fā)布評論請先 登錄
相關(guān)推薦
評論