• 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
12批量传输主要应用在传输和接收大量数据同时又没有带宽和间隔时间要求的情况下,例如传输文件、图像等场景,打印机和扫描仪等设备属于这种类型的设备。
13
14## 环境准备
15
16### 环境要求
17
18- 开发工具及配置:
19
20  DevEco Studio作为驱动开发工具,是进行驱动开发必备条件之一,开发者可以使用该工具进行开发、调试、打包等操作。请[下载安装](https://developer.huawei.com/consumer/cn/download/)该工具,并参考[DevEco Studio使用指南](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-tools-overview)中的[创建工程及运行](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-create-new-project)进行基本的操作验证,保证DevEco Studio可正常运行。
21
22
23- SDK版本配置:
24
25  扩展外设管理提供的ArkTs接口,所需SDK版本为API16及以上才可使用。
26
27
28- HDC配置:
29
30  HDC(HarmonyOS Device Connector)是为开发人员提供的用于调试的命令行工具,通过该工具可以在Windows/Linux/Mac系统上与真实设备或者模拟器进行交互,详细参考[HDC配置](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hdc)31
32### 搭建环境
33
34- 在PC上安装[DevEco Studio](https://developer.huawei.com/consumer/cn/download/deveco-studio),要求版本在4.1及以上。
35- 将public-SDK更新到API 16或以上<!--Del-->,更新SDK的具体操作可参见[更新指南](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/faqs/full-sdk-switch-guide.md)<!--DelEnd-->。
36- PC安装HDC工具,通过该工具可以在Windows/Linux/Mac系统上与真实设备或者模拟器进行交互。
37- 用USB线缆将搭载OpenHarmony的设备连接到PC。
38
39## 开发指导
40
41### 接口说明
42
43| 接口名                                                                                                               | 描述                    |
44|-------------------------------------------------------------------------------------------------------------------|-----------------------|
45| bulkTransfer(pipe: USBDevicePipe, endpoint: USBEndpoint, buffer: Uint8Array, timeout ?: number): Promise&lt;number&gt;  | 批量传输。                 |
46
47更多关于设备管理和传输模式的详细接口介绍,请查阅[API参考文档](../../../../reference/apis-basic-services-kit/js-apis-usbManager.md)。
48
49### 开发步骤
50
51主机(Host)连接设备(Device),通过`bulkTransfer`接口进行数据传输。以下步骤描述了如何使用批量传输方式来传输数据:
52
53> **说明:**
54>
55> 以下示例代码只是使用批量传输方式来传输数据的必要流程,需要放入具体的方法中执行。在实际调用时,设备开发者需要遵循设备相关协议进行调用,确保数据的正确传输和设备的兼容性。
56
571. 导入模块。
58
59   ```ts
60   // 导入usbManager模块。
61   import { usbManager } from '@kit.BasicServicesKit';
62   import { BusinessError } from '@kit.BasicServicesKit';
63   ```
64
652. 获取设备列表。
66
67> **说明:**
68>
69> 批量传输只能在[传输类型](../../../../reference/apis-basic-services-kit/js-apis-usbManager.md#usbendpointtransfertype18)为2的端点上进行,若不匹配会返回IO错误。
70
71   ```ts
72   // 获取设备列表。
73   let deviceList : Array<usbManager.USBDevice> = usbManager.getDevices();
74   console.info(`deviceList: ${deviceList}`);
75   if(deviceList.length === 0) {
76     console.error('deviceList is empty');
77     return;
78   }
79   /*
80   deviceList结构示例
81   [
82     {
83       name: "1-1",
84       serial: "",
85       manufacturerName: "",
86       productName: "",
87       version: "",
88       vendorId: 7531,
89       productId: 2,
90       clazz: 9,
91       subClass: 0,
92       protocol: 1,
93       devAddress: 1,
94       busNum: 1,
95       configs: [
96         {
97           id: 1,
98           attributes: 224,
99           isRemoteWakeup: true,
100           isSelfPowered: true,
101           maxPower: 0,
102           name: "1-1",
103           interfaces: [
104             {
105               id: 0,
106               protocol: 0,
107               clazz: 9,
108               subClass: 0,
109               alternateSetting: 0,
110               name: "1-1",
111               endpoints: [
112                 {
113                   address: 129,
114                   attributes: 3,
115                   interval: 12,
116                   maxPacketSize: 4,
117                   direction: 128,
118                   number: 1,
119                   type: 2, // 决定传输类型。
120                   interfaceId: 0,
121                 }
122               ]
123             }
124           ]
125         }
126       ]
127     }
128   ]
129   */
130   ```
131
1323. 获取设备操作权限。
133
134   ```ts
135   let deviceName : string = deviceList[0].name;
136   // 申请操作指定的device的操作权限。
137   usbManager.requestRight(deviceName).then((hasRight : boolean) => {
138     console.info(`usb device request right result: ${hasRight}`);
139   }).catch((error : BusinessError)=> {
140     console.error(`usb device request right failed : ${error}`);
141   });
142   ```
143
1444. 打开设备。
145
146   ```ts
147   // 打开设备,获取数据传输通道。
148   let pipe : usbManager.USBDevicePipe = usbManager.connectDevice(deviceList[0]);
149   let interface1 : usbManager.USBInterface = deviceList[0].configs[0].interfaces[0];
150   /*
151    打开对应接口,在设备信息(deviceList)中选取对应的interface。
152   interface1为设备配置中的一个接口。
153   */
154   usbManager.claimInterface(pipe, interface1, true);
155   ```
156
1575. 数据传输。
158
159**说明:**
160
161> 在数据传输前建议先获取interface所属endpointer的type,通过type判断interface是否支持所需的传输类型。
162>
163> 若调用传输接口失败,请先确认设备interface是否支持[模式切换](../../../../reference/apis-basic-services-kit/js-apis-usbManager.md#usbinterface)。若alternateSetting支持切换设置,可在传输前调用[usbManager.setInterface](../../../../reference/apis-basic-services-kit/js-apis-usbManager.md#usbmanagersetinterface)重新设置interface,使端点和传输类型匹配,保证端点正常通信。
164
165    ```ts
166    /*
167      读取数据,在device信息中选取对应数据接收的endpoint来做数据传输
168endpoint.direction == 0x80);dataUint8Array是要读取的数据,类型为Uint8Array。
169    */
170    let inEndpoint : usbManager.USBEndpoint = interface1.endpoints[2];
171    let outEndpoint : usbManager.USBEndpoint = interface1.endpoints[1];
172    let dataUint8Array : Uint8Array = new Uint8Array(1024);
173    usbManager.bulkTransfer(pipe, inEndpoint, dataUint8Array, 15000).then((dataLength : number) => {
174    if (dataLength >= 0) {
175      console.info(`usb readData result Length : ${dataLength}`);
176    } else {
177      console.error("usb readData failed");
178    }
179    }).catch((error : BusinessError) => {
180    console.error(`usb readData error : ${error}`);
181    });
182    // 发送数据,在device信息中选取对应数据发送的endpoint来做数据传输。(endpoint.direction == 0)
183    usbManager.bulkTransfer(pipe, outEndpoint, dataUint8Array, 15000).then((dataLength : number) => {
184      if (dataLength >= 0) {
185        console.info(`usb writeData result write length : ${dataLength}`);
186      } else {
187        console.error("usb writeData failed");
188      }
189    }).catch((error : BusinessError) => {
190      console.error(`usb writeData error : ${error}`);
191    });
192    ```
193
1946. 释放接口,关闭设备。
195
196   ```ts
197   usbManager.releaseInterface(pipe, interface1);
198   usbManager.closePipe(pipe);
199   ```