0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙實(shí)戰(zhàn)開發(fā):【分布式軟總線組件】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-15 18:00 ? 次閱讀

簡介

現(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_DATASYNCohos.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ā)布流程
  1. 上層應(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);
    
  2. 上層應(yīng)用不再需要對外發(fā)布自身能力時(shí),調(diào)用StopPublishLNN接口注銷服務(wù)。
    // 注銷服務(wù)
    int32_t StopPublishLNN(const char *pkgName, int32_t publishId);
    
  • 發(fā)現(xiàn)流程
  1. 上層應(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);
    
  2. 當(dāng)軟總線發(fā)現(xiàn)到設(shè)備時(shí),通過回調(diào)接口通知業(yè)務(wù)所發(fā)現(xiàn)的設(shè)備信息。
  3. 上層應(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)

  1. 發(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);
    
  2. 等待組網(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為無效值。
  3. 使用傳輸相關(guān)接口進(jìn)行數(shù)據(jù)傳輸。
  4. 發(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);
    
  5. 等待退網(wǎng)完成,OnLeaveLNNResult()的networkId和退網(wǎng)請求接口中的networkId互相匹配;retCode為0表示退網(wǎng)成功,否則退網(wǎng)失敗。退網(wǎng)成功后,networkId變?yōu)闊o效值,后續(xù)不應(yīng)該被繼續(xù)使用。
  6. 使用節(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、傳輸

  1. 創(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);
    
  2. 服務(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);
    
  3. 通過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);
    
  4. 關(guān)閉Socket。
    // 關(guān)閉Socket
    void Shutdown(int32_t socket);
    

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2857

    瀏覽量

    87893
  • 分布式
    +關(guān)注

    關(guān)注

    1

    文章

    854

    瀏覽量

    74434
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2301

    瀏覽量

    42681
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙ArkTS聲明開發(fā):跨平臺支持列表【分布式遷移標(biāo)識】 通用屬性

    組件分布式遷移標(biāo)識,指明了該組件分布式遷移場景下可以將特定狀態(tài)恢復(fù)到對端設(shè)備。
    的頭像 發(fā)表于 06-07 21:15 ?330次閱讀

    鴻蒙開發(fā)接口數(shù)據(jù)管理:【@ohos.data.distributedData (分布式數(shù)據(jù)管理)】

    分布式數(shù)據(jù)管理為應(yīng)用程序提供不同設(shè)備間數(shù)據(jù)庫的分布式協(xié)同能力。通過調(diào)用分布式數(shù)據(jù)各個(gè)接口,應(yīng)用程序可將數(shù)據(jù)保存到分布式數(shù)據(jù)庫中,并可對分布式
    的頭像 發(fā)表于 06-07 09:30 ?859次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>接口數(shù)據(jù)管理:【@ohos.data.distributedData (<b class='flag-5'>分布式</b>數(shù)據(jù)管理)】

    HarmonyOS實(shí)戰(zhàn)案例:【分布式賬本】

    Demo基于Open Harmony系統(tǒng)使用ETS語言進(jìn)行編寫,本Demo主要通過設(shè)備認(rèn)證、分布式拉起、分布式數(shù)據(jù)管理等功能來實(shí)現(xiàn)。
    的頭像 發(fā)表于 04-12 16:40 ?1247次閱讀
    HarmonyOS<b class='flag-5'>實(shí)戰(zhàn)</b>案例:【<b class='flag-5'>分布式</b>賬本】

    OpenHarmony南向開發(fā)案例:【分布式畫板】

    使用OpenHarmony3.1-Release開發(fā)的應(yīng)用。通過OpenHarmony的分布式技術(shù),使多人能夠一起畫畫。
    的頭像 發(fā)表于 04-12 14:40 ?965次閱讀
    OpenHarmony南向<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>分布式</b>畫板】

    鴻蒙HarmonyOS開發(fā)實(shí)戰(zhàn):【分布式音樂播放】

    本示例使用fileIo獲取指定音頻文件,并通過AudioPlayer完成了音樂的播放完成了基本的音樂播放、暫停、上一曲、下一曲功能;并使用DeviceManager完成了分布式設(shè)備列表的顯示和分布式能力完成了音樂播放狀態(tài)的跨設(shè)備分享。
    的頭像 發(fā)表于 04-10 17:51 ?795次閱讀
    <b class='flag-5'>鴻蒙</b>HarmonyOS<b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b>:【<b class='flag-5'>分布式</b>音樂播放】

    鴻蒙實(shí)戰(zhàn)項(xiàng)目開發(fā):【短信服務(wù)】

    兩位前阿里高級研發(fā)工程師聯(lián)合打造的 《鴻蒙NEXT星河版OpenHarmony開發(fā)文檔》 里面內(nèi)容包含了(ArkTS、ArkUI開發(fā)組件、Stage模型、多端部署、
    發(fā)表于 03-03 21:29

    HarmonyOS開發(fā)技術(shù)全面分析

    態(tài)的終端設(shè)備對于操作系統(tǒng)的要求。 技術(shù)特性 硬件互助,資源共享 分布式總線 分布式總線是多種
    發(fā)表于 02-21 16:31

    鴻蒙OS 分布式任務(wù)調(diào)度

    鴻蒙OS 分布式任務(wù)調(diào)度概述 在 HarmonyO S中,分布式任務(wù)調(diào)度平臺對搭載 HarmonyOS 的多設(shè)備構(gòu)筑的“超級虛擬終端”提供統(tǒng)一的組件管理能力,為應(yīng)用定義統(tǒng)一的能力基線、
    的頭像 發(fā)表于 01-29 16:50 ?436次閱讀

    鴻蒙ArkUI開發(fā)-Tabs組件的使用

    鴻蒙ArkUI開發(fā)-Tabs組件的使用
    的頭像 發(fā)表于 01-19 16:01 ?1700次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI<b class='flag-5'>開發(fā)</b>-Tabs<b class='flag-5'>組件</b>的使用

    鴻蒙千帆起】《開心消消樂》完成鴻蒙原生應(yīng)用開發(fā),創(chuàng)新多端聯(lián)動用戶體驗(yàn)

    加強(qiáng)游戲與玩家之間交互的提醒,用戶不需要頻繁打開游戲就能接收到游戲中的關(guān)鍵信息,比如精力恢復(fù)、新關(guān)卡開放、活動信息提醒等,給玩家提供了更加便捷的游戲體驗(yàn)。 同時(shí),HarmonyOS 特有的分布式總線
    發(fā)表于 01-03 10:22

    鴻蒙原生應(yīng)用開發(fā)——分布式數(shù)據(jù)對象

    、分布式數(shù)據(jù)對象保存 6、分布式數(shù)據(jù)對象訂閱(數(shù)據(jù)變更,上下線) 7、分布式數(shù)據(jù)對象加入、退出分布式組網(wǎng) 03、前提準(zhǔn)備 1、開發(fā)工具:De
    發(fā)表于 12-08 10:01

    分布式系統(tǒng)硬件資源池原理和接入實(shí)踐

    提供更好的服務(wù)體驗(yàn)。 圖 3 鴻蒙硬件資源池支持各類消費(fèi)者場景 2.2 開發(fā)者場景 對于開發(fā)者來說,由于分布式硬件資源池將跨設(shè)備硬件調(diào)用的復(fù)雜度都封裝在了系統(tǒng)底層,跨設(shè)備硬件復(fù)用本地
    發(fā)表于 12-06 10:02

    springclould分布式教程

    Spring Cloud是一個(gè)基于Spring Boot的分布式系統(tǒng)開發(fā)工具,它提供了一系列的分布式系統(tǒng)解決方案,可以幫助開發(fā)者快速構(gòu)建和部署分布式
    的頭像 發(fā)表于 11-16 10:59 ?450次閱讀

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解決方案,用于構(gòu)建分布式系統(tǒng)。它提供了一系列的組件和模塊,可以幫助開發(fā)人員輕松地構(gòu)建可擴(kuò)展、高可用、高性能的
    的頭像 發(fā)表于 11-16 10:58 ?732次閱讀

    HarmonyOS分布式文件系統(tǒng)開發(fā)指導(dǎo)

    上的編輯軟件編輯另外一臺設(shè)備上的文檔。 ● 平板保存的音樂,車載系統(tǒng)直接可見并可播放。 ● 戶外拍攝的照片,回家打開平板直接訪問原設(shè)備拍攝的照片。 hmdfs在分布式總線動態(tài)組網(wǎng)的基礎(chǔ)上,為網(wǎng)絡(luò)上
    發(fā)表于 11-14 17:14