当前位置: 首页 > news >正文

Openharmony的用户态应用通过HDF框架驱动消息机制实现的通信实例

承接上文一个例子了解通过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为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。

参考资料

https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/driver/Readme-CN.md

相关文章:

  • 程序员为什么要写技术博客?都在哪些平台呢?
  • OpenStack haproxy Statistics Report统计报告怎么在哪里,haproxy Dashboard怎么打开
  • python GUI(Tkinter)
  • 【自学Python】Python字符串首字母大写
  • Java文档搜索引擎
  • 《小猫猫大课堂》三轮4——自定义类型(位段,枚举,联合)(内含通讯录)
  • JMeter本地环境搭建
  • 测试开发之Django实战示例 第一章 创建博客应用
  • 传感器模组:手机摄像头模组-1亿像素是如何实现的?
  • epoll设计实现
  • Spring整合SpringMvc
  • 【内网安全-隧道搭建】内网穿透_Frp上线、测试
  • 【Linux】冯诺依曼体系与操作系统(OS)概念
  • CUDA的代替选择
  • 数学知识-质数
  • 【linux】进程间通信——管道通信
  • 【内网安全-隧道搭建】内网穿透_Ngrok上线(美版、国版二开)
  • 哈希表的概念(散列表)
  • 【Python小游戏】2023兔年吉祥,祝大家辞旧迎新,前兔无量啦~兔年都在玩的这两款游戏,只有0.1%的人通关,你玩了吗?(内含福利源码)
  • 【计算机程序设计思想与方法】2 什么是计算思维?
  • 德国男中音马蒂亚斯·格内:古典音乐的未来在亚洲
  • 一代油画家的“色彩之诗”:周碧初捐赠艺术展上海举行
  • 非法收受财物2.29亿余元,窦万贵受贿案一审开庭
  • 推动行业健康发展,上海发布医药企业防范商业贿赂案例手册
  • 居然智家:实控人、董事长兼CEO汪林朋被留置、立案,公司经营正常
  • 打捞一条文学传统的暗线