我在OpenHarmony上開發的第一個應用!

2021-12-30 鴻蒙技術社區

本次將分為上下兩篇講述在搭載 OpenHarmony2.0 的 3516 開發板上開發的第一個 Hap-WIFI,目前 Openharmony2.0 僅支持 JSUI,所以以下內容皆為 JSUI 開發。

源碼碼已上傳至 gitee:

https://gitee.com/panda-coder/open-harmony-apps/tree/master/Wifi

現有不足之處為只能獲取到 WiFi 的 ipv6,獲取不到 ipv4,已提 issue。也是因為這個原因文章才發出,本想去研究 cpp 源碼試著解決問題,奈何能力有限。後續會進一步完善,並加上開啟熱點等功能。

配置 SDK、開發工具等步驟將不再贅述,請參考:《在OpenHarmony2.0 上安裝自己的系統應用》

上篇:下篇:

src
└─main
    ├─js
    │  └─default
    │      ├─common  --- 公共庫
    │      ├─i18n    
    │      ├─images  --- 圖片資源
    │      └─pages   --- 頁面及模塊
    │          ├─index - 主界面
    │          ├─keyboard --- 鍵盤模塊
    │          └─wifiItem --- WiFi列表項模塊
    └─resources
        └─base
            ├─element
            └─media

①index 主界面主界面分為上下兩部分,上部分為控制顯示面板,下部分為 WiFi 列表:

wifi-info 為上部控制面板

wifi-list 為下半部 wifi 列表

dialog 分別為密碼彈出/鍵盤彈窗

②wifi-info

 <div class="wifi-info" style="align-content: center;justify-content: space-between;">
    <!--左側wifi圖片-->
        <div style="justify-content: center;align-items: center;width: 60%;flex-direction: column;">
            <image src="../../images/wifi.png" style="width:100px;height:100px;"></image>
            <text style="color: white;font-size: 30px;margin-top: 6px;">WLAN 2.4GHz</text>
            <text>{{console}}</text>
        </div>
        <divider vertical="true" style="color: white;stroke-width:2px;padding: 30px 0px;"></divider>
        <!--右側WiFi詳情-->
        <div style="justify-content: center; align-items: center;flex-direction: row;width: 100%;">
            <text style="color: white;padding: 10px;margin-left: 10px;width: 80%;text-align: start;">{{state}}</text>
            <switch textoff="關閉" @change="wifiSwitchChanged" texton="開啟" showtext="true" checked="{{ wifiInfo.isActive }}" style="font-size: 20px;text-padding:6px;height: 80px;"></switch>
        </div>
    </div>

所有的 div 布局排版均為 flex 排版。左側為一張 WiFi 圖片,一段文字說明。console 欄位為方便界面調試而使用的欄位,默認為空,為空時不顯示。
<divider> 為分隔線控制項,將左右兩側進行分割右側為一個 <text> 組件顯示狀態信息。
如 WiFi 連接/開啟狀態,該值為 computed 計算值,<switch> 控制項進行控制 WiFi 的開啟關閉。
③wifi-list

<div class="wifi-list">
        <refresh refreshing="{{isSaning}}"  @pulldown="refreshTouched">
            <list if="{{wifiInfo.scanInfo && wifiInfo.scanInfo.length>0}}" >
                <list-item if="{{connectItem && connectItem.ssid}}"  style="margin:0px 6px;padding: 10px 6px;width: 100%;justify-content: center;flex-direction: column;">
                    <wifi-item @my-touched="checkedWifi" style="width: 100%;" value="{{connectItem}}" checked="true"></wifi-item>
                    <divider vertical="false" style="color: #D4D3D3;stroke-width:2px; margin-top: 6px;padding: 10px;"></divider>
                </list-item>
                <list-item for="{{WifiScanList}}" @touchstart="listItemToucheStart" @touchmove="itemMoved" tid="id" style="margin:0px 6px;padding: 10px 6px;width: 100%;justify-content: center;flex-direction: column;" >
                   <wifi-item @my-touched="checkedWifi" style="width: 100%;" value="{{$item}}"></wifi-item>
                   <divider vertical="false" style="color: #D4D3D3;stroke-width:2px; margin-top: 6px;padding: 10px;"></divider>
                </list-item>
            </list>
            <text  style="justify-content: center;width: 100%;color: #959494;text-align: center;" else>當前無可用WIFI,請下拉刷新</text>
        </refresh>
    </div>

WiFi 列表稍微複雜一點,首先通過 <refresh> 組件做了一個下拉功能,下拉時更新 wifi 掃描列表。
其次通過 list 和 list-item 組件配合將通過接口獲取到的 WiFi 對象數組進行顯示。
在顯示的時候優先顯示已連接數據,同時在下面的列表中排除已連接的,list-item 中使用自定義組件 wifi-item,並添加分割線組件進行分隔。
④wifiItem

布局代碼:

<div class="container" @touchend="boxTouchend">
    <div class="box">
        <div class="box-left">
            <text class="{{checked?'isChecked':''}}">{{ssid}}</text>
            <text>{{desc}}</text>
        </div>
        <div class="box-right">
            <image style="width: 80px;height:80px;" src="../../images/wifi-2.png"></image>
        </div>
    </div>
</div>

ischecked 判斷當前是否為選中狀態,加載選中的樣式。
⑤dialog第一個 dialog 為彈出輸入密碼框,第二個 dialog 為加載自定義的鍵盤組件,將在下一節進行講解。

第一個 dialog:

<dialog id="wifi_dialog" cancel="hideInputPassword" style="height: 280px;width:90%;margin-bottom: 50%;border-radius: 3px;">
        <div style="flex-direction: column;padding: 12px;">
            <text style="font-size: 36px;font-weight: bolder;padding: 15px 3px;">{{checkedWifiName}}</text>
            <div>
                <input placeholder="請輸入密碼" @touchend="showKeyBoard" value="{{wifiPassword}}" style="border-radius: 3px;"></input>
            </div>
            <div style="justify-content: center;">
                <button class="btn btn-default" @touchend="connect" >連 接</button>
                <button class="btn btn-primary" @touchend="hideInputPassword">取 消</button>
            </div>
        </div>
    </dialog>

需要注意的是,dialog 下只能有一個根節點。input 類型為了方便,未採用密碼形式,弱需要設為密碼方式,在 input 組件上增加 type=「password」 特性即可,更多類型可參考官方文檔。

WIFI 的官方倉庫地址:

https://gitee.com/openharmony/communication_wifi

找到該倉庫目錄下的  interfaces/kits/jskits/@ohos.wifi.d.ts 文件可以看到對 JS 已提供的 api 接口信息(文件注釋非常詳細,就不再贅述)。
但需要注意的是,開發中引用 wifi api 並非 @ohos.wifi,而是  @ohos.wifi_native_js。
cpp 位置為 interfaces/innerkits/native_cpp/js_napi/wifi_js.cpp:

static napi_value Init(napi_env env, napi_value exports)
{
    napi_property_descriptor desc[] = {
        DECLARE_NAPI_FUNCTION("enableWifi", EnableWifi),
        DECLARE_NAPI_FUNCTION("disableWifi", DisableWifi),
        DECLARE_NAPI_FUNCTION("isWifiActive", IsWifiActive),
        DECLARE_NAPI_FUNCTION("scan", Scan),
        DECLARE_NAPI_FUNCTION("getScanInfos", GetScanInfos),
        DECLARE_NAPI_FUNCTION("addDeviceConfig", AddDeviceConfig),
        DECLARE_NAPI_FUNCTION("connectToNetwork", ConnectToNetwork),
        DECLARE_NAPI_FUNCTION("connectToDevice", ConnectToDevice),
        DECLARE_NAPI_FUNCTION("disConnect", DisConnect),
        DECLARE_NAPI_FUNCTION("getSignalLevel", GetSignalLevel)
    };

    NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc));
    return exports;
}
static napi_module wifiJsModule = {
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = NULL,
    .nm_register_func = Init,
    .nm_modname = "wifi_native_js",
    .nm_priv = ((void *)0),
    .reserved = { 0 }
};

👇點擊關注鴻蒙技術社區👇

了解鴻蒙一手資訊

相關焦點

  • HarmonyOS與OpenHarmony,區別很大!
    我這裡著重從開發角度上講解它們的區別:①開發語言支持HarmonyOS 主要支持 Java 和 JS 來開發應用(當然還有 C 和 C++),而 OpenHarmony 不支持 Java 來開發應用。②SDK 的不同應用開發工具都是統一使用華為的 DevEco Studio,但是使用的 sdk 不同,開發前首先要切換 sdk 配置。雖然 HarmonyOS 和 OpenHarmony 都可以用 js 來開發應用,但是它們的 api 還是有些細微的區別。
  • 在 OpenHarmony 開發板上運行 WasmEdge
    在 OpenHarmony OS 上運行 WasmEdge,能夠改善開發者的開體驗。Why移動與 IoT 設備的特點是資源受限,軟硬體不統一,用戶體驗卻要求很高。設備要能安全,跨平臺地運行第三方開發者提供的軟體應用(例如,應用商店),因而直接原生編譯的軟體應用(Native Client, or NaCl)並不主流。
  • OpenHarmony新手入門必看教程!
    關於系統的特性,這裡不再過多贅述,開發者可以直接在官方 gitee 倉庫中查看。小型系統目前適配了 liteos-a 和 Linux 2 種內核,開發者可以選擇合適的內核進行產品開發。標準系統目前適配了 Linux 內核,開發者可以基於 linux kernel 演進。④系統差異輕量系統、小型系統、標準系統的差異主要體現在子系統支持程度上,本文已列出如下,但是建議讀者直接查看官網,以便獲取最新的特性支持情況。
  • 歡迎參與OpenHarmony HDF驅動技術交流討論
    1)提供標準化的器件驅動模型,開發者無需獨立開發,通過配置即可完成驅動部署。2)提供驅動模型抽象,屏蔽驅動與不同系統組件間的交互,使得驅動更具備通用型。如果需要參與技術交流討論,請使用zulip交流頻道、sig_dirver@openharmony.io 郵件列表或 OpenHarmony HDF 驅動技術交流微信群。
  • OpenHarmony HDF WLAN驅動分析與使用
    從而降低 WLAN 驅動開發的難度,減少 WLAN 驅動移植和開發的工作量。本文主要分析 WLAN 驅動架構的組成和各部件的功能,WLAN 晶片廠商通過本框架如何進行各自驅動的開發,以及如何使用 HAL 接口。
  • OpenHarmony HDF Display驅動模型解析及移植指導
    而且,不同驅動 IC 的驅動代碼差異較大,產品更換驅動 IC,則又需要重新開發對應的器件驅動,造成重複工作。因此,我們嘗試基於 HDF 驅動框架,編寫一套較通用的 Display 器件驅動模型,儘可能降低驅動開發者的開發或移植工作量,簡化器件驅動開發,提升開發效率。
  • 技術| OpenHarmony 2.0 如何移植 RK3399
    repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify repo sync -c repo forall -c 'git lfs pull' Rockchip Linux SDK 下載命令如下:
  • Win10使用WSL搭建OpenHarmony環境
    👆關注鴻蒙技術社區,了解鴻蒙一手資訊👆注意:安裝子系統需要預留 C:盤 30G 左右的空間,這個應用是不支持往其他硬碟移動的用戶信息git config --global user.name "yourname"git config --global user.email "your-email-address"git config --global credential.helper store# repo初始化repo init -u https://gitee.com/openharmony
  • 用鴻蒙開發AI應用(三)軟體篇
    在傳統的單設備系統能力的基礎上,HarmonyOS提出了基於同一套系統能力、適配多種終端形態的分布式理念,能夠支持多種終端設備。2. 技術架構HarmonyOS整體遵從分層設計,從下向上依次為:內核層、系統服務層、框架層和應用層。
  • Harmony聯合創始人AMA:如何理解Harmony?
    蘭榮堅:我先做個簡單介紹吧,我是Harmony的聯合創始人蘭榮堅,之前在Google負責安卓應用商店的搜索基礎設施搭建,也是矽谷ABC區塊鏈社群的早期創始人之一。藍狐筆記:第一個環節,我們先挑選來自藍狐筆記部分讀者的問題:第一個問題,為什麼想要構建Harmony項目?可以分享一下背後的初衷和故事嗎?蘭榮堅:Harmony的項目建立初衷是為下一代去中心化應用和經濟體提供高速、可靠、安全、並且公平的基礎設施。
  • OpenHarmony 2.0 Canary(金絲雀版)來了,自主研發,不兼容安卓
    OpenHarmony 開源項目地址:https://gitee.com/openharmony據悉,OpenHarmony 是由基金會孵化及運營的開源項目,由基金會的 OpenHarmony 項目群工作委員會負責運作,遵循 Apache 2.0 等開源協議,基於開源的方式,搭建一個智能終端設備作業系統的框架和平臺。
  • 手把手教學,Ubuntu 下編譯 OpenHarmony | 開源軟體
  • 樹莓派成功刷入OpenHarmony3.0!
    但是可以和大家分享下我的思路。我的方法比較簡單粗暴,直接使用的樹莓派的樹莓派 linux rpi-5.10.y 內核。https://github.com/raspberrypi/linux然後編譯 OHOS3.0 的文件系統,看缺什麼補什麼大概是這個意思。
  • 使用Python開發OpenHarmony設備程序-I2C應用實例
    《使用Python開發OpenHarmony設備程序(1-GPIO外設控制)》中,已經成功的使用 Python 對 GPIO 上的外設進行了控制。這是非常重要的一個裡程碑:在OpenHarmony上用使用 Python 進行物聯網編程。並且加上 Python 語言天生的優勢(易於掌握,開發效率高),可以通過深入打造,將OpenHarmony上的 Python 進行到底。此內容利用 GPIO 搭配 I2C 對外設進行編程。通過控制「智慧農業」外設板上的傳感器,獲取當前環境的溫度和溼度。
  • 你的第一個Harmony APP
    HarmonyOS現在火熱,已經在華為智慧屏以及手錶上應用了,而且馬上在12月16號也發布手機beta版本了。
  • 我確實不知道harmony是全球首款性愛機器人
    這樣的單細胞轉錄組測序整合算法超級多,我想你應該是不會一一細看的,我就列出來而已:MNNcorrect (https://doi.org/10.1038/nbt.4091)CCA + anchors (Seurat v3) (https://doi.org/10.1101/460147
  • 騰訊雲伺服器搭建鴻蒙Hi3861開發板開發環境
    安裝Hi3861開發板的開發環境可以選擇虛擬機、Docker、 WSL 或者實體Linux系統電腦,這幾種方式都只合適單一的開發環境,像我這樣的上班族,家裡單位各一個電腦,用起來還是不太方便。如果這個開發環境部署在雲端,那豈不是我在哪都可以隨時繼續之前的工作了?
  • 鴻蒙開發環境搭建、源碼下載和編譯
    備註:開發人員可以在Windows工作檯中進行程序開發,或者遠程登錄到Linux伺服器進行程序開發。下載Harmony OS源碼mkdir -p ~/harmonyos/openharmony && cd ~/harmonyos/openharmony
  • 鴻蒙OS開源項目的OpenHarmony
    OpenHarmony在傳統的單設備系統能力的基礎上,創造性地提出了基於同一套系統能力、適配多種終端形態的理念,支持多種終端設備上運行,第一個版本支持128K-128M設備上運行,歡迎參加開源社區一起持續演進。針對設備開發者,OpenHarmony採用了組件化的設計方案,可以根據設備的資源能力和業務特徵進行靈活裁剪,滿足不同形態的終端設備對於作業系統的要求。
  • Harmony and Animoca Brands launch Beast Quest NFT Chest Sale
    TL;DRThe Beast Quest Chest Sale starts Friday, 15 January at 10am Pacific time and ends 29 January 2021 at https://harmony.one/beastquestPlayers can buy and collect official Beast