• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.usbManager (USB管理)
2
3本模块主要提供管理USB设备的相关功能,包括主设备上查询USB设备列表、批量数据传输、控制命令传输、权限控制等;从设备上端口管理、功能切换及查询等。
4
5>  **说明:**
6>
7> 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8
9## 导入模块
10
11```ts
12import { usbManager } from '@kit.BasicServicesKit';
13```
14
15## usbManager.getDevices
16
17getDevices(): Array<Readonly<USBDevice>>
18
19获取接入主设备的USB设备列表。如果没有设备接入,那么将会返回一个空的列表。开发者模式关闭时,如果没有设备接入,接口可能返回`undefined`,注意需要对接口返回值做判空处理。
20
21**系统能力:**  SystemCapability.USB.USBManager
22
23**错误码:**
24
25以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
26
27| 错误码ID | 错误信息                  |
28| -------- | ------------------------- |
29| 801      | Capability not supported. |
30
31**返回值:**
32
33| 类型                                                   | 说明      |
34| ---------------------------------------------------- | ------- |
35| Array<Readonly<[USBDevice](#usbdevice)>> | 设备信息列表。 |
36
37**示例:**
38
39```ts
40let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
41console.log(`devicesList = ${devicesList}`);
42/*
43devicesList 返回的数据结构,此处提供一个简单的示例,如下
44[
45  {
46    name: "1-1",
47    serial: "",
48    manufacturerName: "",
49    productName: "",
50    version: "",
51    vendorId: 7531,
52    productId: 2,
53    clazz: 9,
54    subClass: 0,
55    protocol: 1,
56    devAddress: 1,
57    busNum: 1,
58    configs: [
59      {
60        id: 1,
61        attributes: 224,
62        isRemoteWakeup: true,
63        isSelfPowered: true,
64        maxPower: 0,
65        name: "1-1",
66        interfaces: [
67          {
68            id: 0,
69            protocol: 0,
70            clazz: 9,
71            subClass: 0,
72            alternateSetting: 0,
73            name: "1-1",
74            endpoints: [
75              {
76                address: 129,
77                attributes: 3,
78                interval: 12,
79                maxPacketSize: 4,
80                direction: 128,
81                number: 1,
82                type: 3,
83                interfaceId: 0,
84              },
85            ],
86          },
87        ],
88      },
89    ],
90  },
91]
92*/
93```
94
95## usbManager.connectDevice
96
97connectDevice(device: USBDevice): Readonly&lt;USBDevicePipe&gt;
98
99根据getDevices()返回的设备信息打开USB设备。如果USB服务异常,可能返回`undefined`,注意需要对接口返回值做判空处理。
100
1011. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备信息以及device;
1022. 调用[usbManager.requestRight](#usbmanagerrequestright)请求使用该设备的权限。
103
104**系统能力:**  SystemCapability.USB.USBManager
105
106**参数:**
107
108| 参数名 | 类型 | 必填 | 说明 |
109| -------- | -------- | -------- | ---------------- |
110| device | [USBDevice](#usbdevice) | 是 | USB设备信息,用getDevices获取的busNum和devAddress确定设备,当前其他属性不做处理。 |
111
112**返回值:**
113
114| 类型 | 说明 |
115| -------- | -------- |
116| Readonly&lt;[USBDevicePipe](#usbdevicepipe)&gt; | 指定的传输通道对象。 |
117
118**错误码:**
119
120以下错误码的详细介绍参见[USB服务错误码](errorcode-usb.md)。
121
122| 错误码ID | 错误信息                                                     |
123| -------- | ------------------------------------------------------------ |
124| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
125| 801      | Capability not supported.                                    |
126| 14400001 | Access right denied. Call requestRight to get the USBDevicePipe access right first.|
127
128**示例:**
129
130```ts
131let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
132if (devicesList.length == 0) {
133  console.log(`device list is empty`);
134}
135
136let device: usbManager.USBDevice = devicesList[0];
137usbManager.requestRight(device.name);
138let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
139console.log(`devicepipe = ${devicepipe}`);
140```
141
142## usbManager.hasRight
143
144hasRight(deviceName: string): boolean
145
146判断是否有权访问该设备。
147
148如果“使用者”(如各种App或系统)有权访问设备则返回true;无权访问设备则返回false。
149
150**系统能力:**  SystemCapability.USB.USBManager
151
152**参数:**
153
154| 参数名 | 类型 | 必填 | 说明 |
155| -------- | -------- | -------- | -------- |
156| deviceName | string | 是 | 设备名称,来自getDevices获取的设备列表。 |
157
158**错误码:**
159
160以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
161
162| 错误码ID | 错误信息                                                     |
163| -------- | ------------------------------------------------------------ |
164| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
165| 801      | Capability not supported.                                    |
166
167**返回值:**
168
169| 类型 | 说明 |
170| -------- | -------- |
171| boolean | true表示有访问设备的权限,false表示没有访问设备的权限。调用失败返回其他错误码如下:<br>- 88080385:接口未初始化。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发送错误。|
172
173**示例:**
174
175```ts
176let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
177if (devicesList.length == 0) {
178  console.log(`device list is empty`);
179}
180
181let device: usbManager.USBDevice = devicesList[0];
182usbManager.requestRight(device.name);
183let right: boolean = usbManager.hasRight(device.name);
184console.log(`${right}`);
185```
186
187## usbManager.requestRight
188
189requestRight(deviceName: string): Promise&lt;boolean&gt;
190
191请求软件包的临时权限以访问设备。使用Promise异步回调。系统应用默认拥有访问设备权限,无需调用此接口申请。
192
193**系统能力:**  SystemCapability.USB.USBManager
194
195**参数:**
196
197| 参数名 | 类型 | 必填 | 说明 |
198| -------- | -------- | -------- | -------- |
199| deviceName | string | 是 | 设备名称,来自getDevices获取的设备列表。|
200
201**错误码:**
202
203以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
204
205| 错误码ID | 错误信息                                                     |
206| -------- | ------------------------------------------------------------ |
207| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
208| 801      | Capability not supported.                                    |
209
210**返回值:**
211
212| 类型 | 说明 |
213| -------- | -------- |
214| Promise&lt;boolean&gt; | Promise对象,返回临时权限的申请结果。返回true表示临时权限申请成功;返回false则表示临时权限申请失败。调用失败返回其他错误码如下:<br>- 88080385:接口未初始化。<br>- 88080392:写入接口数据包过程发生错误。<br>- 88080393:读取接口数据包过程发送错误。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。|
215
216**示例:**
217
218```ts
219let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
220if (devicesList.length == 0) {
221  console.log(`device list is empty`);
222}
223
224let device: usbManager.USBDevice = devicesList[0];
225usbManager.requestRight(device.name).then(ret => {
226  console.log(`requestRight = ${ret}`);
227});
228```
229
230## usbManager.removeRight
231
232removeRight(deviceName: string): boolean
233
234移除软件包访问设备的权限。系统应用默认拥有访问设备权限,调用此接口不会产生影响。
235
236**系统能力:**  SystemCapability.USB.USBManager
237
238**参数:**
239
240| 参数名 | 类型 | 必填 | 说明 |
241| -------- | -------- | -------- | -------- |
242| deviceName | string | 是 | 设备名称,来自getDevices获取的设备列表。|
243
244**错误码:**
245
246以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
247
248| 错误码ID | 错误信息                                                     |
249| -------- | ------------------------------------------------------------ |
250| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
251| 801      | Capability not supported.                                    |
252
253**返回值:**
254
255| 类型 | 说明 |
256| -------- | -------- |
257| boolean | 返回权限移除结果。返回true表示权限移除成功;返回false则表示权限移除失败。调用失败返回其他错误码如下:<br>- 88080382:接口操作过程中遇到无效值或参数。<br>- 88080385:接口未初始化。<br>- 88080392:写入接口数据包过程发生错误。<br>- 88080393:读取接口数据包过程发送错误。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。|
258
259**示例:**
260
261```ts
262let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
263if (devicesList.length == 0) {
264  console.log(`device list is empty`);
265}
266
267let device: usbManager.USBDevice = devicesList[0];
268if (usbManager.removeRight(device.name)) {
269  console.log(`Succeed in removing right`);
270}
271```
272
273## usbManager.claimInterface
274
275claimInterface(pipe: USBDevicePipe, iface: USBInterface, force ?: boolean): number
276
277注册通信接口。
278
2791. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备信息以及interfaces;
2802. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
2813. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到devicepipe作为参数。
282
283**系统能力:**  SystemCapability.USB.USBManager
284
285**参数:**
286
287| 参数名 | 类型 | 必填 | 说明 |
288| -------- | -------- | -------- | -------- |
289| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。|
290| iface | [USBInterface](#usbinterface) | 是 | 用于确定需要获取接口的索引,需要调用getDevices获取设备信息并通过id确定唯一接口。|
291| force | boolean | 否 | 可选参数,是否强制获取。默认值为false&nbsp;,表示不强制获取,用户按需选择。|
292
293**错误码:**
294
295以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
296
297| 错误码ID | 错误信息                                                     |
298| -------- | ------------------------------------------------------------ |
299| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
300| 801      | Capability not supported.                                    |
301
302**返回值:**
303
304| 类型 | 说明 |
305| -------- | -------- |
306| number | 注册通信接口成功返回0;注册通信接口失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。|
307
308**示例:**
309
310```ts
311let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
312if (devicesList.length == 0) {
313  console.log(`device list is empty`);
314}
315
316let device: usbManager.USBDevice = devicesList[0];
317usbManager.requestRight(device.name);
318let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
319let interfaces: usbManager.USBInterface = device.configs[0].interfaces[0];
320let ret: number= usbManager.claimInterface(devicepipe, interfaces);
321console.log(`claimInterface = ${ret}`);
322```
323
324## usbManager.releaseInterface
325
326releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number
327
328释放注册过的通信接口。
329
330需要调用[usbManager.claimInterface](#usbmanagerclaiminterface)先获取接口,才能使用此方法释放接口。
331
332**系统能力:**  SystemCapability.USB.USBManager
333
334**参数:**
335
336| 参数名 | 类型 | 必填 | 说明 |
337| -------- | -------- | -------- | -------- |
338| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。|
339| iface | [USBInterface](#usbinterface) | 是 | 用于确定需要释放接口的索引,需要调用getDevices获取设备信息并通过id确定唯一接口。|
340
341**错误码:**
342
343以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
344
345| 错误码ID | 错误信息                                                     |
346| -------- | ------------------------------------------------------------ |
347| 401      | Parameter error.Possible causes:1.Mandatory parameters are left unspecified.2.Incorrect parameter types. |
348| 801      | Capability not supported.                                    |
349
350**返回值:**
351
352| 类型 | 说明 |
353| -------- | -------- |
354| number | 释放接口成功返回0;释放接口失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080381:无效的接口操作。<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。|
355
356**示例:**
357
358```ts
359let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
360if (devicesList.length == 0) {
361  console.log(`device list is empty`);
362}
363
364let device: usbManager.USBDevice = devicesList[0];
365usbManager.requestRight(device.name);
366let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
367let interfaces: usbManager.USBInterface = device.configs[0].interfaces[0];
368let ret: number = usbManager.claimInterface(devicepipe, interfaces);
369ret = usbManager.releaseInterface(devicepipe, interfaces);
370console.log(`releaseInterface = ${ret}`);
371```
372
373## usbManager.setConfiguration
374
375setConfiguration(pipe: USBDevicePipe, config: USBConfiguration): number
376
377设置设备配置。
378
3791. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备信息以及config;
3802. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
3813. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)得到devicepipe作为参数。
382
383**系统能力:**  SystemCapability.USB.USBManager
384
385**参数:**
386
387| 参数名 | 类型 | 必填 | 说明 |
388| -------- | -------- | -------- | -------- |
389| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。|
390| config | [USBConfiguration](#usbconfiguration) | 是 | 用于确定需要设置的配置,需要调用getDevices获取设备信息并通过id用于确定唯一设置。|
391
392**错误码:**
393
394以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
395
396| 错误码ID | 错误信息                                                     |
397| -------- | ------------------------------------------------------------ |
398| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
399| 801      | Capability not supported.                                    |
400
401**返回值:**
402
403| 类型 | 说明 |
404| -------- | -------- |
405| number | 设置设备配置成功返回0;设置设备配置失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。<br>- -17:I/O失败。|
406
407**示例:**
408
409```ts
410let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
411if (devicesList.length == 0) {
412  console.log(`device list is empty`);
413}
414
415let device: usbManager.USBDevice = devicesList[0];
416usbManager.requestRight(device.name);
417let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
418let config: usbManager.USBConfiguration = device.configs[0];
419let ret: number= usbManager.setConfiguration(devicepipe, config);
420console.log(`setConfiguration = ${ret}`);
421```
422
423## usbManager.setInterface
424
425setInterface(pipe: USBDevicePipe, iface: USBInterface): number
426
427设置设备接口。
428
4291. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备列表以及interfaces;
4302. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
4313. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)得到devicepipe作为参数;
4324. 调用[usbManager.claimInterface](#usbmanagerclaiminterface)注册通信接口。
433
434**系统能力:**  SystemCapability.USB.USBManager
435
436**参数:**
437
438| 参数名 | 类型 | 必填 | 说明 |
439| -------- | -------- | -------- | -------- |
440| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。|
441| iface | [USBInterface](#usbinterface)   | 是 | 用于确定需要设置的接口,需要调用getDevices获取设备信息并通过id和alternateSetting确定唯一接口。|
442
443**错误码:**
444
445以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
446
447| 错误码ID | 错误信息                                                     |
448| -------- | ------------------------------------------------------------ |
449| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
450| 801      | Capability not supported.                                    |
451
452**返回值:**
453
454| 类型 | 说明 |
455| -------- | -------- |
456| number | 设置设备接口成功返回0;设置设备接口失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。|
457
458**示例:**
459
460```ts
461let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
462if (devicesList.length == 0) {
463  console.log(`device list is empty`);
464}
465
466let device: usbManager.USBDevice = devicesList[0];
467usbManager.requestRight(device.name);
468let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
469let interfaces: usbManager.USBInterface = device.configs[0].interfaces[0];
470let ret: number = usbManager.claimInterface(devicepipe, interfaces);
471ret = usbManager.setInterface(devicepipe, interfaces);
472console.log(`setInterface = ${ret}`);
473```
474
475## usbManager.getRawDescriptor
476
477getRawDescriptor(pipe: USBDevicePipe): Uint8Array
478
479获取原始的USB描述符。如果USB服务异常,可能返回`undefined`,注意需要对接口返回值做判空处理。
480
4811. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备列表;
4822. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
4833. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到devicepipe作为参数。
484
485**系统能力:**  SystemCapability.USB.USBManager
486
487**参数:**
488
489| 参数名 | 类型 | 必填 | 说明 |
490| -------- | -------- | -------- | -------- |
491| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。|
492
493**错误码:**
494
495以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
496
497| 错误码ID | 错误信息                                                     |
498| -------- | ------------------------------------------------------------ |
499| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
500| 801      | Capability not supported.                                    |
501
502**返回值:**
503
504| 类型 | 说明 |
505| -------- | -------- |
506| Uint8Array | 返回获取的原始数据;失败返回undefined。 |
507
508**示例:**
509
510```ts
511let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
512if (devicesList.length == 0) {
513  console.log(`device list is empty`);
514}
515
516usbManager.requestRight(devicesList[0].name);
517let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(devicesList[0]);
518let ret: Uint8Array = usbManager.getRawDescriptor(devicepipe);
519```
520
521## usbManager.getFileDescriptor
522
523getFileDescriptor(pipe: USBDevicePipe): number
524
525获取文件描述符。
526
5271. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备列表;
5282. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
5293. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到devicepipe作为参数。
530
531**系统能力:**  SystemCapability.USB.USBManager
532
533**参数:**
534
535| 参数名 | 类型 | 必填 | 说明 |
536| -------- | -------- | -------- | -------- |
537| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。|
538
539**错误码:**
540
541以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
542
543| 错误码ID | 错误信息                                                     |
544| -------- | ------------------------------------------------------------ |
545| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
546| 801      | Capability not supported.                                    |
547
548**返回值:**
549
550| 类型     | 说明                   |
551| ------ | -------------------- |
552| number | 返回设备对应的文件描述符;失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。|
553
554**示例:**
555
556```ts
557let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
558if (devicesList.length == 0) {
559  console.log(`device list is empty`);
560}
561
562usbManager.requestRight(devicesList[0].name);
563let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(devicesList[0]);
564let ret: number = usbManager.getFileDescriptor(devicepipe);
565```
566
567## usbManager.controlTransfer<sup>(deprecated)</sup>
568
569controlTransfer(pipe: USBDevicePipe, controlparam: USBControlParams, timeout ?: number): Promise&lt;number&gt;
570
571控制传输。
572
5731. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备列表;
5742. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
5753. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到devicepipe作为参数。
576
577**说明:**
578
579> 从 API version 9开始支持,从API version 12开始废弃。建议使用 [usbControlTransfer](#usbmanagerusbcontroltransfer12) 替代。
580
581**系统能力:**  SystemCapability.USB.USBManager
582
583**参数:**
584
585| 参数名 | 类型 | 必填 | 说明 |
586| -------- | -------- | -------- | -------- |
587| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定设备,需要调用connectDevice获取。|
588| controlparam | [USBControlParams](#usbcontrolparamsdeprecated) | 是 | 控制传输参数,按需设置参数,参数传参类型请参考USB协议。|
589| timeout | number | 否 | 超时时间(单位:ms),可选参数,默认为0不超时,用户按需选择。 |
590
591**错误码:**
592
593以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
594
595| 错误码ID | 错误信息                                                     |
596| -------- | ------------------------------------------------------------ |
597| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
598
599**返回值:**
600
601| 类型 | 说明 |
602| -------- | -------- |
603| Promise&lt;number&gt; | Promise对象,获取传输或接收到的数据块大小。失败返回其他错误码如下:<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。|
604
605**示例:**
606
607```ts
608class PARA {
609  request: number = 0
610  reqType: usbManager.USBControlRequestType = 0
611  target: usbManager.USBRequestTargetType = 0
612  value: number = 0
613  index: number = 0
614  data: Uint8Array = new Uint8Array()
615}
616
617let param: PARA = {
618  request: 0x06,
619  reqType: 0x80,
620  target:0,
621  value: 0x01 << 8 | 0,
622  index: 0,
623  data: new Uint8Array(18)
624};
625
626let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
627if (devicesList.length == 0) {
628  console.log(`device list is empty`);
629}
630
631usbManager.requestRight(devicesList[0].name);
632let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(devicesList[0]);
633usbManager.controlTransfer(devicepipe, param).then((ret: number) => {
634console.log(`controlTransfer = ${ret}`);
635})
636```
637
638## usbManager.usbControlTransfer<sup>12+</sup>
639
640usbControlTransfer(pipe: USBDevicePipe, requestparam: USBDeviceRequestParams, timeout ?: number): Promise&lt;number&gt;
641
642控制传输。
643
6441. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备列表;
6452. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
6463. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到devicepipe作为参数。
647
648**系统能力:**  SystemCapability.USB.USBManager
649
650**参数:**
651
652| 参数名 | 类型 | 必填 | 说明 |
653| -------- | -------- | -------- | -------- |
654| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定设备。 |
655| requestparam | [USBDeviceRequestParams](#usbdevicerequestparams12) | 是 | 控制传输参数,按需设置参数,参数传参类型请参考USB协议。 |
656| timeout | number | 否 | 超时时间(单位:ms),可选参数,默认为0不超时。 |
657
658**错误码:**
659
660以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
661
662| 错误码ID | 错误信息                                                     |
663| -------- | ------------------------------------------------------------ |
664| 401      | Parameter error.Possible causes:1.Mandatory parameters are left unspecified.2.Incorrect parameter types. |
665| 801      | Capability not supported.                                    |
666
667**返回值:**
668
669| 类型 | 说明 |
670| -------- | -------- |
671| Promise&lt;number&gt; | Promise对象,获取传输或接收到的数据块大小。失败返回其他错误码如下:<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。|
672
673**示例:**
674
675```ts
676class PARA {
677  bmRequestType: number = 0
678  bRequest: number = 0
679  wValue: number = 0
680  wIndex: number = 0
681  wLength: number = 0
682  data: Uint8Array = new Uint8Array()
683}
684
685let param: PARA = {
686  bmRequestType: 0x80,
687  bRequest: 0x06,
688
689  wValue:0x01 << 8 | 0,
690  wIndex: 0,
691  wLength: 18,
692  data: new Uint8Array(18)
693};
694
695let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
696if (devicesList.length == 0) {
697  console.log(`device list is empty`);
698}
699
700usbManager.requestRight(devicesList[0].name);
701let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(devicesList[0]);
702usbManager.usbControlTransfer(devicepipe, param).then((ret: number) => {
703console.log(`usbControlTransfer = ${ret}`);
704})
705```
706
707## usbManager.bulkTransfer
708
709bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout ?: number): Promise&lt;number&gt;
710
711批量传输。
712
7131. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备信息列表以及endpoint;
7142. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
7153. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到返回数据devicepipe;
7164. 获取接口[usbManager.claimInterface](#usbmanagerclaiminterface);
7175. 调用usbManager.bulkTransfer接口。
718
719> **说明:**
720>
721> 单次批量传输的传输数据总量(包括pipe、endpoint、buffer、timeout)请控制在200KB以下。
722
723**系统能力:**  SystemCapability.USB.USBManager
724
725**参数:**
726
727| 参数名 | 类型 | 必填 | 说明 |
728| -------- | -------- | -------- | -------- |
729| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定设备,需要调用connectDevice获取。|
730| endpoint | [USBEndpoint](#usbendpoint) | 是 | 用于确定传输的端口,需要调用getDevices获取设备信息列表以及endpoint,address用于确定端点地址,direction用于确定端点的方向,interfaceId用于确定所属接口,当前其他属性不做处理。|
731| buffer | Uint8Array | 是 | 用于写入或读取数据的缓冲区。 |
732| timeout | number | 否 | 超时时间(单位:ms),可选参数,默认为0不超时,用户按需选择。 |
733
734**错误码:**
735
736以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
737
738| 错误码ID | 错误信息                                                     |
739| -------- | ------------------------------------------------------------ |
740| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
741| 801      | Capability not supported.                                    |
742
743**返回值:**
744
745| 类型 | 说明 |
746| -------- | -------- |
747| Promise&lt;number&gt; | Promise对象,获取传输或接收到的数据块大小。失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080385:接口未初始化。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080492:写入服务数据包过程发生错误。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。<br>- -3:参数无效。<br>- -202:设备未找到。|
748
749**示例:**
750
751> **说明:**
752>
753> 以下示例代码只是调用bulkTransfer接口的必要流程,实际调用时,设备开发者需要遵循设备相关协议进行调用,确保数据的正确传输和设备的兼容性。
754
755```ts
756//usbManager.getDevices 接口返回数据集合,取其中一个设备对象,并获取权限。
757//把获取到的设备对象作为参数传入usbManager.connectDevice;当usbManager.connectDevice接口成功返回之后;
758//才可以调用第三个接口usbManager.claimInterface.usbManager.claimInterface 调用成功以后,再调用该接口。
759let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
760if (devicesList.length == 0) {
761  console.log(`device list is empty`);
762}
763
764let device: usbManager.USBDevice = devicesList[0];
765usbManager.requestRight(device.name);
766
767let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
768for (let i = 0; i < device.configs[0].interfaces.length; i++) {
769  if (device.configs[0].interfaces[i].endpoints[0].attributes == 2) {
770    let endpoint: usbManager.USBEndpoint = device.configs[0].interfaces[i].endpoints[0];
771    let interfaces: usbManager.USBInterface = device.configs[0].interfaces[i];
772    let ret: number = usbManager.claimInterface(devicepipe, interfaces);
773    let buffer =  new Uint8Array(128);
774    usbManager.bulkTransfer(devicepipe, endpoint, buffer).then((ret: number) => {
775      console.log(`bulkTransfer = ${ret}`);
776    });
777  }
778}
779```
780
781## usbManager.usbSubmitTransfer<sup>18+</sup>
782
783usbSubmitTransfer(transfer: UsbDataTransferParams): void
784
785提交异步传输请求。
786
787本接口为异步接口,调用后立刻返回,实际读写操作的结果以回调的方式返回。
788
7891. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备信息列表以及endpoint;
7902. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
7913. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到返回数据devicepipe;
7924. 获取接口[usbManager.claimInterface](#usbmanagerclaiminterface);
7935. 调用usbManager.usbSubmitTransfer接口。
794
795**系统能力:**  SystemCapability.USB.USBManager
796
797**参数:**
798
799| 参数名 | 类型 | 必填 | 说明 |
800| -------- | -------- | -------- | -------- |
801| transfer | [UsbDataTransferParams](#usbdatatransferparams18) | 是 | 作为通用USB数据传输接口,客户端需要填充这个对象中的参数,用以发起传输请求。|
802
803**错误码:**
804
805以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
806
807| 错误码ID | 错误信息                                                     |
808| -------- | ------------------------------------------------------------ |
809| 801 | Capability not supported. |
810| 14400001 | Access right denied. Call requestRight to get the USBDevicePipe access right first. |
811| 14400007 | Resource busy. |
812| 14400008 | No such device (it may have been disconnected). |
813| 14400009 | Insufficient memory. |
814| 14400012 | Transmission I/O error. |
815
816**示例:**
817
818> **说明:**
819>
820> 以下示例代码需要放入具体的方法中执行,只是调用usbSubmitTransfer接口的必要流程,实际调用时,设备开发者需要遵循设备相关协议进行调用,确保数据的正确传输和设备的兼容性。
821
822<!--code_no_check-->
823```ts
824//usbManager.getDevices 接口返回数据集合,取其中一个设备对象,并获取权限。
825//把获取到的设备对象作为参数传入usbManager.connectDevice;当usbManager.connectDevice接口成功返回之后;
826//才可以调用第三个接口usbManager.claimInterface.usbManager.claimInterface 调用成功以后,再调用该接口。
827let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
828if (devicesList.length == 0) {
829  console.log(`device list is empty`);
830  return;
831}
832let device: usbManager.USBDevice = devicesList[0];
833usbManager.requestRight(device.name);
834let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
835//获取endpoint端点地址。
836let endpoint = device.configs[0].interfaces[0]?.endpoints.find((value) => {
837  return value.direction === 0 && value.type === 2
838})
839//获取设备的第一个id。
840let ret: number = usbManager.claimInterface(devicepipe, device.configs[0].interfaces[0], true);
841
842let transferParams: usbManager.UsbDataTransferParams = {
843  devPipe: devicepipe,
844  flags: usbManager.UsbTransferFlags.USB_TRANSFER_SHORT_NOT_OK,
845  endpoint: 1,
846  type: usbManager.UsbEndpointTransferType.TRANSFER_TYPE_BULK,
847  timeout: 2000,
848  length: 10,
849  callback: () => {},
850  userData: new Uint8Array(10),
851  buffer: new Uint8Array(10),
852  isoPacketCount: 0,
853};
854try {
855  transferParams.endpoint=endpoint?.address as number;
856  transferParams.callback=(err, callBackData: usbManager.SubmitTransferCallback)=>{
857    console.info('callBackData =' +JSON.stringify(callBackData));
858  }
859  usbManager.usbSubmitTransfer(transferParams);
860  console.info('USB transfer request submitted.');
861} catch (error) {
862  console.error('USB transfer failed:', error);
863}
864```
865
866## usbManager.usbCancelTransfer<sup>18+</sup>
867
868usbCancelTransfer(transfer: UsbDataTransferParams): void
869
870取消异步传输请求。
871
8721. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备信息列表以及endpoint;
8732. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
8743. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)接口得到返回数据devicepipe;
8754. 获取接口[usbManager.claimInterface](#usbmanagerclaiminterface);
8765. 调用usbManager.usbCancelTransfer接口。
877
878**系统能力:**  SystemCapability.USB.USBManager
879
880**参数:**
881
882| 参数名 | 类型 | 必填 | 说明 |
883| -------- | -------- | -------- | -------- |
884| transfer | [UsbDataTransferParams](#usbdatatransferparams18) | 是 | 在取消传输的接口中,只需要填充USBDevicePipe和endpoint即可。|
885
886**错误码:**
887
888以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
889
890| 错误码ID | 错误信息                                                     |
891| -------- | ------------------------------------------------------------ |
892| 801 | Capability not supported. |
893| 14400001 | Access right denied. Call requestRight to get the USBDevicePipe access right first. |
894| 14400008 | No such device (it may have been disconnected). |
895| 14400010 | Other USB error. Possible causes:<br>1.Unrecognized discard error code. |
896| 14400011 | The transfer is not in progress, or is already complete or cancelled.|
897
898**返回值:**
899
900| 类型 | 说明 |
901| -------- | -------- |
902| &lt;void&gt; | 无。 |
903
904**示例:**
905
906> **说明:**
907>
908> 以下示例代码需要放入具体的方法中执行,只是调用usbCancelTransfer接口的必要流程,实际调用时,设备开发者需要遵循设备相关协议进行调用,确保数据的正确传输和设备的兼容性。
909
910<!--code_no_check-->
911```ts
912//usbManager.getDevices 接口返回数据集合,取其中一个设备对象,并获取权限。
913//把获取到的设备对象作为参数传入usbManager.connectDevice;当usbManager.connectDevice接口成功返回之后;
914//才可以调用第三个接口usbManager.claimInterface.usbManager.claimInterface 调用成功以后,再调用该接口。
915let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
916if (devicesList.length == 0) {
917  console.log(`device list is empty`);
918  return;
919}
920let device: usbManager.USBDevice = devicesList[0];
921usbManager.requestRight(device.name);
922let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(device);
923//获取endpoint端点地址。
924let endpoint = device.configs[0].interfaces[0]?.endpoints.find((value) => {
925  return value.direction === 0 && value.type === 2
926})
927//获取设备的第一个id。
928let ret: number = usbManager.claimInterface(devicepipe, device.configs[0].interfaces[0], true);
929let transferParams: usbManager.UsbDataTransferParams = {
930  devPipe: devicepipe,
931  flags: usbManager.UsbTransferFlags.USB_TRANSFER_SHORT_NOT_OK,
932  endpoint: 1,
933  type: usbManager.UsbEndpointTransferType.TRANSFER_TYPE_BULK,
934  timeout: 2000,
935  length: 10,
936  callback: () => {},
937  userData: new Uint8Array(10),
938  buffer: new Uint8Array(10),
939  isoPacketCount: 0,
940};
941try {
942  transferParams.endpoint=endpoint?.address as number;
943  transferParams.callback=(err, callBackData: usbManager.SubmitTransferCallback)=>{
944    console.info('callBackData =' +JSON.stringify(callBackData));
945  }
946  usbManager.usbSubmitTransfer(transferParams);
947  usbManager.usbCancelTransfer(transferParams);
948  console.info('USB transfer request submitted.');
949} catch (error) {
950  console.error('USB transfer failed:', error);
951}
952```
953
954## usbManager.closePipe
955
956closePipe(pipe: USBDevicePipe): number
957
958关闭设备消息控制通道。
959
9601. 需要调用[usbManager.getDevices](#usbmanagergetdevices)获取设备列表;
9612. 调用[usbManager.requestRight](#usbmanagerrequestright)获取设备请求权限;
9623. 调用[usbManager.connectDevice](#usbmanagerconnectdevice)得到devicepipe作为参数。
963
964**系统能力:**  SystemCapability.USB.USBManager
965
966**参数:**
967
968| 参数名 | 类型 | 必填 | 说明 |
969| -------- | -------- | -------- | -------- |
970| pipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定USB设备消息控制通道,需要调用connectDevice获取。|
971
972**错误码:**
973
974以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
975
976| 错误码ID | 错误信息                                                     |
977| -------- | ------------------------------------------------------------ |
978| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
979| 801      | Capability not supported.                                    |
980
981**返回值:**
982
983| 类型 | 说明 |
984| -------- | -------- |
985| number | 关闭设备消息控制通道成功返回0;关闭设备消息控制通道失败返回其他错误码如下:<br>- 63:数据量超过预期的最大值。<br>- 88080393:读取接口数据包过程发生错误。<br>- 88080482:服务过程中遇到无效值或参数。<br>- 88080484:没有权限。<br>- 88080493:读取服务数据包过程发生错误。<br>- 88080497:服务内部逻辑执行发生错误。<br>- -1:调用底层接口失败。 |
986
987**示例:**
988
989```ts
990let devicesList: Array<usbManager.USBDevice> = usbManager.getDevices();
991if (devicesList.length == 0) {
992  console.log(`device list is empty`);
993}
994
995usbManager.requestRight(devicesList[0].name);
996let devicepipe: usbManager.USBDevicePipe = usbManager.connectDevice(devicesList[0]);
997let ret: number = usbManager.closePipe(devicepipe);
998console.log(`closePipe = ${ret}`);
999```
1000
1001## usbManager.hasAccessoryRight<sup>14+</sup>
1002
1003hasAccessoryRight(accessory: USBAccessory): boolean
1004
1005检查应用程序是否有权访问USB配件。
1006
1007需要调用[usbManager.getAccessoryList](#usbmanagergetaccessorylist14)获取配件列表,得到[USBAccessory](#usbaccessory14)作为参数。
1008
1009**系统能力:**  SystemCapability.USB.USBManager
1010
1011**参数:**
1012
1013| 参数名    | 类型         | 必填 | 说明                                  |
1014| --------- | ------------ | ---- | ------------------------------------- |
1015| accessory | [USBAccessory](#usbaccessory14) | 是   | USB配件,需要通过[getAccessoryList](#usbmanagergetaccessorylist14)获取。 |
1016
1017**错误码:**
1018
1019以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
1020
1021| 错误码ID | 错误信息                                                     |
1022| -------- | ------------------------------------------------------------ |
1023| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
1024| 801      | Capability not supported.                                    |
1025| 14400004 | Service exception. Possible causes: 1. No accessory is plugged in. |
1026| 14400005 | Database operation exception.                                |
1027| 14401001 | The target USBAccessory not matched.                         |
1028
1029**返回值:**
1030
1031| 类型    | 说明                          |
1032| ------- | ----------------------------- |
1033| boolean | true表示应用程序有权访问USB配件,false表示应用程序无权访问USB配件。 |
1034
1035**示例:**
1036
1037```ts
1038import { hilog } from '@kit.PerformanceAnalysisKit';
1039try {
1040  let accList: usbManager.USBAccessory[] = usbManager.getAccessoryList()
1041  let flag = usbManager.hasAccessoryRight(accList[0])
1042  hilog.info(0, 'testTag ui', `hasAccessoryRight success, ret:${flag}`)
1043} catch (error) {
1044  hilog.info(0, 'testTag ui', `hasAccessoryRight error ${error.code}, message is ${error.message}`)
1045}
1046```
1047
1048## usbManager.requestAccessoryRight<sup>14+</sup>
1049
1050requestAccessoryRight(accessory: USBAccessory): Promise&lt;boolean&gt;
1051
1052为指定应用程序申请访问USB配件的访问权限。
1053
1054需要调用[usbManager.getAccessoryList](#usbmanagergetaccessorylist14)获取配件列表,得到[USBAccessory](#usbaccessory14)作为参数。
1055
1056**系统能力:**  SystemCapability.USB.USBManager
1057
1058**参数:**
1059
1060| 参数名    | 类型         | 必填 | 说明                                  |
1061| --------- | ------------ | ---- | ------------------------------------- |
1062| accessory | [USBAccessory](#usbaccessory14) | 是   | USB配件,需要通过[getAccessoryList](#usbmanagergetaccessorylist14)获取。 |
1063
1064**错误码:**
1065
1066以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
1067
1068| 错误码ID | 错误信息                                                     |
1069| -------- | ------------------------------------------------------------ |
1070| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
1071| 801      | Capability not supported.                                    |
1072| 14400004 | Service exception. Possible causes: 1. No accessory is plugged in. |
1073| 14400005 | Database operation exception.                                |
1074| 14401001 | The target USBAccessory not matched.                         |
1075
1076**返回值:**
1077
1078| 类型             | 说明                          |
1079| ---------------- | ----------------------------- |
1080| Promise&lt;boolean&gt; | Promise对象,返回应用程序访问配件权限的申请结果。返回true表示权限申请成功;返回false表示权限申请失败。 |
1081
1082**示例:**
1083
1084```ts
1085import { hilog } from '@kit.PerformanceAnalysisKit';
1086try {
1087  let accList: usbManager.USBAccessory[] = usbManager.getAccessoryList()
1088  let flag = usbManager.requestAccessoryRight(accList[0])
1089  hilog.info(0, 'testTag ui', `requestAccessoryRight success, ret:${flag}`)
1090} catch (error) {
1091  hilog.info(0, 'testTag ui', `requestAccessoryRight error ${error.code}, message is ${error.message}`)
1092}
1093```
1094
1095## usbManager.cancelAccessoryRight<sup>14+</sup>
1096
1097cancelAccessoryRight(accessory: USBAccessory): void
1098
1099取消当前应用程序访问USB配件的权限。
1100
1101需要调用[usbManager.getAccessoryList](#usbmanagergetaccessorylist14)获取配件列表,得到[USBAccessory](#usbaccessory14)作为参数。
1102
1103**系统能力:**  SystemCapability.USB.USBManager
1104
1105**参数:**
1106
1107| 参数名    | 类型         | 必填 | 说明                                  |
1108| --------- | ------------ | ---- | ------------------------------------- |
1109| accessory | [USBAccessory](#usbaccessory14) | 是   | USB配件,需要通过[getAccessoryList](#usbmanagergetaccessorylist14)获取。 |
1110
1111**错误码:**
1112
1113以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
1114
1115| 错误码ID | 错误信息                                                     |
1116| -------- | ------------------------------------------------------------ |
1117| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
1118| 801      | Capability not supported.                                    |
1119| 14400004 | Service exception. Possible causes: 1. No accessory is plugged in. |
1120| 14400005 | Database operation exception.                                |
1121| 14401001 | The target USBAccessory not matched.                         |
1122
1123**示例:**
1124
1125```ts
1126import { hilog } from '@kit.PerformanceAnalysisKit';
1127try {
1128  let accList: usbManager.USBAccessory[] = usbManager.getAccessoryList()
1129  let flag = usbManager.requestAccessoryRight(accList[0])
1130  usbManager.cancelAccessoryRight(accList[0])
1131  hilog.info(0, 'testTag ui', `cancelAccessoryRight success`)
1132} catch (error) {
1133  hilog.info(0, 'testTag ui', `cancelAccessoryRight error ${error.code}, message is ${error.message}`)
1134}
1135```
1136
1137## usbManager.getAccessoryList<sup>14+</sup>
1138
1139getAccessoryList(): Array<Readonly&lt;USBAccessory&gt;>
1140
1141获取当前已接入主机的USB配件列表。
1142
1143**系统能力:**  SystemCapability.USB.USBManager
1144
1145**错误码:**
1146
1147以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
1148
1149| 错误码ID | 错误信息                                                     |
1150| -------- | ------------------------------------------------------------ |
1151| 801      | Capability not supported.                                    |
1152| 14400004 | Service exception. Possible causes: 1. No accessory is plugged in. |
1153
1154**返回值:**
1155
1156| 类型                          | 说明                                               |
1157| ----------------------------- | -------------------------------------------------- |
1158| Array<Readonly&lt;USBAccessory&gt;> | 只读的USB配件列表。当前仅支持列表中包含1个USB配件。 |
1159
1160**示例:**
1161
1162```ts
1163import { hilog } from '@kit.PerformanceAnalysisKit';
1164try {
1165  let accList: usbManager.USBAccessory[] = usbManager.getAccessoryList()
1166  hilog.info(0, 'testTag ui', `getAccessoryList success, accList: ${JSON.stringify(accList)}`)
1167} catch (error) {
1168  hilog.info(0, 'testTag ui', `getAccessoryList error ${error.code}, message is ${error.message}`)
1169}
1170```
1171
1172## usbManager.openAccessory<sup>14+</sup>
1173
1174openAccessory(accessory: USBAccessory): USBAccessoryHandle
1175
1176获取配件句柄并打开配件文件描述符。之后可以通过CoreFileKit提供的read/write接口和配件进行通信。
1177
1178需要调用[usbManager.getAccessoryList](#usbmanagergetaccessorylist14)获取配件列表,得到[USBAccessory](#usbaccessory14)作为参数。
1179
1180**系统能力:**  SystemCapability.USB.USBManager
1181
1182**参数:**
1183
1184| 参数名    | 类型         | 必填 | 说明                                  |
1185| --------- | ------------ | ---- | ------------------------------------- |
1186| accessory | [USBAccessory](#usbaccessory14) | 是   | USB配件,需要通过[getAccessoryList](#usbmanagergetaccessorylist14)获取。 |
1187
1188**错误码:**
1189
1190以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
1191
1192| 错误码ID | 错误信息                                                     |
1193| -------- | ------------------------------------------------------------ |
1194| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
1195| 801      | Capability not supported.                                    |
1196| 14400001 | Permission denied. Call requestAccessoryRight to get the right first. |
1197| 14400004 | Service exception. Possible causes: 1. No accessory is plugged in. |
1198| 14401001 | The target USBAccessory not matched.                         |
1199| 14401002 | Failed to open the native accessory node.                    |
1200| 14401003 | Cannot reopen the accessory.                                 |
1201
1202**返回值:**
1203
1204| 类型               | 说明        |
1205| ------------------ | ----------- |
1206| [USBAccessoryHandle](#usbaccessoryhandle14) | USB配件句柄。 |
1207
1208**示例:**
1209
1210```ts
1211import { hilog } from '@kit.PerformanceAnalysisKit';
1212import { fileIo as fs } from '@kit.CoreFileKit';
1213try {
1214  let accList: usbManager.USBAccessory[] = usbManager.getAccessoryList()
1215  let flag = usbManager.requestAccessoryRight(accList[0])
1216  let handle = usbManager.openAccessory(accList[0])
1217  hilog.info(0, 'testTag ui', `openAccessory success`)
1218  let arrayBuffer = new ArrayBuffer(4096);
1219  let readLength = fs.readSync(handle.accessoryFd, arrayBuffer, {offset: 0, length: 4096});
1220  hilog.info(0, 'testTag ui', 'readSync ret: ' + readLength.toString(10));
1221} catch (error) {
1222  hilog.info(0, 'testTag ui', `openAccessory error ${error.code}, message is ${error.message}`)
1223}
1224```
1225
1226## usbManager.closeAccessory<sup>14+</sup>
1227
1228closeAccessory(accessoryHandle: USBAccessoryHandle): void
1229
1230关闭配件文件描述符。
1231
1232需要调用[usbManager.openAccessory](#usbmanageropenaccessory14)获取配件列表,得到[USBAccessoryHandle](#usbaccessoryhandle14)作为参数。
1233
1234**系统能力:**  SystemCapability.USB.USBManager
1235
1236**参数:**
1237
1238| 参数名          | 类型               | 必填 | 说明                                   |
1239| --------------- | ------------------ | ---- | -------------------------------------- |
1240| accessoryHandle | [USBAccessoryHandle](#usbaccessoryhandle14) | 是   | USB配件句柄。需要通过[openAccessory](#usbmanageropenaccessory14)获取。 |
1241
1242**错误码:**
1243
1244以下错误码的详细介绍请参见[USB服务错误码](errorcode-usb.md)。
1245
1246| 错误码ID | 错误信息                                                     |
1247| -------- | ------------------------------------------------------------ |
1248| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
1249| 801      | Capability not supported.                                    |
1250| 14400004 | Service exception. Possible causes: 1. No accessory is plugged in. |
1251
1252**示例:**
1253
1254```ts
1255import { hilog } from '@kit.PerformanceAnalysisKit';
1256try {
1257  let accList: usbManager.USBAccessory[] = usbManager.getAccessoryList()
1258  let flag = usbManager.requestAccessoryRight(accList[0])
1259  let handle = usbManager.openAccessory(accList[0])
1260  usbManager.closeAccessory(handle)
1261  hilog.info(0, 'testTag ui', `closeAccessory success`)
1262} catch (error) {
1263  hilog.info(0, 'testTag ui', `closeAccessory error ${error.code}, message is ${error.message}`)
1264}
1265```
1266
1267## USBEndpoint
1268
1269通过USB发送和接收数据的端口。通过[USBInterface](#usbinterface)获取。
1270
1271**系统能力:** SystemCapability.USB.USBManager
1272
1273| 名称            | 类型                                        | 必填            |说明            |
1274| ------------- | ------------------------------------------- | ------------- |------------- |
1275| address       | number                                      | 是 |端点地址。         |
1276| attributes    | number                                      | 是 |端点属性。         |
1277| interval      | number                                      | 是 |端点间隔。         |
1278| maxPacketSize | number                                      | 是 |端点最大数据包大小。    |
1279| direction     | [USBRequestDirection](#usbrequestdirection) | 是 |端点的方向。        |
1280| number        | number                                      | 是 |端点号。          |
1281| type          | number                                      | 是 |端点类型。         |
1282| interfaceId   | number                                      | 是 |端点所属的接口的唯一标识。 |
1283
1284## USBInterface
1285
1286一个[USBConfiguration](#usbconfiguration)中可以含有多个USBInterface,每个USBInterface提供一个功能。
1287
1288**系统能力:** SystemCapability.USB.USBManager
1289
1290| 名称               | 类型                                     | 必填            |说明                    |
1291| ---------------- | ---------------------------------------- | ------------- |--------------------- |
1292| id               | number                                   | 是 |接口的唯一标识。              |
1293| protocol         | number                                   | 是 |接口的协议。                |
1294| clazz            | number                                   | 是 |设备类型。                 |
1295| subClass         | number                                   | 是 |设备子类。                 |
1296| alternateSetting | number                                   | 是 |在同一个接口中的多个描述符中进行切换设置。 |
1297| name             | string                                   | 是 |接口名称。                 |
1298| endpoints        | Array&lt;[USBEndpoint](#usbendpoint)&gt; | 是 |当前接口所包含的端点。           |
1299
1300## USBConfiguration
1301
1302USB配置,一个[USBDevice](#usbdevice)中可以含有多个配置。
1303
1304**系统能力:** SystemCapability.USB.USBManager
1305
1306| 名称             | 类型                                             | 必填  |说明              |
1307| -------------- | ------------------------------------------------ | --------------- |--------------- |
1308| id             | number                                           | 是 |配置的唯一标识。        |
1309| attributes     | number                                           | 是 |配置的属性。          |
1310| maxPower       | number                                           | 是 |最大功耗,以毫安为单位。    |
1311| name           | string                                           | 是 |配置的名称,可以为空。     |
1312| isRemoteWakeup | boolean                                          | 是 |检查当前配置是否支持远程唤醒。 |
1313| isSelfPowered  | boolean                                          | 是 | 检查当前配置是否支持独立电源。 |
1314| interfaces     | Array&nbsp;&lt;[USBInterface](#usbinterface)&gt; | 是 |配置支持的接口属性。      |
1315
1316## USBDevice
1317
1318USB设备信息。
1319
1320**系统能力:** SystemCapability.USB.USBManager
1321
1322| 名称               | 类型                                 | 必填         |说明         |
1323| ---------------- | ------------------------------------ | ---------- |---------- |
1324| busNum           | number                               | 是 |总线地址。      |
1325| devAddress       | number                               | 是 |设备地址。      |
1326| serial           | string                               | 是 |序列号。       |
1327| name             | string                               | 是 |设备名字。      |
1328| manufacturerName | string                               | 是 | 产商信息。      |
1329| productName      | string                               | 是 |产品信息。      |
1330| version          | string                               | 是 |版本。        |
1331| vendorId         | number                               | 是 |厂商ID。      |
1332| productId        | number                               | 是 |产品ID。      |
1333| clazz            | number                               | 是 |设备类。       |
1334| subClass         | number                               | 是 |设备子类。      |
1335| protocol         | number                               | 是 |设备协议码。     |
1336| configs          | Array&lt;[USBConfiguration](#usbconfiguration)&gt; | 是 |设备配置描述符信息。 |
1337
1338## USBDevicePipe
1339
1340USB设备消息传输通道,用于确定设备。
1341
1342**系统能力:** SystemCapability.USB.USBManager
1343
1344| 名称         | 类型   | 必填    |说明    |
1345| ---------- | ------ | ----- |----- |
1346| busNum     | number |是 | 总线地址。 |
1347| devAddress | number |是 | 设备地址。 |
1348
1349## USBControlParams<sup>(deprecated)</sup>
1350
1351控制传输参数。
1352
1353**说明:**
1354
1355> 从 API version 9开始支持,从API version 18开始废弃。建议使用 [USBDeviceRequestParams](#usbdevicerequestparams12) 替代。
1356
1357**系统能力:** SystemCapability.USB.USBManager
1358
1359| 名称      | 类型                                            | 必填               |说明               |
1360| ------- | ----------------------------------------------- | ---------------- |---------------- |
1361| request | number                                          | 是   |请求类型。            |
1362| target  | [USBRequestTargetType](#usbrequesttargettype)   | 是   |请求目标类型。          |
1363| reqType | [USBControlRequestType](#usbcontrolrequesttype) | 是   |请求控制类型。          |
1364| value   | number                                          | 是   |请求参数。            |
1365| index   | number                                          | 是   |请求参数value对应的索引值。 |
1366| data    | Uint8Array                                      | 是   |用于写入或读取的缓冲区。     |
1367
1368## USBDeviceRequestParams<sup>12+</sup>
1369
1370控制传输参数。
1371
1372**系统能力:** SystemCapability.USB.USBManager
1373
1374| 名称      | 类型                                            | 必填               |说明               |
1375| ------- | ----------------------------------------------- | ---------------- |---------------- |
1376| bmRequestType | number                                    | 是   |请求控制类型。            |
1377| bRequest  | number                                        | 是   |请求类型。          |
1378| wValue | number                                           | 是   |请求参数。          |
1379| wIndex   | number                                         | 是   |请求参数value对应的索引值。            |
1380| wLength   | number                                        | 是   |请求数据的长度。 |
1381| data    | Uint8Array                                      | 是   |用于写入或读取的缓冲区。     |
1382
1383## USBRequestTargetType
1384
1385请求目标类型。
1386
1387**系统能力:** SystemCapability.USB.USBManager
1388
1389| 名称                         | 值   | 说明   |
1390| ---------------------------- | ---- | ------ |
1391| USB_REQUEST_TARGET_DEVICE    | 0    | 设备。 |
1392| USB_REQUEST_TARGET_INTERFACE | 1    | 接口。 |
1393| USB_REQUEST_TARGET_ENDPOINT  | 2    | 端点。 |
1394| USB_REQUEST_TARGET_OTHER     | 3    | 其他。 |
1395
1396## USBControlRequestType
1397
1398控制请求类型。
1399
1400**系统能力:** SystemCapability.USB.USBManager
1401
1402| 名称                      | 值   | 说明   |
1403| ------------------------- | ---- | ------ |
1404| USB_REQUEST_TYPE_STANDARD | 0    | 标准。 |
1405| USB_REQUEST_TYPE_CLASS    | 1    | 类。   |
1406| USB_REQUEST_TYPE_VENDOR   | 2    | 厂商。 |
1407
1408## USBRequestDirection
1409
1410请求方向。
1411
1412**系统能力:** SystemCapability.USB.USBManager
1413
1414| 名称                        | 值   | 说明                     |
1415| --------------------------- | ---- | ------------------------ |
1416| USB_REQUEST_DIR_TO_DEVICE   | 0    | 写数据,主设备往从设备。 |
1417| USB_REQUEST_DIR_FROM_DEVICE | 0x80 | 读数据,从设备往主设备。 |
1418
1419## USBAccessory<sup>14+</sup>
1420
1421USB配件信息。
1422
1423**系统能力:** SystemCapability.USB.USBManager
1424
1425| 名称         | 类型   | 必填 | 说明             |
1426| ------------ | ------ | ---- | ---------------- |
1427| manufacturer | string | 是   | 配件的生产厂商。 |
1428| product      | string | 是   | 配件的产品类型。 |
1429| description  | string | 是   | 配件的描述。     |
1430| version      | string | 是   | 配件的版本。     |
1431| serialNumber | string | 是   | 配件的SN号。     |
1432
1433## USBAccessoryHandle<sup>14+</sup>
1434
1435USB配件句柄。
1436
1437**系统能力:** SystemCapability.USB.USBManager
1438
1439| 名称        | 类型   | 必填 | 说明                                      |
1440| ----------- | ------ | ---- | ----------------------------------------- |
1441| accessoryFd | number | 是   | 配件文件描述符。合法的accessoryFd是正整数。 |
1442
1443## UsbDataTransferParams<sup>18+</sup>
1444
1445作为通用USB数据传输接口,客户端需要填充这个对象中的参数,用以发起传输请求。
1446
1447**系统能力:** SystemCapability.USB.USBManager
1448
1449| 名称         | 类型   | 必填    |说明    |
1450| ---------- | ------ | ----- |----- |
1451| devPipe | [USBDevicePipe](#usbdevicepipe) | 是 | 用于确定总线号和设备地址,需要调用connectDevice获取。 |
1452| flags | [UsbTransferFlags](#usbtransferflags18) |是 | USB传输标志。 |
1453| endpoint | number | 是 | 端点地址,正整数。 |
1454| type | [UsbEndpointTransferType](#usbendpointtransfertype18) |是 | 传输类型。 |
1455| timeout | number | 是 | 超时时间,单位为毫秒。 |
1456| length | number |是 | 数据缓冲区的长度,必须是非负数(期望长度),单位为字节。 |
1457| callback | AsyncCallback<[SubmitTransferCallback](#submittransfercallback18)> |是 | 传输完成时的回调信息。|
1458| userData | Uint8Array | 是 | 用户上下文数据。 |
1459| buffer | Uint8Array | 是 | 用于存储读或者写请求时的数据。 |
1460| isoPacketCount | number | 是 | 实时传输时数据包的数量,仅用于具有实时传输端点的I/O。必须是非负数,单位为个数。 |
1461
1462## UsbTransferFlags<sup>18+</sup>
1463
1464USB传输标志。
1465
1466**系统能力:** SystemCapability.USB.USBManager
1467
1468| 名称                         | 值   | 说明   |
1469| ---------------------------- | ---- | ------ |
1470| USB_TRANSFER_SHORT_NOT_OK    | 0    | 将短帧报告为错误。 |
1471| USB_TRANSFER_FREE_BUFFER | 1    | 自动释放传输缓冲区。 |
1472| USB_TRANSFER_FREE_TRANSFER  | 2    | 完成回调后自动传输。 |
1473| USB_TRANSFER_ADD_ZERO_PACKET     | 3    | 传输将增加一个额外的数据包。 |
1474
1475## UsbEndpointTransferType<sup>18+</sup>
1476
1477Usb传输类型。
1478
1479**系统能力:** SystemCapability.USB.USBManager
1480
1481| 名称                         | 值   | 说明   |
1482| ---------------------------- | ---- | ------ |
1483| TRANSFER_TYPE_ISOCHRONOUS | 0x1    | 实时传输。 |
1484| TRANSFER_TYPE_BULK  | 0x2    | 批量传输。 |
1485| TRANSFER_TYPE_INTERRUPT     | 0x3    | 中断传输。|
1486
1487## SubmitTransferCallback<sup>18+</sup>
1488
1489Usb异步传输回调。
1490
1491**系统能力:** SystemCapability.USB.USBManager
1492
1493| 名称        | 类型 | 必填   | 说明    |
1494| ---------- | ------ | ----- | ------ |
1495| actualLength | number |  是 |读写操作的实际长度值,单位为字节。 |
1496| status | [UsbTransferStatus](#usbtransferstatus18) | 是 |读写操作完成的状态。 |
1497| isoPacketDescs | Array<Readonly<[UsbIsoPacketDescriptor](#usbisopacketdescriptor18)>> | 是 |实时传输的分包信息。 |
1498
1499## UsbTransferStatus<sup>18+</sup>
1500
1501数据处理完成后通过回调返回的状态码。
1502
1503**系统能力:** SystemCapability.USB.USBManager
1504
1505| 名称                         | 值   | 说明   |
1506| ---------------------------- | ---- | ------ |
1507| TRANSFER_COMPLETED    | 0    | 传输完成。|
1508| TRANSFER_ERROR | 1    | 传输失败。 |
1509| TRANSFER_TIMED_OUT  | 2    | 传输超时。 |
1510| TRANSFER_CANCELED     | 3    |传输已被取消。 |
1511| TRANSFER_STALL  | 4    | 检测到暂停(批量/中断端点)。|
1512| TRANSFER_NO_DEVICE     | 5    | 设备已断开。|
1513| TRANSFER_OVERFLOW     | 6    | 设备发送的数据比请求的多。|
1514
1515## UsbIsoPacketDescriptor<sup>18+</sup>
1516
1517实时传输模式回调返回的分包信息。
1518
1519**系统能力:** SystemCapability.USB.USBManager
1520
1521| 名称         | 类型 | 必填 | 说明    |
1522| ---------- | ------ | ----- | ------ |
1523| length | number | 是 |读写操作的期望长度值,单位为字节。 |
1524| actualLength | number| 是 |读写操作的实际长度值,单位为字节。 |
1525| status | [UsbTransferStatus](#usbtransferstatus18) | 是 |实时传输分包的状态码。 |
1526