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

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

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

Harmony軟總線的簡(jiǎn)單使用

HiHope社區(qū)官方號(hào) ? 2022-04-11 15:31 ? 次閱讀

軟總線是什么?

分布式軟總線是手機(jī)、平板、智能穿戴、智慧屏、車機(jī)等分布式設(shè)備的通信基座,為設(shè)備之間的互聯(lián)互通提供了統(tǒng)一的分布式通信能力。

本篇講到的知識(shí)點(diǎn):

  • 啟動(dòng)遠(yuǎn)程FA(Feature Ability)
  • 連接遠(yuǎn)程PA(Particle Ability),發(fā)送控制命令&遠(yuǎn)端處理數(shù)據(jù)(場(chǎng)景1:傳遞加法數(shù)據(jù),遠(yuǎn)端計(jì)算后返回給客戶端。場(chǎng)景2:傳遞數(shù)據(jù),遠(yuǎn)端Service接收后更新遠(yuǎn)端的UI。)
  • FA跨設(shè)備遷移(可回遷)
  • 混合打包
  • 其他奇怪的知識(shí)

技術(shù)要求和環(huán)境要求:

  • 基本組件熟練使用,ServiceAbility,CommonEventManager(公共事件開(kāi)發(fā))
  • 兩臺(tái)HarmonyOS 2.0的真機(jī) 或 DevEco Studio 2.2 Beta1(分布式模擬器的自動(dòng)開(kāi)啟,可同時(shí)模擬運(yùn)行兩臺(tái)設(shè)備,且自動(dòng)組網(wǎng))。

獲取DevEco Studio 2.2 Beta1(HUAWEI DevEco Studio - HarmonyOS應(yīng)用開(kāi)發(fā)官網(wǎng))

Service Ability(開(kāi)發(fā)-連接Service (harmonyos.com))

公共事件開(kāi)發(fā)指導(dǎo)(開(kāi)發(fā)-公共事件開(kāi)發(fā)指導(dǎo) (harmonyos.com)))

其他

  • 真機(jī)分布式通信要求:同一局域網(wǎng)內(nèi),登錄相同華為賬號(hào),開(kāi)啟藍(lán)牙 (可行方案),這樣在 設(shè)定-超級(jí)終端 附近我的設(shè)備 即可查看到另外一臺(tái)設(shè)備。
  • 分布式模擬器 會(huì)自動(dòng)組網(wǎng),不需要手動(dòng)做其他操作。(設(shè)定的超級(jí)終端中看不出來(lái)已經(jīng)組網(wǎng)成功)
  • 運(yùn)行到真機(jī)上需要進(jìn)行簽名,模擬器則不需要。

代碼下載

gitee HarmonySoftBusHarmonySoftBus: Harmony軟總線的第一次嘗試,入門使用。 (gitee.com))

github HarmonySoftBusGitHub - cl18652469346/HarmonySoftBus: SoftBus Demo)

先看下效果

0420086000105867958.20210807174414.53029436266308522659891152675604:50520809063307:2800:39151678AC564CC9F69046ABA08318652F1B95576D4DA5C5580F52DDBCA74273.gif

代碼結(jié)構(gòu)

image.png

  • adapter:DevicesListAdapter,用于向ListContainer控件中填充設(shè)備數(shù)據(jù)。
  • component:SelectDeviceDialog封裝了設(shè)備選擇彈框
  • proxy:定義了連接遠(yuǎn)程和調(diào)用遠(yuǎn)程service(PA)的接口、實(shí)現(xiàn)類以及代理。
  • service:RemoteService為被控制端service,供手機(jī)端遠(yuǎn)程調(diào)用。

申請(qǐng)權(quán)限

在entry\src\main\config.json中申請(qǐng)以下4個(gè)權(quán)限:

  1. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE:用于允許監(jiān)聽(tīng)分布式組網(wǎng)內(nèi)的設(shè)備狀態(tài)變化。
  2. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO:用于允許獲取分布式組網(wǎng)內(nèi)的設(shè)備列表和設(shè)備信息。
  3. ohos.permission.GET_BUNDLE_INFO:用于查詢其他應(yīng)用的信息。
  4. ohos.permission.DISTRIBUTED_DATASYNC:用于允許不同設(shè)備間的數(shù)據(jù)交換。

此外,還需要在實(shí)現(xiàn)Ability的代碼中顯式聲明需要使用多設(shè)備協(xié)同訪問(wèn)的權(quán)限,示例代碼如下:

image.png

獲取組網(wǎng)內(nèi)在線的其他設(shè)備DeviceInfo(Id&Name)

0420086000105867958.20210807114754.59439119649863074192410773684133:50520809063307:2800:7DF9B97018141F509FC36F936E66FEFFC4D2F1F26E7A87D46A7BF827A3ED53BF.png

獲取自身設(shè)備的Id

image.png

啟動(dòng)遠(yuǎn)程FA

image.png

和普通畫面的啟動(dòng)類似,withDeviceId("") 為本地畫面跳轉(zhuǎn)。

跨設(shè)備啟動(dòng)需要攜帶 遠(yuǎn)程設(shè)備的DeviceID,以及設(shè)置 "支持分布式調(diào)度系統(tǒng)中的多設(shè)備啟動(dòng)"Flag。

連接遠(yuǎn)程PA,發(fā)送控制命令&遠(yuǎn)端處理數(shù)據(jù)

第一步: 客戶端創(chuàng)建遠(yuǎn)程連接代理類

public class MyRemoteProxy implements IRemoteBroker {
    /**
     * 遠(yuǎn)端響應(yīng)成功的標(biāo)識(shí)
     */
    public static final int ERR_OK = 0;
    private static final String TAG = MyRemoteProxy.class.getSimpleName();
    private final IRemoteObject remote;
    public MyRemoteProxy(IRemoteObject remote) {
        this.remote = remote;
    }

    @Override
    public IRemoteObject asObject() {
        return remote;
    }
    
    // 攜帶數(shù)據(jù)向遠(yuǎn)端Sevice發(fā)送請(qǐng)求
    public int senDataToRemote(int requestType, Map paramMap) {
        MessageParcel data = MessageParcel.obtain();
        MessageParcel reply = MessageParcel.obtain();
        MessageOption option = new MessageOption(MessageOption.TF_SYNC);
        int ec = 1;
        int result = -1;
        try {
            if (paramMap.get("inputString") instanceof String) {
                String inputString = (String) paramMap.get("inputString");
                data.writeInt(requestType);
                data.writeString(inputString);
                remote.sendRequest(requestType, data, reply, option);
            }
            ec = reply.readInt();
            if (ec != ERR_OK) {
                LogUtils.error(TAG, "RemoteException:");
            } else {
                if (requestType == ConnectManagerIml.REQUEST_PLUS) {
                    result = reply.readInt();   // 返回成功后拿到遠(yuǎn)端計(jì)算的結(jié)果。
                }
            }
        } catch (RemoteException e) {
            LogUtils.error(TAG, "RemoteException:");
        } finally {
            ec = ERR_OK;
            if (result != -1) {
                ec = result;
            }
            data.reclaim();
            reply.reclaim();
        }
        return ec;
    }
}

  • 實(shí)現(xiàn)IRemoteBroker接口,asObject返回遠(yuǎn)程RemoteObject對(duì)象
  • 創(chuàng)建構(gòu)造方法(參數(shù)為connectAbility成功時(shí)回調(diào)方法onAbilityConnectDone中的遠(yuǎn)程操作對(duì)象)
  • 封裝向遠(yuǎn)端發(fā)送請(qǐng)求的方法,便于后續(xù)進(jìn)行控制 (本例中是簡(jiǎn)單的加法請(qǐng)求)

image.png

MessageOption.TF_SYNC代表同步,意味著會(huì)在sendRequest時(shí)阻塞等待來(lái)自遠(yuǎn)端Service的返回。

遠(yuǎn)端Service返回值是 reply,reply.readInt() 默認(rèn)會(huì)返回0,代表請(qǐng)求成功。若是想攜帶其他返回值,需要在遠(yuǎn)端Service中進(jìn)行處理,下一步會(huì)講到。

第二步: 遠(yuǎn)端Service中,創(chuàng)建RemoteObject并處理請(qǐng)求

public class MyRemote extends RemoteObject implements IRemoteBroker {
    private MyRemote() {
        super("===MyService_Remote");
    }
    @Override
    public IRemoteObject asObject() {
        return this;
    }
    @Override
    public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
        LogUtils.info(TAG, "===onRemoteRequest......");
        int requestType = data.readInt();
        String inputString = "";
        if (code == REQUEST_SEND_DATA) {
            inputString = data.readString();
            publishInput(requestType, inputString);
        } else if (code == REQUEST_PLUS) {
            int a = data.readInt();
            int b = data.readInt();
            reply.writeInt(ERR_OK);
            reply.writeInt(a + b);
            publishPlusResult(requestType, String.valueOf(a + b));
        }
        return true;
    }
}@Override
protected IRemoteObject onConnect(Intent intent) {
    super.onConnect(intent);
    return remote.asObject();
}

onRemoteRequest 接收來(lái)自 sendRequest(requestType, data, reply, option); 傳遞過(guò)來(lái)的請(qǐng)求類型,數(shù)據(jù),返回值,請(qǐng)求類型。

一般不需要處理reply,客戶端reply.readInt() 也會(huì)拿到0(表示請(qǐng)求成功),若是需要在遠(yuǎn)端接收到請(qǐng)求后,需要額外返回?cái)?shù)據(jù)給客戶端,則需要進(jìn)行write操作。

第三步: 連接遠(yuǎn)端Service

image.png

重點(diǎn)都標(biāo)記了下,這塊沒(méi)啥好講的,ServiceAbility的基本連接操作。

第四步: 發(fā)送命令,遠(yuǎn)端Service處理數(shù)據(jù)(返回?cái)?shù)據(jù)、更新UI)

場(chǎng)景1:傳遞加法數(shù)據(jù),遠(yuǎn)端計(jì)算后返回給客戶端

image.png

場(chǎng)景2:傳遞數(shù)據(jù),遠(yuǎn)端Service接收后更新遠(yuǎn)端的UI

image.png

遠(yuǎn)端Service在onRemoteRequest中處理更新UI的請(qǐng)求,遠(yuǎn)端利用公共事件,進(jìn)行UI的更新。(意味著也就可以 控制音樂(lè)的播放,暫停 等等)

image.png

FA跨設(shè)備遷移(可回遷)

跨端遷移開(kāi)發(fā)指導(dǎo)專題-跨端遷移開(kāi)發(fā)指導(dǎo) (harmonyos.com)) 目的: 實(shí)現(xiàn)正在編輯的頁(yè)面,流轉(zhuǎn)的另外一臺(tái)設(shè)備,利用分布式的能力提高用戶的體驗(yàn)。

步驟一

想要遷移的Ability以及其下所有的AbilitySlice都必須需要實(shí)現(xiàn)一個(gè)接口:IAbilityContinuation

坑點(diǎn)1:哪怕你知識(shí)想將Ability其中一個(gè)Slice進(jìn)行遷移,也必須將Ability的所有的slice都要實(shí)現(xiàn)該接口

image.png

onStartContinuationFA請(qǐng)求遷移后,系統(tǒng)首先回調(diào)此方法,開(kāi)發(fā)者可以在此回調(diào)中決策當(dāng)前是否可以執(zhí)行遷移,比如,彈框讓用戶確認(rèn)是否開(kāi)始遷移。

onSaveData(IntentParams saveData)如果onStartContinuation()返回true,則系統(tǒng)回調(diào)此方法,開(kāi)發(fā)者在此回調(diào)中保存必須傳遞到目標(biāo)端設(shè)備上,用于恢復(fù)FA狀態(tài)的數(shù)據(jù)。

onRestoreData(IntentParams restoreData)發(fā)起端設(shè)備上FA完成保存數(shù)據(jù)后,系統(tǒng)在目標(biāo)端設(shè)備上回調(diào)此方法,開(kāi)發(fā)者在此回調(diào)中接受用于恢復(fù)FA狀態(tài)的數(shù)據(jù)。

onCompleteContinuation(int result) 目標(biāo)端設(shè)備上恢復(fù)數(shù)據(jù)一旦完成,系統(tǒng)就會(huì)在發(fā)起端設(shè)備上回調(diào)FA的此方法,以便通知應(yīng)用遷移流程已結(jié)束。

坑點(diǎn)2: 不要忘記 return true; Ability中也要。

坑點(diǎn)3: onRestoreData進(jìn)行UI的恢復(fù)時(shí),需要切換到UI線程,否則...(沒(méi)報(bào)錯(cuò)Log)

步驟二

可回遷的遷移

image.png

回遷(若是已經(jīng)回遷了,再進(jìn)行回遷,會(huì)報(bào)錯(cuò)。 先try-catch了)

image.png

混合打包

目前OpenHarmony上的應(yīng)用有以下三種

  • 直接運(yùn)行的 安卓應(yīng)用
  • 使用DevEco Studio編寫的OpenHarmony應(yīng)用
  • 已有開(kāi)發(fā)好的 安卓應(yīng)用,想擁有 OpenHarmony的一些特性,從而進(jìn)行混合打包。apk邏輯無(wú)需變化,即可擁有OpenHarmony特性,例如 服務(wù)卡片(專題-Java卡片開(kāi)發(fā)指導(dǎo) (harmonyos.com)))。

如何進(jìn)行混合打包?

篇幅原因,將會(huì)在另外一篇中詳細(xì)介紹。 請(qǐng)移步: 安卓應(yīng)用如何混合打包擁有OpenHarmony的卡片服務(wù)?(安卓應(yīng)用如何混合打包擁有OpenHarmony特性? (huawei.com)))

奇怪的知識(shí)

針對(duì):分布式數(shù)據(jù)服務(wù)開(kāi)發(fā)指導(dǎo) (開(kāi)發(fā)-分布式數(shù)據(jù)服務(wù)開(kāi)發(fā)指導(dǎo) (harmonyos.com))

設(shè)計(jì)字段:

單版本分布式數(shù)據(jù)庫(kù)的介紹比較簡(jiǎn)單。存儲(chǔ)key-value, value若是復(fù)雜點(diǎn)沒(méi)介紹。若想value中存儲(chǔ)很多其他數(shù)據(jù),可進(jìn)行以下操作。

image.png

以上時(shí)創(chuàng)建單版本分布式數(shù)據(jù)庫(kù)時(shí),設(shè)置Schema對(duì)象,從而設(shè)計(jì)了數(shù)據(jù)庫(kù)中的字段。

數(shù)據(jù)存儲(chǔ):

image.png

存入的時(shí)候,需要以json的格式進(jìn)行寫入。

查詢:

image.png

坑點(diǎn): 下次查詢時(shí),需要query.reset();

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

    關(guān)注

    1

    文章

    858

    瀏覽量

    74439
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    前端總線是屬于什么總線

    前端總線(Front-Side Bus,簡(jiǎn)稱FSB)在計(jì)算機(jī)體系結(jié)構(gòu)中扮演著至關(guān)重要的角色,它屬于系統(tǒng)總線的一種,是連接CPU與主板北橋芯片(或稱為內(nèi)存控制器集線器)之間的高速數(shù)據(jù)通道。以下是對(duì)前端
    的頭像 發(fā)表于 10-10 17:11 ?313次閱讀

    FPGA的IP核使用技巧

    的工作原理、使用方法和限制條件。 參數(shù)化配置 : 如果IP核提供了參數(shù)化配置選項(xiàng),可以根據(jù)項(xiàng)目需求進(jìn)行配置。例如,對(duì)于RAM IP核,可以選擇單端口RAM、簡(jiǎn)單雙端口RAM或真正雙端口RAM等類型
    發(fā)表于 05-27 16:13

    請(qǐng)問(wèn)主控總線和被控總線有什么區(qū)別?

    謝謝,我在看手冊(cè)的時(shí)候看到F4有幾個(gè)主控總線和被控總線,網(wǎng)上查不到比較具體的,我覺(jué)得可能是比較簡(jiǎn)單的概念只是網(wǎng)上一下子查不到,麻煩了。
    發(fā)表于 05-11 06:15

    CAN總線錯(cuò)誤幀及其排查方法簡(jiǎn)單介紹#汽車CAN總線?

    CAN總線汽車電子
    北匯信息POLELINK
    發(fā)布于 :2024年03月15日 14:14:40

    什么是硬開(kāi)關(guān)?什么是開(kāi)關(guān) 硬開(kāi)關(guān)和開(kāi)關(guān)的優(yōu)缺點(diǎn)

    什么是硬開(kāi)關(guān)?什么是開(kāi)關(guān) 硬開(kāi)關(guān)和開(kāi)關(guān)的優(yōu)缺點(diǎn) 硬開(kāi)關(guān)和開(kāi)關(guān)是電力系統(tǒng)中常用的兩種開(kāi)關(guān)方式。它們?cè)诠β蕚鬏敽碗娏刂品矫嬗兄煌奶攸c(diǎn)和應(yīng)用。 硬開(kāi)關(guān)是通過(guò)物理機(jī)械開(kāi)關(guān),以切斷或連接電路,控制
    的頭像 發(fā)表于 02-20 11:43 ?6144次閱讀

    解密路由:打破網(wǎng)絡(luò)傳統(tǒng),輕松定制你的路由體驗(yàn),千度迷你電腦入門級(jí)路由

    1. 基礎(chǔ)概念解釋: 路由,聽(tīng)起來(lái)高大上,實(shí)際上是一種讓網(wǎng)絡(luò)變得更靈活的神奇工具。簡(jiǎn)單來(lái)說(shuō),路由就是通過(guò)一臺(tái)普通電腦,用特定的軟件來(lái)完成路由器的功能。不同于傳統(tǒng)硬件路由器,路由能
    的頭像 發(fā)表于 01-09 11:23 ?908次閱讀
    解密<b class='flag-5'>軟</b>路由:打破網(wǎng)絡(luò)傳統(tǒng),輕松定制你的路由體驗(yàn),千度迷你電腦入門級(jí)<b class='flag-5'>軟</b>路由

    open harmony照明開(kāi)關(guān)應(yīng)用介紹

    最近幾年,智能家居成為了人們?nèi)粘I钪械臒衢T話題。其中,智能照明系統(tǒng)作為智能家居的重要組成部分之一,正在迅速流行起來(lái)。而今天我將為大家詳細(xì)介紹一款智能照明系統(tǒng)中的開(kāi)關(guān)——open harmony照明
    的頭像 發(fā)表于 01-05 17:00 ?1061次閱讀

    什么是APB協(xié)議/總線?APB總線入門

    上一篇文章簡(jiǎn)單講解了什么是AMBA總線,簡(jiǎn)單來(lái)說(shuō),AMBA總線是一系列協(xié)議。定義了適用于不同場(chǎng)景的總線家族。今天我們就來(lái)將AMBA
    的頭像 發(fā)表于 01-02 11:37 ?3209次閱讀
    什么是APB協(xié)議/<b class='flag-5'>總線</b>?APB<b class='flag-5'>總線</b>入門

    CanEasy多場(chǎng)景應(yīng)用,讓汽車總線測(cè)試更簡(jiǎn)單

    CanEasy是一個(gè)基于Windows的總線工具,用于分析和測(cè)試CAN、CAN FD和LIN以及汽車以太網(wǎng)系統(tǒng)。通過(guò)高度自動(dòng)化和簡(jiǎn)單的配置模擬總線流量,CanEasy可用于分析真實(shí)網(wǎng)絡(luò)、模擬虛擬系統(tǒng)
    的頭像 發(fā)表于 12-11 09:46 ?984次閱讀
    CanEasy多場(chǎng)景應(yīng)用,讓汽車<b class='flag-5'>總線</b>測(cè)試更<b class='flag-5'>簡(jiǎn)單</b>

    并行總線和串行總線的區(qū)別

    并行總線和串行總線的區(qū)別? 并行總線和串行總線是計(jì)算機(jī)系統(tǒng)中常見(jiàn)的兩種數(shù)據(jù)傳輸方式,它們有著不同的工作原理和應(yīng)用場(chǎng)景。在這篇文章中,我將詳細(xì)介紹并行
    的頭像 發(fā)表于 12-07 16:45 ?3340次閱讀

    什么是COB封裝?COB封裝特點(diǎn) COB封裝的主要作用是什么?

    什么是COB封裝?COB封裝特點(diǎn) COB封裝的主要作用是什么? COB封裝是一種半封閉式小封裝技術(shù),也是一種常見(jiàn)的電子封裝方式。COB是Chip-on-Board的縮寫,意為芯
    的頭像 發(fā)表于 11-29 16:23 ?1191次閱讀

    高壓功率器件的開(kāi)關(guān)技術(shù) 功率器件的硬開(kāi)關(guān)和開(kāi)關(guān)

    高壓功率器件的開(kāi)關(guān)技術(shù)簡(jiǎn)單的包括硬開(kāi)關(guān)技術(shù)和開(kāi)關(guān)技術(shù)
    的頭像 發(fā)表于 11-24 16:09 ?1799次閱讀
    高壓功率器件的開(kāi)關(guān)技術(shù) 功率器件的硬開(kāi)關(guān)和<b class='flag-5'>軟</b>開(kāi)關(guān)

    開(kāi)關(guān)的基本概念及分類 典型的開(kāi)關(guān)電路介紹

    開(kāi)關(guān)技術(shù)的主要內(nèi)容有:開(kāi)關(guān)的基本概念、開(kāi)關(guān)電路的分類、典型的開(kāi)關(guān)電路、開(kāi)關(guān)技術(shù)新進(jìn)展等。
    的頭像 發(fā)表于 11-22 16:08 ?1703次閱讀
    <b class='flag-5'>軟</b>開(kāi)關(guān)的基本概念及分類 典型的<b class='flag-5'>軟</b>開(kāi)關(guān)電路介紹

    [3.1.1]--PWM開(kāi)關(guān)技術(shù)之基本概念

    PWM開(kāi)關(guān)
    油潑辣子
    發(fā)布于 :2023年11月22日 14:17:50

    你知道什么是LED模組嗎?

    什么是LED模組呢? ? ? ?LED模組是相對(duì)于常規(guī)的LED顯示屏來(lái)說(shuō), 常規(guī)的LED顯示屏使用的硬板的PCB板和硬殼面罩制作而成,沒(méi)有柔韌度。在遇到需要弧度,彎曲的地方時(shí)需要 用切角等特殊
    的頭像 發(fā)表于 11-15 10:57 ?816次閱讀