1# 开发无UI界面基础驱动 2<!--Kit: Driver Development Kit--> 3<!--Subsystem: Driver--> 4<!--Owner: @lixinsheng2--> 5<!--Designer: @w00373942--> 6<!--Tester: @dong-dongzhen--> 7<!--Adviser: @w_Machine_cc--> 8 9## 场景介绍 10 11无UI界面的基础驱动,适用于不需要通过UI界面设置驱动能力的简单设备,例如鼠标,键盘等,保证设备的即插即用功能即可。开发者可以通过DriverExtensionAbility实现此类应用的开发。 12 13## 基本概念 14 15 - DriverExtensionAbility 16 17 [DriverExtensionAbility](../../reference/apis-driverdevelopment-kit/js-apis-app-ability-driverExtensionAbility.md)是Driver类型的ExtensionAbility组件,提供驱动相关扩展框架能力。对于部分设备,支持插入外接的硬件模块来扩展设备能力, 此时可以以应用方式安装该硬件模块的驱动程序。[DriverExtensionAbility](../../reference/apis-driverdevelopment-kit/js-apis-app-ability-driverExtensionAbility.md)可以通过DriverExtensionManager被应用绑定,并根据应用的请求信息在后台处理相关事务。 18 每个类型的ExtensionAbility都有自己的Context,DriverExtensionAbility通过[DriverExtensionContext](../../reference/apis-driverdevelopment-kit/js-apis-inner-application-driverExtensionContext.md)提供相关能力。 19 20## 环境搭建 21 22请参考[环境准备](environmental-preparation.md)完成开发前的准备工作。 23 24## 开发步骤 25 26开发者在实现一个驱动时,需要在DevEco Studio工程中手动新建一个DriverExtensionAbility,具体步骤如下: 27 281. 创建新工程,请参考[创建一个新的工程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-create-new-project),创建一个OpenHarmony工程。(如果在[开发带UI界面基础驱动](externaldevice-guidelines.md)已经创建,则此处不需要创建。) 29 302. 在新创建的工程对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为driverextability。 31 323. 在driverextability目录,右键选择“New > ArkTS File”,新建一个文件并命名为DriverExtAbility.ets。 33 344. 在文件中导入相关Kit,并定义请求Code。 35 36 ```ts 37 import { DriverExtensionAbility } from '@kit.DriverDevelopmentKit'; 38 import { Want } from '@kit.AbilityKit'; 39 import { rpc } from '@kit.IPCKit'; 40 41 const REQUEST_CODE = 99; // 与扩展外设客户端约定请求码。 42 ``` 43 445. 打开DriverExtAbility.ets文件,导入[RPC通信模块](../../reference/apis-ipc-kit/js-apis-rpc.md),重载onRemoteMessageRequest()方法,接收应用传递过来的消息,并将处理的结果返回给应用。REQUEST_CODE用于校验应用发送的服务请求码。 45 46 ```ts 47 class StubTest extends rpc.RemoteObject { 48 // 接收应用传递过来的消息处理,以及将处理的结果返回给客户端。 49 onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence, 50 option: rpc.MessageOption) { 51 if (code === REQUEST_CODE) { 52 // 接收应用传递过来的数据。 53 // 应用使用多次调用data.writeString()写入多个数据时,驱动可以通过多次调用data.readString()方法接收对应的数据。 54 let optFir: string = data.readString(); 55 // 驱动将数据的处理结果返回给应用。 56 // 示例中为接收了"Hello",并将"Hello World"返回给应用。 57 reply.writeString(optFir + ` World`); 58 } 59 return true; 60 } 61 } 62 ``` 63 646. 在DriverExtAbility.ets文件中,增加导入[DriverExtensionAbility](../../reference/apis-driverdevelopment-kit/js-apis-app-ability-driverExtensionAbility.md)的依赖包,该包提供了onInit()、onRelease()、onConnect()和onDisconnect()生命周期回调,自定义类继承[DriverExtensionAbility](../../reference/apis-driverdevelopment-kit/js-apis-app-ability-driverExtensionAbility.md)并根据需要重写需要的生命周期回调。 65 66 ```ts 67 export default class DriverExtAbility extends DriverExtensionAbility { 68 onInit(want: Want) { 69 console.info('testTag', `onInit, want: ${want.abilityName}`); 70 } 71 72 onRelease() { 73 console.info('testTag', `onRelease`); 74 } 75 76 onConnect(want: Want) { 77 console.info('testTag', `onConnect, want: ${want.abilityName}`); 78 return new StubTest("test"); 79 } 80 81 onDisconnect(want: Want) { 82 console.info('testTag', `onDisconnect, want: ${want.abilityName}`); 83 } 84 85 onDump(params: Array<string>) { 86 console.info('testTag', `onDump, params:` + JSON.stringify(params)); 87 return ['params']; 88 } 89 } 90 ``` 91 927. 在工程Module对应的[module.json5配置文件](../../quick-start/module-configuration-file.md)中注册DriverExtensionAbility,type标签需要设置为“driver”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。 93 94 ```json 95 { 96 "module": { 97 "name": "entry", 98 "type": "entry", 99 "description": "$string:module_desc", 100 "mainElement": "EntryAbility", 101 "deviceTypes": [ 102 "default", 103 "tablet" 104 ], 105 "requestPermissions": [ 106 { 107 "name": "ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER" // 此处为扩展外设相关权限,必须配置。 108 }, 109 { 110 "name": "ohos.permission.ACCESS_DDK_DRIVERS" // 此处为允许该扩展外设应用访问扩展外设驱动的权限,API verison 18及以上版本,必须配置。 111 } 112 ], 113 "deliveryWithInstall": true, 114 "installationFree": false, 115 "pages": "$profile:main_pages", 116 "abilities": [ 117 { 118 "name": "EntryAbility", 119 "srcEntry": "./ets/entryability/EntryAbility.ets", 120 "description": "$string:EntryAbility_desc", 121 "icon": "$media:startIcon", 122 "label": "$string:EntryAbility_label", 123 "startWindowIcon": "$media:startIcon", 124 "startWindowBackground": "$color:start_window_background", 125 "exported": true, 126 "skills": [ 127 { 128 "entities": [ 129 "entity.system.home" 130 ], 131 "actions": [ 132 "ohos.want.action.home" 133 ] 134 } 135 ] 136 } 137 ], 138 "extensionAbilities": [ 139 { 140 "name": "DriverExtAbility", 141 "icon": "$media:startIcon", 142 "description": "driver", 143 "type": "driver", 144 "exported": true, 145 "srcEntry": "./ets/driverextability/DriverExtAbility.ets", 146 "metadata": [ 147 { 148 "name": "bus", // 必填项,所属总线。 149 "value": "USB" 150 }, 151 { 152 "name": "desc", // 选填项,必要的驱动描述。 153 "value": "the sample of driverExtensionAbility" 154 }, 155 { 156 "name": "vendor", // 选填项,驱动厂商名称。 157 "value": "string" 158 }, 159 { 160 "name": "vid", // 支持 USB vendor id 列表,填写16进制,此处为4817的16进制。 161 "value": "0x12D1" 162 }, 163 { 164 "name": "pid", // 支持的 USB product id 列表,填写16进制,此处为4258的16进制。 165 "value": "0x10A2" 166 }, 167 { 168 "name": "launchOnBind", // 选填项,延迟拉起驱动。此处“true”表示延迟拉起,“false”表示即时拉起,配置错误或不配置,默认为“false”。 169 "value": "true" 170 }, 171 { 172 "name": "ohos.permission.ACCESS_DDK_ALLOWED", // 选填项,允许应用访问。此处“true”表示允许访问,“false”表示不允许访问,配置错误或不配置,默认为“false”。 173 "value": "true" 174 } 175 ] 176 } 177 ] 178 } 179 } 180 ``` 181 1828. 完成客户端和驱动示例代码开发后,请参考[使用本地真机运行应用/元服务](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-run-device),将Hap导入设备中,并点击hap中的Hello,查看是否会转变为Hello world,即实现ipc通信功能。 183 184## 扩展设备能力 185 186扩展外设管理目前提供了HID DDK、USB DDK、USB Serical DDK和SCSI Peripheral DDK四种能力,用于扩展外设专项驱动的开发。具体使用方法,请参考: 187 188* [开发适用HID协议的设备驱动](hid-ddk-guidelines.md) 189* [开发适用USB协议的设备驱动](usb-ddk-guidelines.md) 190* [开发适用串口协议的设备驱动](usb-serial-ddk-guidelines.md) 191* [开发使用SCSI协议的设备驱动](scsi-peripheral-ddk-guidelines.md) 192 193<!--RP1--> 194## 应用签名 195 196**注意:** 先配置权限,再自动签名。 197 198应用需要配置签名文件才能在设备上运行,并且扩展外设管理客户端开发,需要配置扩展外设的权限:ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER及ohos.permission.ACCESS_DDK_DRIVERS。 199- ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER(API version 10及以上版本,需要申请此权限。) 200 201 在module.json5配置文件的requestPermissions标签中[声明权限](../../security/AccessToken/declare-permissions.md)后,即可获得授权。 202 203- ohos.permission.ACCESS_DDK_DRIVERS(API version 18及以上版本,需要申请此权限。) 204 205 1. 在module.json5配置文件的requestPermissions标签中[声明权限](../../security/AccessToken/declare-permissions.md)。 206 2. HarmonyAppProvision配置文件中,修改acls字段,跨级别申请权限,可参考[申请使用受限权限](../../security/AccessToken/declare-permissions-in-acl.md)。 207 3. 在HarmonyAppProvision配置文件(即SDK目录下的“Sdk/openharmony/_{Version} _/toolchains /lib/UnsgnedReleasedProfileTemplate.json”文件)中,配置当前客户需要连接的驱动服务端的bundleName,如果存在多个服务端,多个服务端的bundleName以逗号分隔。 208 209 具体配置方法如下: 210 211 在文件的根节点加上app-services-capabilities节点,并采用以下格式进行配置。 212 ```json 213 "app-services-capabilities": { 214 "ohos.permission.ACCESS_DDK_DRIVERS": {"bundleNames": "bundleName0,bundleName1,bundleName2"} 215 } 216 ``` 217 218自动签名方法: 请参考[自动签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-signing#section18815157237)。 219<!--RP1End-->