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

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

场景介绍

[DriverExtensionAbility]是Driver类型的ExtensionAbility组件,提供驱动相关扩展框架能力。对于部分设备,支持插入外接的硬件模块来扩展设备能力, 此时可以以应用方式安装该硬件模块的驱动程序。通过DriverExtensionAbility可实现此类应用的开发。

[DriverExtensionAbility]可以通过DriverExtensionManager被应用绑定,并根据应用的请求信息在后台处理相关事务。

每个类型的ExtensionAbility都有自己的Context,DriverExtensionAbility通过[DriverExtensionContext]提供相关能力。

环境搭建

其中SDK版本配置的要求如下:

NDK接口SDK版本
USB DDKAPI10及以上
HID DDKAPI11及以上

开发步骤

开发者在实现一个驱动时,需要在DevEco Studio工程中手动新建一个DriverExtensionAbility,具体步骤如下。

  1. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为driverextability。

  2. 在driverextability目录,右键选择“New > ArkTS File”,新建一个文件并命名为DriverExtAbility.ets。

  3. 在文件中导入相关Kit,并定义请求Code。

import { DriverExtensionAbility } from '@kit.DriverDevelopmentKit';
import { Want } from '@kit.AbilityKit';
import { rpc } from '@kit.IPCKit';const REQUEST_CODE = 99; // 与扩展外设客户端约定请求码
  1. 打开DriverExtAbility.ets文件,导入[RPC通信模块],重载onRemoteMessageRequest()方法,接收应用传递过来的消息,并将处理的结果返回给应用。REQUEST_VALUE用于校验应用发送的服务请求码。
class StubTest extends rpc.RemoteObject {// 接收应用传递过来的消息处理,以及将处理的结果返回给客户端onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence,option: rpc.MessageOption) {if (code === REQUEST_CODE) {// 接收应用传递过来的数据// 应用使用多次调用data.writeString()写入多个数据时,驱动可以通过多次调用data.readString()方法接收对应的数据let optFir: string = data.readString();// 驱动将数据的处理结果返回给应用// 示例中为接收了"Hello",并将"Hello World"返回给应用reply.writeString(optFir + ` World`);}return true;}
}
  1. 在DriverExtAbility.ets文件中,增加导入[DriverExtensionAbility]的依赖包,该包提供了onInit()、onRelease()、onConnect()和onDisconnect()生命周期回调,自定义类继承[DriverExtensionAbility]并根据需要重写需要的生命周期回调。
export default class DriverExtAbility extends DriverExtensionAbility {onInit(want: Want) {console.info('testTag', `onInit, want: ${want.abilityName}`);}onRelease() {console.info('testTag', `onRelease`);}onConnect(want: Want) {console.info('testTag', `onConnect, want: ${want.abilityName}`);return new StubTest("test");}onDisconnect(want: Want) {console.info('testTag', `onDisconnect, want: ${want.abilityName}`);}onDump(params: Array<string>) {console.info('testTag', `onDump, params:` + JSON.stringify(params));return ['params'];}
}
  1. 在工程Module对应的[module.json5配置文件]中注册DriverExtensionAbility,type标签需要设置为“driver”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。
{"module": {"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "EntryAbility","deviceTypes": ["default","tablet"],"requestPermissions": [{"name": "ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER" // 此处为扩展外设相关权限,必须配置}],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:startIcon","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}],"extensionAbilities": [{"name": "DriverExtAbility","icon": "$media:startIcon","description": "driver","type": "driver","exported": true,"srcEntry": "./ets/driverextability/DriverExtAbility.ets","metadata": [{"name": "bus", // 必填项,所属总线"value": "USB"},{"name": "desc", // 选填项,必要的驱动描述"value": "the sample of driverExtensionAbility"},{"name": "vendor", // 选填项,驱动厂商名称"value": "string"},{"name": "vid", // 支持 USB vendor id 列表,填写16进制,此处为4817的16进制"value": "0x12D1"},{"name": "pid", // 支持的 USB product id 列表,填写16进制,此处为4258的16进制"value": "0x10A2"}]}]}
}
  1. 完成客户端和驱动示例代码开发后,将Hap导入设备中,并点击hap中的Hello,查看是否会转变为Hello world,即实现ipc通信功能。

扩展设备能力

扩展外设管理提供了HID DDK和USB DDK两种能力,用于驱动开发;

应用签名

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

相关文章:

  • 【百日算法计划】:每日一题,见证成长(021)
  • IP地址如何与网络虚拟化技术融合?
  • AQS为什么采用双向链表
  • Linux 块设备开发学习
  • 8个前端小程序开发框架的介绍
  • 【JAVA开源】基于Vue和SpringBoot的足球俱乐部管理后台
  • 记一次停车场后台管理系统漏洞挖掘
  • 让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先
  • 小麦生长状态检测系统源码分享
  • 第十章 【后端】商品分类管理微服务 > 分类列表查询接口(10.8.3)——MyBatis-Plus 逻辑删除
  • Ansible 剧本的执行
  • 设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享
  • 【二十七】【QT开发应用】VS如何复制项目,QT无边窗窗口Pro版本,信号与信号槽的应用,背景图片自适应控件大小
  • 文件上传、amrkdown编辑器
  • 第十章 【后端】商品分类管理微服务 > 分类列表查询接口(10.8.2)——MyBatis-Plus 自动填充
  • hexo+github搭建个人博客
  • 2017年终总结、随想
  • 78. Subsets
  • Android 控件背景颜色处理
  • angular组件开发
  • CAP理论的例子讲解
  • Docker入门(二) - Dockerfile
  • Java-详解HashMap
  • maya建模与骨骼动画快速实现人工鱼
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nodejs调试方法
  • Rancher如何对接Ceph-RBD块存储
  • Travix是如何部署应用程序到Kubernetes上的
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 全栈开发——Linux
  • 如何编写一个可升级的智能合约
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一道闭包题引发的思考
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 移动端高清、多屏适配方案
  • ​渐进式Web应用PWA的未来
  • ​如何在iOS手机上查看应用日志
  • # 数仓建模:如何构建主题宽表模型?
  • # 职场生活之道:善于团结
  • #define用法
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (30)数组元素和与数字和的绝对差
  • (7)摄像机和云台
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)Linux——Linux常用指令
  • (分类)KNN算法- 参数调优
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (数据结构)顺序表的定义
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (原創) 物件導向與老子思想 (OO)