• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# USB服务开发指导
2
3<!--Kit: Basic Services Kit-->
4<!--Subsystem: USB-->
5<!--Owner: @hwymlgitcode-->
6<!--Designer: @w00373942-->
7<!--Tester: @dong-dongzhen-->
8<!--Adviser: @w_Machine_cc-->
9
10## 场景介绍
11
12Host模式下,可以获取到已经连接的USB设备列表,并根据需要打开和关闭设备、控制设备权限、进行数据传输等。
13
14
15## 接口说明
16
17USB服务主要提供的功能有:查询USB设备列表、批量数据传输、控制命令传输、权限控制等。
18
19USB类开放能力如下,具体请查阅[API参考文档](../../reference/apis-basic-services-kit/js-apis-usbManager.md)。
20
21**表1** USB类的开放能力接口
22
23| 接口名                                                       | 描述                                                         |
24| ------------------------------------------------------------ | ------------------------------------------------------------ |
25| hasRight(deviceName: string): boolean                         | 判断是否有权访问该设备。 |
26| requestRight(deviceName: string): Promise&lt;boolean&gt;       | 请求软件包的临时权限以访问设备。使用Promise异步回调。                        |
27| removeRight(deviceName: string): boolean | 移除软件包对设备的访问权限。|
28| connectDevice(device: USBDevice): Readonly&lt;USBDevicePipe&gt; | 根据`getDevices()`返回的设备信息打开USB设备。如果USB服务异常,可能返回`undefined`,注意需要对接口返回值做判空处理。                |
29| getDevices(): Array&lt;Readonly&lt;USBDevice&gt;&gt;          | 获取接入主设备的USB设备列表。如果没有设备接入,那么将会返回一个空的列表。开发者模式关闭时,如果没有设备接入,接口可能返回`undefined`,注意需要对接口返回值做判空处理。                                            |
30| setConfiguration(pipe: USBDevicePipe, config: USBConfiguration): number | 设置设备的配置。                                             |
31| setInterface(pipe: USBDevicePipe, iface: USBInterface): number   | 设置设备的接口。                                             |
32| claimInterface(pipe: USBDevicePipe, iface: USBInterface, force ?: boolean): number | 注册通信接口。                                                   |
33| bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout ?: number): Promise&lt;number&gt; | 批量传输。                                                   |
34| closePipe(pipe: USBDevicePipe): number                         | 关闭设备消息控制通道。                                       |
35| releaseInterface(pipe: USBDevicePipe, iface: USBInterface): number | 释放注册过的通信接口。                                                   |
36| getFileDescriptor(pipe: USBDevicePipe): number                 | 获取文件描述符。                                             |
37| getRawDescriptor(pipe: USBDevicePipe): Uint8Array              | 获取原始的USB描述符。如果USB服务异常,可能返回`undefined`,注意需要对接口返回值做判空处理。                                        |
38| usbControlTransfer(pipe: USBDevicePipe, requestparam: USBDeviceRequestParams, timeout?: number): Promise&lt;number&gt; | 控制传输。                                                   |
39
40
41## 开发步骤
42
43USB设备可作为Host设备连接Device设备进行数据传输。开发示例如下:
44
45
461. 获取设备列表。
47
48   ```ts
49   // 导入USB接口api包。
50   import { usbManager } from '@kit.BasicServicesKit';
51   // 获取设备列表。
52   let deviceList : Array<usbManager.USBDevice> = usbManager.getDevices();
53   /*
54   deviceList结构示例
55   [
56     {
57       name: "1-1",
58       serial: "",
59       manufacturerName: "",
60       productName: "",
61       version: "",
62       vendorId: 7531,
63       productId: 2,
64       clazz: 9,
65       subClass: 0,
66       protocol: 1,
67       devAddress: 1,
68       busNum: 1,
69       configs: [
70         {
71           id: 1,
72           attributes: 224,
73           isRemoteWakeup: true,
74           isSelfPowered: true,
75           maxPower: 0,
76           name: "1-1",
77           interfaces: [
78             {
79               id: 0,
80               protocol: 0,
81               clazz: 9,
82               subClass: 0,
83               alternateSetting: 0,
84               name: "1-1",
85               endpoints: [
86                 {
87                   address: 129,
88                   attributes: 3,
89                   interval: 12,
90                   maxPacketSize: 4,
91                   direction: 128,
92                   number: 1,
93                   type: 3,
94                   interfaceId: 0,
95                 }
96               ]
97             }
98           ]
99         }
100       ]
101     }
102   ]
103   */
104   ```
105
1062. 获取设备操作权限。
107
108   ```ts
109   import { usbManager } from '@kit.BasicServicesKit';
110   import { BusinessError } from '@kit.BasicServicesKit';
111
112   let deviceName : string = deviceList[0].name;
113   // 申请操作指定的device的操作权限。
114   usbManager.requestRight(deviceName).then((hasRight : boolean) => {
115     console.info(`usb device request right result: ${hasRight}`);
116   }).catch((error : BusinessError)=> {
117     console.error(`usb device request right failed : ${error}`);
118   });
119   ```
120
1213. 打开Device设备。
122
123   ```ts
124   // 打开设备,获取数据传输通道。
125   let pipe : usbManager.USBDevicePipe = usbManager.connectDevice(deviceList[0]);
126   let interface1 : usbManager.USBInterface = deviceList[0].configs[0].interfaces[0];
127   /*
128    打开对应接口,在设备信息(deviceList)中选取对应的interface。
129   interface1为设备配置中的一个接口。
130   */
131   usbManager.claimInterface(pipe, interface1, true);
132   ```
133
1344. 数据传输。当前仅支持批量传输和控制传输。
135
136    - 批量传输
137
138    ```ts
139    import { usbManager } from '@kit.BasicServicesKit';
140    import { BusinessError } from '@kit.BasicServicesKit';
141    /*
142      读取数据,在device信息中选取对应数据接收的endpoint来做数据传输
143endpoint.direction == 0x80);dataUint8Array是要读取的数据,类型为Uint8Array。
144    */
145    let inEndpoint : usbManager.USBEndpoint = interface1.endpoints[2];
146    let outEndpoint : usbManager.USBEndpoint = interface1.endpoints[1];
147    let dataUint8Array : Uint8Array = new Uint8Array(1024);
148    usbManager.bulkTransfer(pipe, inEndpoint, dataUint8Array, 15000).then((dataLength : number) => {
149    if (dataLength >= 0) {
150      console.info(`usb readData result Length : ${dataLength}`);
151    } else {
152      console.error(`usb readData failed`);
153    }
154    }).catch((error : BusinessError) => {
155    console.error(`usb readData error : ${error}`);
156    });
157    // 发送数据,在device信息中选取对应数据发送的endpoint来做数据传输。(endpoint.direction == 0)
158    usbManager.bulkTransfer(pipe, outEndpoint, dataUint8Array, 15000).then((dataLength : number) => {
159      if (dataLength >= 0) {
160        console.info(`usb writeData result write length : ${dataLength}`);
161      } else {
162        console.error("usb writeData failed");
163      }
164    }).catch((error : BusinessError) => {
165      console.error(`usb writeData error : ${error}`);
166    });
167    ```
168
169    - 控制传输
170
171    ```ts
172    import { usbManager } from '@kit.BasicServicesKit';
173    import { BusinessError } from '@kit.BasicServicesKit';
174
175    /*
176      构造控制传输参数
177    */
178    let param: usbManager.USBDeviceRequestParams = {
179      bmRequestType: 0x80,    //0x80指一次由设备到主机的标准请求命令
180      bRequest: 0x06,    //0x06指获取描述符
181      wValue:0x01 << 8 | 0,    //该值为2个字节,高字节指描述符类型,此处0x01指设备描述符;低字节指描述符索引,设备描述符不涉及,填0
182      wIndex: 0,    //索引值,可填0
183      wLength: 18,    //描述符的长度,此处18表示设备描述符长度,最大支持1024
184      data: new Uint8Array(18)
185    };
186
187    usbManager.usbControlTransfer(pipe, param).then((ret: number) => {
188    console.info(`usbControlTransfer = ${ret}`);
189    })
190    ```
191
1925. 释放接口,关闭设备。
193
194   ```ts
195   usbManager.releaseInterface(pipe, interface1);
196   usbManager.closePipe(pipe);
197   ```
198
199## 相关实例
200
201针对USB管理开发,有以下相关实例可供参考:
202
203- [`DeviceManagementCollection`:设备管理合集(ArkTS)(API9)](https://gitcode.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/DeviceManagement/DeviceManagementCollection)