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