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