#DAYU200体验官#用NAPI组件打通南向北向的实践--RGB LED 控制器 原创 精华
很荣幸能参与到这次#DAYU200体验官#的活动,感谢51CTO,感谢润和。
本文主要分享如何在DAYU200上使用NAPI打通南向和北向,实现RGB LED 彩灯控制器的过程。
演示视频如链接视频链接
1. 开发环境
此实验的主要开发环境如下:
DevEco Studio版本:DevEco Studio 3.0.0.900
OpenHarmony版本:OpenHarmony 3.1 Release
napi_generator版本:napi_generator_20220319.tar.gz
(本人电脑环境WIN11+WSL2+Ubuntu20.04)
2 南向部分
2.1 移除原来的控制
默认的彩灯是有颜色的,这个是因为在OpenHarmony 3.1 Release版本中battery_manager中有led_service会控制彩灯,不然控制上会有冲突,需要先移除,修改方式如下
在/base/powermgr/battery_manager/bundle.json中删除以下这行
2.2 NAPI 组件的实现
2.2.1 NAPI组件简介
NAPI(Native API)组件是一套对外接口基于Node.js N-API规范开发的原生模块扩展开发框架。
图 1 NAPI组件架构图
使用场景:
NAPI适合封装IO、CPU密集型、OS底层等能力并对外暴露JS接口,通过NAPI可以实现JS与C/C++代码互相访问。我们可以通过NAPI接口构建例如网络通信、串口访问、多媒体解码、传感器数据收集等模块。
详细介绍NAPI组件简介
2.2.2 NAPI框架生成工具简介
NAPI框架代码生成工具(napi_generator),它可以根据用户指定路径下的ts(typescript)接口文件一键生成NAPI框架代码、业务代码框架、GN文件等。在开发JS应用与NAPI间接口时,底层框架开发者无需关注Nodejs语法、C++与JS之间的数据类型转换等上层应用转换逻辑,只关注底层业务逻辑即可,专业的人做专业的事,从而可以大大提高开发效率。目前工具支持可执行文件、VS Code插件、IntelliJ插件三种入口。
工具使用说明
下载链接
目前工具还在持续开发完善中,详细信息查阅NAPI框架代码生成工具版本规划
2.2.3 NAPI接口@ohos.dayuled.d.ts的定义
在 napi_generator 下有@ohos.napitest.d.ts 可以参考
或者安装完DevEco Studio 3.0.0.900且安装SDK找到以下路径,里面有d.ts文件参考
C:\Users\xxx(你的window用户名)\AppData\Local\OpenHarmony\Sdk\ets\3.1.6.5\api
C:\Users\xxx(你的window用户名\AppData\Local\OpenHarmony\Sdk\js\3.1.6.5\api
目前napi_generator 还在持续开发中不确定哪些数据类型能支持,需要自行验证。
本案例定义@ohos.dayuled.d.ts如下
前三函数分别控制RGB灯的开关,最后一个可以同时控制RGB灯的开关
2.2.4 使用 napi_generator 生成框架
napi_generator下载链接
从以上链接可以下载到
我这边验证了使用Linux和Windows可执行程序可以生成框架代码。
使用方法将工具和.d.ts文件及需要import的d.ts文件也放入到待转换的d.ts文件相同的目录下(本案例中没有import其他d.ts文件)。
以下以ubuntu环境介绍,文件放置如以下
生成指令
生成成功后会有success提示,且生成文件如下
详细说明参考NAPI框架生成工具使用说明
2.2.5 NAPI框架生成代码集成到OpenHarmony模块位置
模块目录理论上可以建立在OpenHarmony代码库的任何地方,例如在foundation目录下新建dayuled。在 dayuled 目录下,把之前用可执行文件或者插件转换出来的文件全部拷贝到该目录下。如以下
2.2.6 编译修改点
2.2.6.1 修改build.gn文件
主要修改内容是添加hilog相关依赖、part_name和subsystem_name修改
2.2.6.2 修改ohos.build文件
新建一个文件ohos.build并修改如下,其中module_list选项中的"//foundation/dayuled"指的是 dayuled 目录,":dayuled"指的是上面BUILD.gn中的目标ohos_shared_library(“dayuled”)。
2.2.6.3 增加子系统
在源码/build/subsystem_config.json中增加子系统选项。如下所示:
2.2.6.4 添加功能模块
在产品配置中添加上述子系统的功能模块,编译到产品产出文件中,例如在源码productdefine/common/products/rk3568.json中增加part选项,其中 dayuled 就是上面填的part_name,dayuled_interface 就是上面填的subsystem_name。
以上步骤参考NAPI框架生成代码集成到OpenHarmony的方法
2.2.6.5 修改编译错误
工具还有一些问题需要手动修改下foundation/dayuled/dayuled_middle.cpp才能编译通过
主要修改 以下两点
修改1
number_c_to_js没有用到需要注释相关内容
报错信息
修改方式
修改2因为没有callback所以下相关函数vio->out要移除
报错信息
修改方式
改为
2.2.7 RGB LED控制代码的实现
之前想通过调用"light_if.h"但是一直没有调通,目前是参考/base/powermgr/battery_manager/charger/led/battery_led.cpp 用echo的方式实现。
2.2.7.1 RGB LED指令开关控制方式
实际测试使用以下指令可以控制RGB LED的开关,但是绿色和蓝色是相反的(后面说明如何修改)。
2.2.7.2 在 dayuled.cpp中实现RGB LED 控制代码
主要控制代码如下
2.2.7.3 brightness节点权限的修改
这一步我不确定有没有更好的方式,如果有大佬知道请留言指导,谢谢!
异常log如下,因为没有w权限导致打开文件失败
目前我的解决方式是修改base/startup/init_lite/services/etc/init.cfg中约379行后添加权限修改。
这个位置下方添加
修改RGB LED brightness节点的权限为0666
2.2.7.4 修改绿色LED和蓝色LED控制控制相反问题
此处直接修改kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch中rk3568-toybrick-x0.dtsi以下部分将绿色和蓝色GPIO对调。
2.2.8 编译验证
在做完以上修改后建议执行一次全编译并用烧录整包固件的方式更新,后续调试再使用增量编译方式替换so。具体说明如下
2.2.8.1 全编译验证完整烧录方式
使用hb指令如下
选择rk3568,不是DAYU
需要带-f参数执行全编译
编译成功后拷贝out/rk3568/packages/phone/images目录到window下烧录,具体烧录方式此处不做展开,可以看论坛其他帖子。
2.2.8.2 增量编译替换so验证方式
如果只是修改dayuled文件夹里面的内容可以用这个方式来节省开发时间。具体说明如下
因为之前使用过hb set 选了rk3568此时可以不用重新执行hb set
只需要在保存你要的修改之后执行以下指令
不带参数默认增量编译。
编译成功后会在以下路径生成libdayuled.z.so,目录如下所示
或者
这两个位置的libdayuled.z.so是一样的
将这个libdayuled.z.so拷贝到C:\Users\XXX(你的用户名)\AppData\Local\OpenHarmony\Sdk\toolchains\3.1.6.5(这个路径是DevEco Studio 3.0.0.900 SDK 安装路径)或者你放hdc_std工具的路径,
将OTG数据线与开发板相连并执行以下操作
在C:\Users\XXX(你的用户名)\AppData\Local\OpenHarmony\Sdk\toolchains\3.1.6.5输入CMD,执行以下指令即可替换so
“hdc_std file send libdayuled.z.so /system/lib/module/”,这条指令的意思是将电脑上当前目录下的libdayuled.z.so拷贝到 DAYU200开发板/system/lib/module/目录下
具体操作图片见GIF
以上南向部分代码修改整理在附件ohos310_dayuled_napi.zip 中。
3 北向部分
要点是要将@ohos.dayuled.d.ts手动放到C:\Users\xxx(你的用户名)\AppData\Local\OpenHarmony\Sdk\ets\3.1.6.5\api路径下,这样打包的时候才不会报错。
3.1 将@ohos.dayuled.d.ts手动放到api下
在没有放@ohos.dayuled.d.ts的情况下去import dayuled from ‘@ohos.dayuled’;会报“Cannot find module ‘@ohos.dayuled’ or its corresponding type declarations.
”,报错截图如下
将@ohos.dayuled.d.ts手动放到C:\Users\xxx(你的用户名)\AppData\Local\OpenHarmony\Sdk\ets\3.1.6.5\api路径下就可以正常,如果找不到这个sdk路径那可能是你的DevEco Studio版本不是DevEco Studio 3.0.0.900,或者你有修改了Sdk的路径。
放进去后DevEco Studio 3.0.0.900中仍然会提示如下图找不到@ohos.dayuled.d.ts 有error,但是能正常生成HAP,所以这个可以不用管。
3.2 ets主要代码
页面只有简单的文本和四个Toggle的switch预览截图如下
entry/src/main/ets/MainAbility/pages/index.ets主要代码如下,entry完整代码见附件
3.3 签名打包HAP
在OTG连接DAYU200开发板后,使用DevEco Studio 3.0.0.900 的自动签名即可。操作步骤见动图
以上HAP关键代码整理如附件dayulight_hap.zip
4 HAP集成打包
直接将HAP集成到了固件中打包的主要步骤如下。
4.1 拷贝签名后的HAP到applications/standard/hap/下
从应用目录拷贝签名后的hap
即将
拷贝到源码以下路径并重命名为你想要的名称,如Dayulight.hap
4.2 修改applications/standard/hap/BUILD.gn
添加以下内容
修改完成后进行增量编译,重烧image(我编译的image打包如附件DayuLight_images.zip)即可看到包含了DAYU Light这个应用。
5 相关源码
如附件,且已开源至Gitee,点击DAYULIGHT跳转
地址如下:
以上在DAYU200上使用NAPI打通南向和北向,实现RGB LED 彩灯控制器的分享,感谢阅读!
参考链接:
NAPI组件简介
napi_generator工具使用说明
NAPI框架生成代码集成到OpenHarmony的方法
感谢大佬整理总结!
厉害厉害
感谢回复支持
石工也很厉害
好文好文,原来是这么封装的
感谢大佬的分享,受益匪浅~
感谢帮忙验证,期待你也分享自己的成功案例。