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<number> | 批量传输。 | 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来做数据传输 168 (endpoint.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 ```