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.ets29
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_DRIVER181
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