吴忠躺衫网络科技有限公司

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

簡介

現實中多設備間通信方式多種多樣(WIFI、藍牙等),不同的通信方式使用差異大,導致通信問題多;同時還面臨設備間通信鏈路的融合共享和沖突無法處理等挑戰(zhàn)。分布式軟總線實現近場設備間統(tǒng)一的分布式通信管理能力,提供不區(qū)分鏈路的設備間發(fā)現連接、組網和傳輸能力,主要功能如下:

  • 發(fā)現連接:提供基于Wifi、藍牙等通信方式的設備發(fā)現連接能力。
  • 設備組網:提供統(tǒng)一的設備組網和拓撲管理能力,為數據傳輸提供已組網設備信息
  • 數據傳輸:提供數據傳輸通道,支持消息、字節(jié)、流、文件的數據傳輸能力。

業(yè)務方通過使用分布式軟總線提供的API實現設備間的高速通信,不用關心通信細節(jié),進而實現業(yè)務平臺的高效部署與運行能力。

系統(tǒng)架構


圖 1 分布式軟總線組件架構圖

約束

  • 組網設備需在同一局域網中 或者 距離相近的近場設備間。
  • 組網之前,需先完成設備綁定,綁定流程參見安全子系統(tǒng)中說明。
  • 傳輸完成數據收發(fā)之后,業(yè)務要主動關閉會話,釋放資源。

說明

使用說明

須知: 使用跨設備通信時,必須添加權限ohos.permission.DISTRIBUTED_DATASYNCohos.permission.DISTRIBUTED_SOFTBUS_CENTER,該權限類型為 dangerous

設備主動發(fā)現手機時,手機需打開超級終端的允許被“附近設備”發(fā)現開關(設置-超級終端-我的設備-允許被發(fā)現-附近設備),才能被設備發(fā)現。

1、發(fā)現

  • 發(fā)布流程
  1. 上層應用需要對外發(fā)布自身能力時,調用服務發(fā)布接口發(fā)布自身能力。
    // 發(fā)布回調
    typedef struct {
        /** Callback for publish result */
        void (*OnPublishResult)(int publishId, PublishResult reason);
    } IPublishCb;
    
    // 發(fā)布服務
    int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb);
    
  2. 上層應用不再需要對外發(fā)布自身能力時,調用StopPublishLNN接口注銷服務。
    // 注銷服務
    int32_t StopPublishLNN(const char *pkgName, int32_t publishId);
    
  • 發(fā)現流程
  1. 上層應用需要發(fā)現特定能力設備時,調用發(fā)現接口啟動發(fā)現。
    // 發(fā)現回調
    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ā)現服務
    int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb);
    
  2. 當軟總線發(fā)現到設備時,通過回調接口通知業(yè)務所發(fā)現的設備信息。
  3. 上層應用不再需要發(fā)現時,調用StopRefreshLNN接口停止設備發(fā)現。
    // 停止發(fā)現
    int32_t StopRefreshLNN(const char *pkgName, int32_t refreshId);
    

2、組網

  1. 發(fā)起組網請求,攜帶組網連接地址信息,并且提供組網執(zhí)行結果回調函數。
    // 組網連接地址
    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;
    
    // 組網請求執(zhí)行結果回調
    typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode);
    
    // 發(fā)起組網請求
    int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb);
    
  2. 等待組網結果,JoinLNN()返回成功表示軟總線接受了組網請求,組網結果通過回調函數通知業(yè)務;組網回調函數中addr參數內容和JoinLNN()的入參互相匹配;retCode如果為0,表示組網成功,此時networkId為有效值,后續(xù)傳輸、退網等接口均需使用該參數;retCode如果不為0,表示組網失敗,此時networkId為無效值。
  3. 使用傳輸相關接口進行數據傳輸。
  4. 發(fā)送退網請求,攜帶組網成功后返回的networkId,并且提供退網執(zhí)行結果回調。
    // 退網執(zhí)行結果回調
    typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
    
    // 退網請求
    int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
    
  5. 等待退網完成,OnLeaveLNNResult()的networkId和退網請求接口中的networkId互相匹配;retCode為0表示退網成功,否則退網失敗。退網成功后,networkId變?yōu)闊o效值,后續(xù)不應該被繼續(xù)使用。
  6. 使用節(jié)點(即設備)注冊和注銷接口,監(jiān)聽網絡中節(jié)點狀態(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é)點信息
    typedef struct {
        char networkId[NETWORK_ID_BUF_LEN];
        char deviceName[DEVICE_NAME_BUF_LEN];
        uint16_t deviceTypeId;
    } NodeBasicInfo;
    
    // 節(jié)點狀態(tài)事件回調
    typedef struct {
        uint32_t events; // 組網事件掩碼
        void (*onNodeOnline)(NodeBasicInfo *info);   // 節(jié)點上線事件回調
        void (*onNodeOffline)(NodeBasicInfo *info);  // 節(jié)點下線事件回調
        void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 節(jié)點信息變化事件回調
        void (*onNodeStatusChanged)(NodeStatusType type, NodeStatus *status); // 設備運行狀態(tài)變化事件回調
    } INodeStateCb;
    
    //  注冊節(jié)點狀態(tài)事件回調
    int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback);
    
    // 注銷節(jié)點狀態(tài)事件回調
    int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
    

3、傳輸

  1. 創(chuàng)建Socket。
    typedef struct {
        char *name;                 // 本端Socket名稱
        char *peerName;             // 對端Socket名稱
        char *peerNetworkId;        // 對端Socket的網絡ID
        char *pkgName;              // 調用者包名
        TransDataType dataType;     // 傳輸的數據類型,需要與發(fā)送方法一致
    } SocketInfo;
    
    // 創(chuàng)建Socket
    int32_t Socket(SocketInfo info);
    
  2. 服務端啟動監(jiān)聽,客戶端進行綁定。
    // 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;
    
    // 監(jiān)聽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);
    
  3. 通過Socket向對端設備發(fā)送數據。
    // 發(fā)送字節(jié)數據
    int32_t SendBytes(int32_t socket, const void *data, uint32_t len);
    // 發(fā)送消息數據
    int32_t SendMessage(int32_t socket, const void *data, uint32_t len);
    // 發(fā)送流數據# 分布式軟總線組件
    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. 關閉Socket。
    // 關閉Socket
    void Shutdown(int32_t socket);
    

審核編輯 黃宇

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

    關注

    10

    文章

    2903

    瀏覽量

    88399
  • 分布式
    +關注

    關注

    1

    文章

    924

    瀏覽量

    74612
  • 鴻蒙
    +關注

    關注

    57

    文章

    2392

    瀏覽量

    43058
收藏 人收藏

    評論

    相關推薦

    分布式日志追蹤ID實戰(zhàn)

    作者:京東物流 張小龍 本文通過介紹分布式應用下各個場景的全局日志ID透傳思路,以及介紹分布式日志追蹤ID簡單實現原理和實戰(zhàn)效果,從而達到通過提高日志查詢排查問題的效率。 背景 開發(fā)
    的頭像 發(fā)表于 01-20 10:16 ?320次閱讀

    AIGC入門及鴻蒙入門

    JDK、配置SDK等。 3. 開發(fā)實踐: 學習鴻蒙系統(tǒng)的架構和API,了解其組件化、分布式等特性。 通過官方文檔和社區(qū)資源,學習和掌握鴻蒙
    發(fā)表于 01-13 10:32

    HarmonyOS Next 應用元服務開發(fā)-分布式數據對象遷移數據權限與基礎數據

    設備文件訪問實現文件的遷移,難以獲取文件同步完成的時間。為了保證更高的成功率,文件的遷移不建議繼續(xù)通過該方式實現,推薦使用分布式數據對象攜帶資產的方式。開發(fā)者此前通過跨設備文件訪問實現的文件遷移依然生效
    發(fā)表于 12-24 09:40

    名單公布!【書籍評測活動NO.53】鴻蒙操作系統(tǒng)設計原理與架構

    的底層設計邏輯出發(fā),針對不同關鍵子系統(tǒng)的目標功能和實現路徑做實際分析解讀,幫助開發(fā)者理解鴻蒙操作系統(tǒng)的底層邏輯,開發(fā)更適合系統(tǒng)邏輯的架構代碼。 以分布式
    發(fā)表于 12-16 15:10

    鴻蒙開發(fā)管理:ohos.account.distributedAccount 分布式帳號管理

    獲取分布式帳號單實例對象。
    的頭像 發(fā)表于 07-08 10:03 ?306次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>管理:ohos.account.distributedAccount <b class='flag-5'>分布式</b>帳號管理

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

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

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

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

    HarmonyOS開發(fā)實例:【分布式數據服務】

    分布式數據服務(Distributed Data Service,DDS)為應用程序提供不同設備間數據分布式的能力。
    的頭像 發(fā)表于 04-18 10:18 ?795次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>實例:【<b class='flag-5'>分布式</b>數據服務】

    HarmonyOS開發(fā)實例:【分布式新聞客戶端】

    基于柵格布局、設備管理和多端協同,實現一次開發(fā),多端部署的分布式新聞客戶端頁面。
    的頭像 發(fā)表于 04-17 15:57 ?933次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>實例:【<b class='flag-5'>分布式</b>新聞客戶端】

    HarmonyOS開發(fā)實例:【分布式郵件】

    基于TS擴展的聲明開發(fā)范式編程語言編寫的一個分布式郵件系統(tǒng),可以由一臺設備拉起另一臺設備,每次改動郵件內容,都會同步更新兩臺設備的信息
    的頭像 發(fā)表于 04-17 10:29 ?809次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>實例:【<b class='flag-5'>分布式</b>郵件】

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

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

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

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

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

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

    鴻蒙實戰(zhàn)項目開發(fā):【短信服務】

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

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

    態(tài)的終端設備對于操作系統(tǒng)的要求。 技術特性 硬件互助,資源共享 分布式總線 分布式總線是多種
    發(fā)表于 02-21 16:31
    网上百家乐洗码技巧| 百家乐官网真钱斗地主| 百家乐官网园选蒙| 百家乐必胜法技巧| 京城娱乐城| 百家乐官网时时彩网站| 百家乐破解策略| 大发888古怪猴子| 筹码币百家乐官网麻将| 百家乐太阳城球讯网| 疯狂水果机怎么玩| 百家乐官网真钱游戏下载| 百家乐有秘技吗| 亚洲顶级赌场的微博| 线上百家乐官网玩法| 百家乐谋略| 陈巴尔虎旗| 百家乐节目视频| 顶级赌场连环夺宝| 百家乐官网走势图| 名仕百家乐的玩法技巧和规则| 定兴县| 开心8百家乐游戏| 尊爵线上娱乐| 百家乐官网红桌布| 大发888棋牌游戏下载| 百家乐官网开发软件| 百家乐解析| 澳门百家乐官网上下限| 百家乐赌博信息| 百家乐官网登封代理| 百家乐大小桌布| 丹凤县| 至尊百家乐下载| 康定县| 百家乐平台有什么优势| 溧水县| 百家乐视频游戏注册| 麻阳| 百家乐7scs娱乐场| 新2百家乐官网现金网百家乐官网现金网|