1# 外设扩展驱动开发指导 2 3## 场景介绍 4 5[DriverExtensionAbility](../../reference/apis-driverdevelopment-kit/js-apis-app-ability-driverExtensionAbility.md)是Driver类型的ExtensionAbility组件,提供驱动相关扩展框架能力。对于部分设备,支持插入外接的硬件模块来扩展设备能力, 此时可以以应用方式安装该硬件模块的驱动程序。通过DriverExtensionAbility可实现此类应用的开发。 6 7 8[DriverExtensionAbility](../../reference/apis-driverdevelopment-kit/js-apis-app-ability-driverExtensionAbility.md)可以通过DriverExtensionManager被应用绑定,并根据应用的请求信息在后台处理相关事务。 9每个类型的ExtensionAbility都有自己的Context,DriverExtensionAbility通过[DriverExtensionContext](../../reference/apis-driverdevelopment-kit/js-apis-inner-application-driverExtensionContext.md)提供相关能力。 10 11## 环境搭建 12 13请参考[外设扩展驱动客户端开发指导](externaldevice-guidelines.md)中的环境搭建。 14 15其中SDK版本配置的要求如下: 16 17| NDK接口 | SDK版本 | 18|---------|--------| 19| USB DDK | API10及以上 | 20| HID DDK | API11及以上 | 21 22## 开发步骤 23 24开发者在实现一个驱动时,需要在DevEco Studio工程中手动新建一个DriverExtensionAbility,具体步骤如下: 25 261. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为driverextability。 27 282. 在driverextability目录,右键选择“New > ArkTS File”,新建一个文件并命名为DriverExtAbility.ets。 29 303. 在文件中导入相关Kit,并定义请求Code。 31 32 ```ts 33 import { DriverExtensionAbility } from '@kit.DriverDevelopmentKit'; 34 import { Want } from '@kit.AbilityKit'; 35 import { rpc } from '@kit.IPCKit'; 36 37 const REQUEST_CODE = 99; // 与扩展外设客户端约定请求码 38 ``` 39 404. 打开DriverExtAbility.ets文件,导入[RPC通信模块](../../reference/apis-ipc-kit/js-apis-rpc.md),重载onRemoteMessageRequest()方法,接收应用传递过来的消息,并将处理的结果返回给应用。REQUEST_VALUE用于校验应用发送的服务请求码。 41 42 ```ts 43 class StubTest extends rpc.RemoteObject { 44 // 接收应用传递过来的消息处理,以及将处理的结果返回给客户端 45 onRemoteMessageRequest(code: number, data: rpc.MessageSequence, reply: rpc.MessageSequence, 46 option: rpc.MessageOption) { 47 if (code === REQUEST_CODE) { 48 // 接收应用传递过来的数据 49 // 应用使用多次调用data.writeString()写入多个数据时,驱动可以通过多次调用data.readString()方法接收对应的数据 50 let optFir: string = data.readString(); 51 // 驱动将数据的处理结果返回给应用 52 // 示例中为接收了"Hello",并将"Hello World"返回给应用 53 reply.writeString(optFir + ` World`); 54 } 55 return true; 56 } 57 } 58 ``` 59 605. 在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)并根据需要重写需要的生命周期回调。 61 62 ```ts 63 export default class DriverExtAbility extends DriverExtensionAbility { 64 onInit(want: Want) { 65 console.info('testTag', `onInit, want: ${want.abilityName}`); 66 } 67 68 onRelease() { 69 console.info('testTag', `onRelease`); 70 } 71 72 onConnect(want: Want) { 73 console.info('testTag', `onConnect, want: ${want.abilityName}`); 74 return new StubTest("test"); 75 } 76 77 onDisconnect(want: Want) { 78 console.info('testTag', `onDisconnect, want: ${want.abilityName}`); 79 } 80 81 onDump(params: Array<string>) { 82 console.info('testTag', `onDump, params:` + JSON.stringify(params)); 83 return ['params']; 84 } 85 } 86 ``` 87 886. 在工程Module对应的[module.json5配置文件](../../quick-start/module-configuration-file.md)中注册DriverExtensionAbility,type标签需要设置为“driver”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。 89 90 ```json 91 { 92 "module": { 93 "name": "entry", 94 "type": "entry", 95 "description": "$string:module_desc", 96 "mainElement": "EntryAbility", 97 "deviceTypes": [ 98 "default", 99 "tablet" 100 ], 101 "requestPermissions": [ 102 { 103 "name": "ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER" // 此处为扩展外设相关权限,必须配置 104 } 105 ], 106 "deliveryWithInstall": true, 107 "installationFree": false, 108 "pages": "$profile:main_pages", 109 "abilities": [ 110 { 111 "name": "EntryAbility", 112 "srcEntry": "./ets/entryability/EntryAbility.ets", 113 "description": "$string:EntryAbility_desc", 114 "icon": "$media:startIcon", 115 "label": "$string:EntryAbility_label", 116 "startWindowIcon": "$media:startIcon", 117 "startWindowBackground": "$color:start_window_background", 118 "exported": true, 119 "skills": [ 120 { 121 "entities": [ 122 "entity.system.home" 123 ], 124 "actions": [ 125 "action.system.home" 126 ] 127 } 128 ] 129 } 130 ], 131 "extensionAbilities": [ 132 { 133 "name": "DriverExtAbility", 134 "icon": "$media:startIcon", 135 "description": "driver", 136 "type": "driver", 137 "exported": true, 138 "srcEntry": "./ets/driverextability/DriverExtAbility.ets", 139 "metadata": [ 140 { 141 "name": "bus", // 必填项,所属总线 142 "value": "USB" 143 }, 144 { 145 "name": "desc", // 选填项,必要的驱动描述 146 "value": "the sample of driverExtensionAbility" 147 }, 148 { 149 "name": "vendor", // 选填项,驱动厂商名称 150 "value": "string" 151 }, 152 { 153 "name": "vid", // 支持 USB vendor id 列表,填写16进制,此处为4817的16进制 154 "value": "0x12D1" 155 }, 156 { 157 "name": "pid", // 支持的 USB product id 列表,填写16进制,此处为4258的16进制 158 "value": "0x10A2" 159 } 160 ] 161 } 162 ] 163 } 164 } 165 ``` 166 1677. 完成客户端和驱动示例代码开发后,请参考[使用本地真机运行应用/元服务](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-run-device-V13),将Hap导入设备中,并点击hap中的Hello,查看是否会转变为Hello world,即实现ipc通信功能。 168 169## 扩展设备能力 170 171扩展外设管理提供了HID DDK和USB DDK两种能力,用于驱动开发; 172 173具体使用方法,请参考: 174 175* [HID DDK开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/hid-ddk-guidelines.md) 176* [USB DDK开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/usb-ddk-guidelines.md) 177 178## 应用签名 179 180应用需要配置签名文件才能在设备上运行,并且扩展外设管理客户端开发,需要配置扩展外设的权限:ohos.permission.ACCESS_EXTENSIONAL_DEVICE_DRIVER。 181 182如果使用HID/USB DDK请添加对应权限,具体权限请查看上方开发指导。 183 184自动签名方法: 请参考[自动签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5#section18815157237)。 185 186权限配置方法: 请参考[使用ACL的签名配置指导](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5#section157591551175916)。 187