鸿蒙开发(NEXT/API 12)【硬件(外设扩展驱动客户端开发)】驱动开发服务

news2024/9/27 15:55:25

Driver Development Kit(驱动开发套件)为外设驱动开发者提供高效、安全、丰富的外设扩展驱动开发解决方案C-API,支持外设驱动开发者为消费者带来外设即插即用的极致体验。

  1. 支持开发者开发外设配件的高阶功能,满足消费者高阶使用场景诉求。
  2. 扩展驱动框架支持外设扩展驱动生命周期管理,面向扩展设备应用提供扩展外设查询绑定能力接口。

使用场景

支持开发者高效、安全开发专业外设或外设扩展增强能力:

  1. 面向专业专用办公外设驱动开发场景。

    例如:银行柜台、企业办公、医疗检测等领域专业专用外设,如:高拍仪、身份证扫描仪、指纹识别仪、血氧血糖监测设备。

  2. 面向非标外设扩展增强能力开放场景。

    例如:厂商私有非标HID外设增强能力开放场景,如:手写板快捷键定制、压感/绘图区域设置、扩展增强能力设置、鼠标灯光效果设置、鼠标扩展按键定制、DPI及X/Y轴等高阶能力设置。

框架原理

HDF扩展驱动框架为外设扩展驱动开发,提供稳定统一的外设驱动开发接口,支撑用户态外设扩展驱动开发者基于DDK能力开发用户态外设扩展驱动。

扩展外设管理服务作为用户态扩展外设管理的核心服务,实现对扩展外设和外设扩展驱动的生命周期管理,同时面向扩展设备应用开发提供标准ArkTS API接口,支持扩展外设查询、绑定及解绑能力接口。

图1 扩展外设驱动原理图

1

模块功能

  • 扩展外设应用:查询驱动并绑定驱动,自定义驱动与设备之间的通信方式以及数据处理方式等,即[外设扩展驱动客户端] 。
  • 外设扩展驱动(应用):基于DDK能力开发的专业专用外设扩展驱动或外设扩展增强驱动,即[外设扩展驱动服务端] 。
  • 扩展外设管理服务(Driver Extension SA):扩展设备管理,驱动包全生命周期管理等。
  • AMS :用于拉起和关闭扩展驱动能力DriverExtensionAbility。

流程说明

用户插入外设时,外设与驱动的匹配流程如图2所示。

图2 扩展外设及外设扩展驱动匹配时序图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用户使用扩展外设应用时,扩展外设驱动客户端与外设扩展驱动的绑定流程如图3所示。

图3 外设扩展驱动客户端与外设扩展驱动绑定时序图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外设扩展驱动客户端开发指导

场景介绍

扩展外设主要是指通过物理接口连入主设备的配件设备,如手写板、打印机和扫描仪等。应用通过扩展外设管理能力可以查询绑定扩展外设,从而使用扩展外设驱动提供的定制能力来使用扩展外设,如打印机的配套软件。

扩展外设管理能力支持所有可移植HarmonyOS系统的设备使用。

环境搭建

开发工具及配置

DevEco Studio是驱动开发工具,进行驱动开发必备条件之一,我们可以使用该工具进行开发、调试、打包等操作。

请[下载安装] 该工具,并参考[DevEco Studio使用指南] 中的[创建工程及运行] 进行基本的操作验证,保证DevEco Studio可正常运行。

SDK版本配置

扩展外设管理提供的ArkTs接口,所需SDK版本为API10及以上版本才可使用。

HDC配置

HDC(HarmonyOS Device Connector)是为开发人员提供的用于调试的命令行工具,通过该工具可以在Windows/Linux/Mac系统上与真实设备或者模拟器进行交互 。

注意: “配置环境变量hdc_server_port”和“全局环境变量”为必须操作。

开发设备

  • 当前开发调试及验证,以RK3568作为开发设备进行说明。关于RK3568的编译、烧录操作等方法 。
  • 开发客户端和驱动时,需要一个外接USB设备进行调试,当前仅支持USB总线的外接设备
  • 需要知道外接USB设备的ProductId和VendorId,用于定义驱动以及IPC通信。

接口说明

扩展外设管理基本能力如下 。

表1 扩展外设管理基本能力接口

接口名描述
queryDevices(busType?: number): Array<Readonly>查询扩展外设列表。
bindDevice(deviceId: number, onDisconnect: AsyncCallback, callback: AsyncCallback<{deviceId: number; remote: rpc.IRemoteObject;}>): void绑定设备,绑定成功后返回设备驱动的IRemoteObject通信对象,通过该对象与设备驱动进行交互。
bindDevice(deviceId: number, onDisconnect: AsyncCallback): Promise<{deviceId: number; remote: rpc.IRemoteObject;}>绑定设备的Promise形式。
bindDeviceDriver(deviceId: number, onDisconnect: AsyncCallback, callback: AsyncCallback>RemoteDeviceDriver>): void;绑定设备,API11开始支持。
bindDeviceDriver(deviceId: number, onDisconnect: AsyncCallback): Promise;绑定设备的Promise形式,API11开始支持。
unbindDevice(deviceId: number, callback: AsyncCallback): void解绑设备。
unbindDevice(deviceId: number): Promise解绑设备的Promise形式。

开发步骤

应用可通过查询绑定扩展外设,从而使用扩展外设的定制驱动能力。

开发示例如下(仅供参考):为开发者提供的示例代码为同时开发客户端和服务端的Demo,并实现IPC通信。

  1. 创建新工程 ,创建一个HarmonyOS工程。

    注意:

    开发驱动客户端,请选择Empty Ability模板。

    开发驱动服务端,请选择Native C++模板。

    同时开发驱动客户端和服务端,请选择Native C++模板。

  2. 在文件中导入相关Kit,并声明想要绑定的USB设备的productId、vendorId以及与驱动通信的Code。

    说明:

    以下示例代码均写在entry/src/main/ets/pages/Index.ets文件中。

import { hilog } from '@kit.PerformanceAnalysisKit';
import { deviceManager } from '@kit.DriverDevelopmentKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { rpc } from '@kit.IPCKit';

const REQUEST_CODE: number = 99; // 自定义通信Code,此处仅供参考
const productId: number = 4258;  // 请声明连接的USB设备的productId
const vendorId: number = 4817;   // 请声明连接的USB设备的vendorId
  1. 定义message变量和远程对象变量,后续与驱动通信使用。

    说明:

    第3步开始,以下接口均在struct Index{}中定义。

@State message: string = 'Hello';
private remote: rpc.IRemoteObject | null = null;
  1. 定义查询设备接口,通过queryDevices获取目标设备ID。
private async queryTargetDeviceId(): Promise<number> {
try {
  const devices: Array<deviceManager.Device> = deviceManager.queryDevices(deviceManager.BusType.USB);
  const index = devices.findIndex((item: deviceManager.Device) => {
    let usbDevice = item as deviceManager.USBDevice;
    // 如果不知道设备productId和vendorId,可以通过该日志查看连接的usb设备的相关信息
    hilog.info(0, 'testTag', `usbDevice.productId = ${usbDevice.productId}, usbDevice.vendorId = ${usbDevice.vendorId}`);
    return usbDevice.productId === productId && usbDevice.vendorId === vendorId;
  });
  if (index < 0) {
    hilog.error(0, 'testTag', 'can not find device');
    return -1;
  }
  return devices[index].deviceId;
} catch (error) {
  hilog.error(0, 'testTag', `queryDevice failed, err: ${JSON.stringify(error)}`);
}
return -1;
}
  1. 定义获取对应驱动远程对象的接口,通过bindDeviceDriver获取远程对象。
private async getDriverRemote(deviceId: number): Promise<rpc.IRemoteObject | null> {
try {
  let remoteDeviceDriver: deviceManager.RemoteDeviceDriver = await deviceManager.bindDeviceDriver(deviceId,
    (err: BusinessError, id: number) => {
    hilog.info(0, 'testTag', `device[${id}] id disconnect, err: ${JSON.stringify(err)}}`);
  });
  return remoteDeviceDriver.remote;
} catch (error) {
  hilog.error(0, 'testTag', `bindDeviceDriver failed, err: ${JSON.stringify(error)}`);
}
  return null;
}
  1. 定义与远程对象通信接口,通过sendMessageRequest与远程对象进行IPC通信。
private async communicateWithRemote(): Promise<void> {
  const deviceId: number = await this.queryTargetDeviceId();
  if (deviceId < 0) {
    hilog.error(0, 'testTag', 'can not find target device');
    return;
  }
  this.remote = await this.getDriverRemote(deviceId);
  if (this.remote === null) {
    hilog.error(0, 'testTag', `getDriverRemote failed`);
    return;
  }

  let option = new rpc.MessageOption();
  let data = new rpc.MessageSequence();
  let reply = new rpc.MessageSequence();

  // 向驱动发送信息"Hello"
  data.writeString(this.message); 

  try {
    await this.remote.sendMessageRequest(REQUEST_CODE, data, reply, option);
    // 获取驱动返回信息"Hello world"
    this.message = reply.readString();
    hilog.info(0, 'testTag', `sendMessageRequest, message: ${this.message}}`);
  } catch (error) {
    hilog.error(0, 'testTag', `sendMessageRequest failed, err: ${JSON.stringify(error)}`);
  }
}
  1. 渲染UI界面。
build() {
  Row() {
    Column() {
      Text(this.message) // 显示"Hello"
        .fontSize(60)
        .fontWeight(FontWeight.Bold)
        .onClick(() => { // 点击"Hello",与远程对象通信,显示"Hello World"
          this.communicateWithRemote();
        })
    }
    .width('100%')
  }
  .height('100%')
}
  1. 接下来进行对应驱动的示例代码开发。

应用签名

注意: 先配置权限,再自动签名。

应用需要配置签名文件才能在设备上运行,并且扩展外设管理客户端开发,需要配置扩展外设的权限:ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER。

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2170397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对&#xff0c;window系统中的换行符与linux对不上&#xff0c;因…

three.js----快速上手,如何用vue在web页面中导入 gltf/glb , fbx , obj 模型

首先去three.js官网下载three.js包,或者在直接在vue项目中 npm install three0.158.0 --save (学three.js需要有一点前端基础,基础掌握不牢的还是从基础开始) 这个0.158.0是版本号,不用纠结选新的还是选旧的,新手先不考虑这些,three.js基本上个把月就会更新一次,选一个不太新…

【CSS】字体文本

color 颜色font-size 大小font-family 字体font-style 样式font-weight 加粗text-decoration 下划线text-shadow 阴影text-transform 大小写变换text-indent 缩进text-align 水平对齐 、vertical-align垂直对齐text-overflow 溢出word-wrap 换行word-break 截断white-space 空白…

Uptime Kuma运维监控服务本地部署结合内网穿透实现远程在线监控

目录 前言 主要功能 一、前期准备 本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。 本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma 三、实现公网查看网站监控 四、使用固定公…

一文看懂英伟达系列显卡特点及性能参数对比

英伟达介绍 英伟达(NVIDIA)是美国一家专业的计算机图形芯片制造商&#xff0c;作为全球领先的GPU生产商&#xff0c;英伟达显卡产品系列涵盖GeForce、Quadro、Tesla、NVS、GRID等消费级、专业级和企业级市场。并被广泛应用于游戏、深度学习、科学计算和图形处理等领域。 NVID…

建筑智能,推动智慧社区发展

建筑智能已经成为现代城市建设的热门词汇。它不仅是提高城市建筑现代化水平的必由之路&#xff0c;也是未来城市智能化的重要标志。其中&#xff0c;智能社区是建筑智能化的重要环节之一。 智能社区是指以信息技术为基础&#xff0c;通过信息技术实现社区设施设备网络化、监管…

JS设计模式之模板方法模式:打破束缚,解密代码复用的精髓

一. 前言 在前端开发中&#xff0c;模板方法模式是一种常用的设计模式&#xff0c;它能够有效地提高代码的复用性和扩展性。在 JavaScript 中&#xff0c;模板方法模式的应用广泛&#xff0c;常被用于组件的生命周期管理、请求封装和拦截器设计、表单验证等多个场景。 本篇文…

数据结构和算法之树形结构(3)

文章出处&#xff1a;数据结构和算法之树形结构(3) 关注码农爱刷题&#xff0c;看更多技术文章&#xff01;&#xff01; 四、平衡二叉树(接前篇) 上一章节讲到为了避免二叉查找树退化成链表后的极度不平衡带来的低效率而衍生出了平衡二叉树&#xff0c;平衡二叉树的严格定义…

CDGA|数据治理:策略与价值的深度融合

在当今这个数据驱动的时代&#xff0c;企业数据治理的重要性日益凸显。数据不仅是企业的核心资产&#xff0c;更是驱动业务决策、优化运营流程、创新产品服务的关键力量。然而&#xff0c;要让数据治理真正发挥价值&#xff0c;企业需要采取一系列策略来确保数据的准确性、完整…

Unity 资源 之 PoseAI 基于肌肉的姿势创作工具

Unity 资源 之 PoseAI 基于肌肉的姿势创作工具 一&#xff0c;前言二&#xff0c;资源包内容三&#xff0c;免费获取资源包 一&#xff0c;前言 Unity 开发者们&#xff0c;今天要为大家介绍一款极具创新性的工具 ——PoseAI。 PoseAI 是一种最先进的基于肌肉的姿势创作工具&…

Flink基本概念和算子使用

基础概念 Flink是一个框架和分布式处理引擎&#xff0c;用于对无界数据流和有界数据流进行有状态计算&#xff0c;它的核心目标是“数据流上的有状态计算”。 有界流和无界流 有界流&#xff1a;具有明确的开始和结束时间&#xff0c;数据量有限。适合使用批处理技术&#xf…

Elasticsearch实战宝典:从日志分析到实时数据监控,全方位解锁搜索与分析的无限可能!

Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;常用于处理大规模数据。它提供了强大的全文搜索、结构化搜索、实时统计分析等功能。以下是一些 Elasticsearch 的实战应用案例。 1. 日志分析系统 Elasticsearch 经常被用于集中式日志管理&#xff08;Centralized…

使用SSE流式输出(Javaweb前后端实战)

目录 一.什么是SSE&#xff1f; 主要特点&#xff1a; 二.SSE的实现过程&#xff1a; 三.SSE的前端实现&#xff1a; 1.创建 EventSource 对象&#xff1a; 2.处理接收到的信息&#xff1a; 3.处理特定事件&#xff1a; 4.处理连接错误问题&#xff1a; 5.关闭连接&am…

网络安全的方方面面

目录 一、网络安全概述二、数据加密三、消息完整性与数字签名四、身份认证五、密钥分发中心(KDC)与证书认证(CA)六、防火墙与入侵检测系统七、网络安全协议八、网络安全攻防 -- 黑客攻击简要流程九、网络安全常用术语 一、网络安全概述 网络安全的基本特征&#xff1a;相对性、…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(上篇:地图拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

基于Java的学生档案管理系统

基于springbootvue实现的学生档案管理系统 &#xff08;源码L文ppt&#xff09;4-065 第4章 系统设计 4.1 总体功能设计 学生档案管理系统的总体功能设计包括学生信息管理、课程管理、教师信息管理、成绩管理和系统配置管理。系统将提供用户友好的界面&#xff0c;支…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开&#xff0c;公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证&#xff08;一&#xff09;CA认证&#xff08;二&#xff09;https &#xff0…

耳夹式耳机哪个牌子好?主流耳夹式耳机推荐,多维度耳夹式耳机测评

耳夹式耳机哪个牌子好&#xff1f;耳机已经逐渐走进了众多消费者的生活&#xff0c;可以非常便捷地满足人们的对声音的需求&#xff0c;无论是在享受音乐还是接听电话方面都非常方便&#xff0c;极大地提升了生活的便利性。然而&#xff0c;随着耳夹式耳机的热度不断攀升&#…

IDEA插件开发入门

前置条件: Java17、Gradle8 1. 安装插件 Plugin DevKit 2. 新建项目 File → New → Project 3. 项目结构 &#x1f4e2; 新建一个XxxAction 4. 插件入口 XxxAction 继承 AnAction &#xff0c;实现 actionPerformed 方法&#xff0c;这是一个插件的入口 5. 插件配置 …

裸辞后勇闯AI领域:我的AGI产品经理之路

2021 年&#xff0c;我开始接触生成式 AI。2023 年 8 月&#xff0c;我按捺不住内心对 AI 技术浪潮的热情&#xff0c;从外企裸辞投身 AI。2023 年&#xff0c;我们团队先后入围由百度和阿里组织的 AGI 黑客马拉松活动&#xff0c;并在阿里第三季 AI 创客松中获得“从 0 到 1 奖…