一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - 編程技術(shù) - OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

2022-01-07 22:48鴻蒙社區(qū)droidzxy 編程技術(shù)

OpenHarmony3.0采用了方舟開發(fā)框架arkUI,支持了基于TS擴(kuò)展的聲明式開發(fā)范式eTS,本文使用ets開發(fā)語言,構(gòu)造一個應(yīng)用程序,實現(xiàn)通過上層HAP控制底層LED燈的亮與滅。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

1. 開發(fā)環(huán)境

硬件:Hi3516DV300開發(fā)板

軟件:OpenHarmony3.0系統(tǒng)

工具:DevEco Studio 3.0

2. 功能簡介

OpenHarmony3.0采用了方舟開發(fā)框架arkUI,支持了基于TS擴(kuò)展的聲明式開發(fā)范式eTS,本文使用ets開發(fā)語言,構(gòu)造一個應(yīng)用程序,實現(xiàn)通過上層HAP控制底層LED燈的亮與滅。

3. 實現(xiàn)原理

如果在Android上實現(xiàn),需要通過java調(diào)用jni實現(xiàn)對底層的訪問。但是在OpenHarmony上,HAP采用ets語言開發(fā),沒有發(fā)現(xiàn)嵌入到HAP當(dāng)中的類JNI語言,但是系統(tǒng)也提供了一個訪問底層的機(jī)制,叫做NAPI,不過這部分是在系統(tǒng)層實現(xiàn)的,不隨HAP一起發(fā)布。我們想要實現(xiàn)控制LED燈的功能,是在NAPI部分通過C語言實現(xiàn)的,然后編譯為xxx.z.so動態(tài)庫,它向上層提供了一個控制接口。綠色LED燈對應(yīng)GPIO2_3,計算出編號:2*8+3=19,所以直接控制gpio19下的value值就可以控制LED燈亮滅了。

4. 具體實現(xiàn)

整個功能的實現(xiàn)分為了上層HAP應(yīng)用開發(fā)和底層.z.so庫的開發(fā)兩部分。

4.1 應(yīng)用的開發(fā)

1.在HUAWEI DevEco Studio中,創(chuàng)建一個 [Standard]Empty Ability 。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

開發(fā)語言選擇 “eTS”,可以注意到API Version僅支持7,說明是在OpenHarmony3中新支持的,也僅在OpenHarmony3中支持,這些功能實際上都是測試版本,穩(wěn)定了之后就會在HarmonyOS中使用了,但目前還沒有發(fā)布。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

工程創(chuàng)建完畢后,我直接在pages目錄結(jié)構(gòu)下右擊新建了一個ets page,取名led。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

我們頁面的樣式、布局和控制全都在led.ets這個文件里了,不再像js分為css、hml和js三個文件。

Led.ets 文件內(nèi)容

  1. import led from '@ohos.led'
  2. @Entry
  3. @Component
  4. struct Led {
  5. @State private imgpath: string = 'app.media.ledoff'
  6. @State private isShow: boolean= false
  7. build() {
  8. Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
  9. Text('LED 燈控制')
  10. .fontSize(25)
  11. .fontWeight(FontWeight.Bold)
  12. .margin({bottom: 30})
  13. Image($r('app.media.ledoff'))
  14. .objectFit(ImageFit.Contain)
  15. .width(150)
  16. .height(150)
  17. .visibility(this.isShow ? Visibility.None : Visibility.Visible)
  18. Image($r('app.media.ledon'))
  19. .objectFit(ImageFit.Contain)
  20. .width(150)
  21. .height(150)
  22. .visibility(this.isShow ? Visibility.Visible : Visibility.None)
  23. Flex({ alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceEvenly }) {
  24. Button('關(guān)閉', { type: ButtonType.Capsule, stateEffect: true }).backgroundColor(0x317aff).width(150).height(50).backgroundColor("#aaaaaa")
  25. .onClick((event: ClickEvent) => {
  26. this.isShow = false
  27. led.switchLed(19, 0);
  28. })
  29. Button('打開', { type: ButtonType.Capsule, stateEffect: true }).backgroundColor(0x317aff).width(150).height(50)
  30. .onClick((event: ClickEvent) => {
  31. this.isShow = true
  32. led.switchLed(19, 1);
  33. })
  34. }.width("100%")
  35. .margin({ top: 50 })
  36. }
  37. .width('100%')
  38. .height('100%')
  39. .padding(10)
  40. }
  41. }

放了兩個圖片,表示LED燈狀態(tài)的,放在了代碼的entry\src\main\resources\phone\media目錄。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

導(dǎo)入的ohos.led 庫,是自己添加的NAPI層的動態(tài)庫,后面會繼續(xù)介紹。

在config.json文件中,記得把led.ets放到j(luò)s部分pages數(shù)組的第一位,因為它是要顯示的首頁面。

代碼中使用了兩個Button組件,一個打開,一個關(guān)閉,因為在ets中還沒有類似js中的switch的組件,頁面中有兩個image組件,分別顯示打開和關(guān)閉的圖像,通過設(shè)置visibility屬性來切換狀態(tài),本來想通過動態(tài)設(shè)置image的源來改變圖像內(nèi)容,但沒找到有效的方法,應(yīng)該是支持的,只是自己還沒了解怎么用。

編譯前記得一定要設(shè)置簽名,否則編譯出來的程序無法安裝。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

最后可以編譯程序了,

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

生成的最終HAP在 build\outputs\hap\debug\phone\entry-debug-standard-ark-signed.hap

4.2 動態(tài)庫的開發(fā)

動態(tài)庫需要在OpenHarmony源碼中添加和編譯,本文使用的是OpenHarmony3.0源碼,在foundation/ace/napi/sample目錄下,復(fù)制一份native_module_demo,重命名為native_module_led,里面的文件也相應(yīng)的修改名字,注意文件里調(diào)用也相應(yīng)的修改成正確的名字,否則編譯會報錯。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

主要修改的文件有,

foundation/ace/napi/sample/native_module_led/BUILD.gn

foundation/ace/napi/sample/native_module_led/native_module_led.cpp

foundation/ace/napi/BUILD.gn

目錄native_module_led下BUILD.gn文件:

  1. import("http://build/ohos.gni")
  2. ohos_shared_library("led") {
  3. include_dirs = [
  4. "http://third_party/node/src",
  5. "http://foundation/ace/napi/interfaces/kits",
  6. ]
  7. sources = [
  8. "led_javascript_class.cpp",
  9. "native_module_led.cpp",
  10. ]
  11. deps = [ "http://foundation/ace/napi:ace_napi" ]
  12. relative_install_dir = "module"
  13. external_deps = [ "hiviewdfx_hilog_native:libhilog" ]
  14. subsystem_name = "ace"
  15. part_name = "napi"
  16. }

目錄native_module_led下native_module_led.cpp文件修改部分摘要:

包含的頭文件和宏定義,

  1. #include // standard library 標(biāo)準(zhǔn)庫函數(shù)頭文件
  2. #include // standard input output 標(biāo)準(zhǔn)輸入輸出函數(shù)
  3. #include // 定義了擴(kuò)展的整數(shù)類型和宏
  4. #include // POSIX 系統(tǒng) API 訪問功能的頭文件
  5. #include // unix標(biāo)準(zhǔn)中通用的頭文件 define O_WRONLY and O_RDONLY
  6. // #include
  7. #define GPIO_DIR_IN (char*)"in"
  8. #define GPIO_DIR_OUT (char*)"out"
  9. #define GPIO_VAL_LOW 0
  10. #define GPIO_VAL_HIGH 1

添加函數(shù)SwitchLed的具體實現(xiàn),

  1. static napi_value SwitchLed(napi_env env, napi_callback_info info)
  2. {
  3. HILOG_INFO("hey, SwitchLed - 0");
  4. size_t requireArgc = 2;
  5. size_t argc = 2;
  6. napi_value args[2] = { nullptr };
  7. NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
  8. NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments");
  9. napi_valuetype valuetype0;
  10. NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0));
  11. napi_valuetype valuetype1;
  12. NAPI_CALL(env, napi_typeof(env, args[1], &valuetype1));
  13. NAPI_ASSERT(env, valuetype0 == napi_number && valuetype1 == napi_number, "Wrong argument type. Numbers expected.");
  14. uint32_t gpio;
  15. NAPI_CALL(env, napi_get_value_uint32(env, args[0], &gpio));
  16. uint32_t val;
  17. NAPI_CALL(env, napi_get_value_uint32(env, args[1], &val));
  18. char direction[100] = {0};
  19. sprintf(direction,"echo out > /sys/class/gpio/gpio%d/direction", gpio);
  20. system(direction);
  21. char value[100] = {0};
  22. sprintf(value,"echo %d > /sys/class/gpio/gpio%d/value", val, gpio);
  23. system(value);
  24. napi_value sum;
  25. NAPI_CALL(env, napi_create_double(env, 1.0f, &sum));
  26. return sum;
  27. }

初始化部分,

  1. EXTERN_C_START
  2. /*
  3. * function for module exports
  4. */
  5. static napi_value Init(napi_env env, napi_value exports)
  6. {
  7. /*
  8. * Properties define
  9. */
  10. napi_property_descriptor desc[] = {
  11. DECLARE_NAPI_FUNCTION("add", Add),
  12. DECLARE_NAPI_FUNCTION("minus", Minus),
  13. DECLARE_NAPI_FUNCTION("switchLed", SwitchLed),
  14. DECLARE_NAPI_FUNCTION("TestPromise", TestPromise),
  15. DECLARE_NAPI_FUNCTION("TestPromiseOrAsyncCallback", TestPromiseOrAsyncCallback),
  16. };
  17. NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
  18. DemoJavascriptClassInit(env, exports);
  19. return exports;
  20. }
  21. EXTERN_C_END

模塊定義及注冊,

  1. /*
  2. * Module define
  3. */
  4. static napi_module ledModule = {
  5. .nm_version = 1,
  6. .nm_flags = 0,
  7. .nm_filename = nullptr,
  8. .nm_register_func = Init,
  9. .nm_modname = "led",
  10. .nm_priv = ((void*)0),
  11. .reserved = { 0 },
  12. };
  13. /*
  14. * Module register function
  15. */
  16. extern "C" __attribute__((constructor)) void RegisterModule(void)
  17. {
  18. napi_module_register(&ledModule);
  19. }

目錄napi下BUILD.gn文件,

  1. group("napi_packages_test") {
  2. testonly = true
  3. deps = [
  4. "sample/native_module_demo:demo",
  5. "sample/native_module_netserver:netserver",
  6. "sample/native_module_storage:storage",
  7. "test/unittest:unittest",
  8. "sample/native_module_led:led",
  9. ]
  10. if (is_standard_system) {
  11. deps += [ "sample/native_module_ability:ability" ]
  12. }
  13. }

最后在源碼根目錄下執(zhí)行編譯命令,

  1. $./build.sh --product-name Hi3516DV300 --build-target make_test

生成的文件為:

  1. out/ohos-arm-release/ace/napi/libled.z.so

5. 系統(tǒng)設(shè)置

需要授予應(yīng)用訪問gpio下export文件的權(quán)限,

device/hisilicon/hi3516dv300/build/rootfs/init.Hi3516DV300.cfg

  1. "name" : "boot",
  2. "cmds" : [
  3. "write /sys/class/gpio/export 19",
  4. "chmod 777 /sys/class/gpio/gpio19/direction",
  5. "chmod 777 /sys/class/gpio/gpio19/value",

6. 系統(tǒng)部署

6.1 拷貝動態(tài)庫

生成的.z.so動態(tài)庫已經(jīng)拷貝到PC上E:\libled.z.so

PC串口控制臺:

  1. #mount -o remount,rw /

PC命令窗口cmd:

  1. E:>hdc_std file send E:\libled.z.so /system/lib/module/

PC串口控制臺:

  1. #chmod 666 /system/lib/module/libled.z.so

6.2 安裝應(yīng)用

PC命令窗口cmd:

  1. E:>hdc_std install E:\Projects\HarmonyProject\MyLed\build\outputs\hap\debug\phone\entry-debug-standard-ark-signed.hap

7. 應(yīng)用測試

點擊打開按鈕,LED圖標(biāo)變綠,同時LED燈亮,

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

點擊關(guān)閉按鈕,LED圖標(biāo)變灰,同時LED燈滅。

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

8. 動圖展示

OpenHarmony3.0上采用ets開發(fā)HAP控制LED燈

原文鏈接:https://harmonyos.51cto.com

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人影院观看 | 日本一区二区视频在线观看 | 满城尽带黄金甲大胸片 | spank日本网站脱裤子打屁股 | 国产免费色视频 | 精品一久久香蕉国产线看播放 | 久久电影午夜 | 18国产精品白浆在线观看免费 | 精品亚洲一区二区三区在线播放 | 国产suv精品一区二区四区三区 | 午夜欧美精品久久久久久久久 | 91免费高清视频 | kayden·kross hd在线 | 亚洲性69影视| 福利社在线免费观看 | 超强台风免费观看完整版视频 | 92精品国产成人观看免费 | 日本高清视频在线的 | 垫底辣妹免费观看完整版 | 国产成人精品1024在线 | 国产成人亚洲综合a∨婷婷 国产成人亚洲精品乱码在线观看 | 国产精品久久久久久影视 | 99久久99久久免费精品蜜桃 | 91亚洲精品第一综合不卡播放 | 91精品婷婷国产综合久久8 | 国产精视频 | 99国产精品 | 亚洲毛片免费看 | 亚洲欧美在线观看一区二区 | 免费视频左左视频 | 国产成人亚洲精品91专区高清 | 香蕉91视频 | 好男人好资源在线观看 | 校花小雪灌满了男人们的浓浆 | 九草视频在线 | www.91麻豆 | 日本b站一卡二不卡三卡四卡 | 日本精工厂网址 | 亚洲青草视频 | 亚拍一区| a级情欲片在线观看hd |