Openharmony的用户态应用通过HDF框架驱动消息机制实现的通信实例
- 创业
- 2025-08-20 07:42:04

承接上文一个例子了解通过Openharmony的HDF框架实现简易驱动的流程,实现到了test_hdf_newdevice1设备的驱动。应用或服务如何与此设备通过HDF的框架的驱动消息机制,进行通信?
依旧以Openharmony中的V3.1 版本为基座,编写测试代码来进行分析说明。
HDF框架提供统一的驱动消息机制,支持用户应用向内核态驱动发送消息,也支持内核态驱动向用户态应用发送消息。
一、用户态应用测试程序可以通过创建一个应用程序或动态库.so或静态库.a来与内核的驱动程序进行通信。这里简单以一个应用程序为例进行演示。
创建用户态应用测试程序步骤如下:
创建项目:
新建源文件:
添加编译配置:
编译烧录:
1.1 新建源文件test.c通过驱动对外发布服务的名称(test_hdf_newdevice1)获取驱动的服务对象。
// test.c #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <unistd.h> #include <string.h> #include <core/hdf_io_service_if.h> #include "hdf_sbuf.h" #include "osal_time.h" #include "hilog/log.h" ... int main(int arg, char **argv) { struct HdfIoService *serv = HdfIoServiceBind("test_hdf_newdevice1"); if (serv == NULL) { printf("get service fail!\n"); return -1; } return 0; }注册事件监听对象HdfDevEventlistener
// test.c ... #define TEST_WRITE_DATA 1234 static int OnDevEventReceive(struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data) { printf("enter %d, service address is %p, event cmdId is %d\n", __func__, service, id); return 0; } static struct HdfDevEventlistener listener = { .onReceive = OnDevEventReceive } int main(int arg, char **argv) { ... if (HdfDeviceRegisterEventListener(serv, &listener) != 0) { printf("register event listener fail!\n"); } ... }准备写入的数据与读出数据
// test.c ... int main(int arg, char **argv) { ... struct HdfSBuf *data = HdfSbufObtainDefaultSize(); if (data == NULL) { printf("fail to obtain sbuf data!\n"); return -1; } struct HdfSBuf *reply = HdfSbufObtainDefaultSize(); if (reply == NULL) { printf("fail to obtain sbuf reply!\n"); HdfSbufRecycle(data); return -1; } // 写入传入的数据 if (!HdfSbufWriteString(data, "Send Msg to Driver Message!")) { printf("fail to write sbuf!\n"); HdfSbufRecycle(data); HdfSbufRecycle(reply); HdfDeviceUnregisterEventListener(serv, &listener); HdfIoServiceRecycle(serv); return -1; } ... }分发消息
... int main(int arg, char **argv) { ... if (serv->dispatcher->Dispatch(&service->object, TEST_WRITE_DATA, data, reply) != 0) { printf("fail to send service call!\n"); HdfSbufRecycle(data); HdfSbufRecycle(reply); HdfDeviceUnregisterEventListener(serv, &listener); HdfIoServiceRecycle(serv); return -1; } ... }读取驱动返回数据
... int main(int arg, char **argv) { const char *result = HdfSbufReadString(reply); if (result == NULL) { printf("fail to read result from reply!\n"); HdfSbufRecycle(data); HdfSbufRecycle(reply); HdfDeviceUnregisterEventListener(serv, &listener); HdfIoServiceRecycle(serv); return -1; } printf("read result from driver: %s\n", result); HdfSbufRecycle(data); HdfSbufRecycle(reply); HdfDeviceUnregisterEventListener(serv, &listener); HdfIoServiceRecycle(serv); return 0; } ... 1.2 添加编译配置BUILD.gn import("//build/ohos.gni") import("//drivers/adapter/uhdf2/uhdf.gni") ohos_executable("test_hdf_msg") { sources = ["test.c"] include_dirs = [ "//drivers/framework/include", "//drivers/framework/include/utils", "//drivers/adapter/uhdf2/osal/include", "//drivers/framework/include/osal" ] deps = [ "$hdf_uhdf_path/utils:libhdf_utils", ] external_deps = [ "device_driver_framework:libhdf_utils", "hiviewdfx_hilog_native:libhilog", "utils_base:utils" ] } 1.3 编译烧录 ./build.sh --product-name rk3568 # 将生成的执行文件test_hdf_msg通过hdc发送开发板执行 # 上一篇中HdfNewdeviceIoServiceDispatch中接收到信息打印如下 # HdfNewdeviceIoServiceDispatch read data is: Send Msg to Driver Message! # 返回如下信息 # read result from driver: I am driver's reply string! 二、HDF特性HDF驱动加载包括按需加载和按序加载。
按需加载:HDF框架支持驱动在系统启动过程中默认加载,或者在系统启动之后动态加载。
按序加载:HDF框架支持驱动在系统启动的过程中按照驱动的优先级进行加载。
HDF框架可以集中管理驱动服务,开发者可直接通过HDF框架对外提供的能力接口获取驱动相关的服务。
DF框架提供统一的驱动消息机制,支持用户态应用向内核态驱动发送消息,也支持内核态驱动向用户态应用发送消息。
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。
参考资料
gitee /openharmony/docs/blob/master/zh-cn/device-dev/driver/Readme-CN.md
Openharmony的用户态应用通过HDF框架驱动消息机制实现的通信实例由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Openharmony的用户态应用通过HDF框架驱动消息机制实现的通信实例”