HarmonyOS鸿蒙Next中手机APP与外置OTG设备进行通信,如何获取设备输入输出端点
HarmonyOS鸿蒙Next中手机APP与外置OTG设备进行通信,如何获取设备输入输出端点 应用场景:我们的应用场景是有一个设备需要通过手机对它进行调整参数,用的是一个type-c数据线进行HID通讯传输数据。
手机APP与OTG设备的通信,如何获取外接设备进行端点的读写
在HarmonyOS Next中,通过USB Host API与OTG设备通信。使用usb.getDevices()获取设备列表,选择目标设备后调用usb.connectDevice()连接。连接成功后,通过device.getInterfaces()获取接口,再通过接口的getEndpoint()方法获取输入输出端点。输入端点类型为USB_ENDPOINT_TYPE_BULK_IN,输出端点类型为USB_ENDPOINT_TYPE_BULK_OUT。
更多关于HarmonyOS鸿蒙Next中手机APP与外置OTG设备进行通信,如何获取设备输入输出端点的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,通过USB与OTG设备(如HID设备)通信,核心是使用@ohos.usbV3接口。要获取设备的输入/输出端点并进行读写,主要步骤如下:
-
权限声明与动态申请:
- 在
module.json5中声明ohos.permission.USB_MANAGER权限。 - 在运行时,使用
requestPermissionsFromUser动态申请权限。
- 在
-
发现与获取设备:
- 使用
usb.getDevices()获取当前连接的USB设备列表。 - 通过设备的
vendorId和productId等信息识别您的特定HID设备。
- 使用
-
打开设备与获取接口:
- 使用
usb.openDevice(device)打开目标设备。 - 从设备描述符中获取配置和接口。对于HID设备,通常对应特定的接口类(如
0x03)。 - 使用
usb.claimInterface(device, interface)声明独占该接口。
- 使用
-
获取端点地址:
- 在已声明的接口(
UsbInterface对象)中,通过endpoints属性获取该接口包含的所有端点数组。 - 遍历端点数组,根据端点的
direction属性判断方向:usb.USB_REQUEST_DIRECTION_IN对应输入端点(设备到主机)。usb.USB_REQUEST_DIRECTION_OUT对应输出端点(主机到设备)。
- 同时,您可能需要结合端点的
type(如usb.USB_REQUEST_TYPE_STANDARD)和address属性来精确定位用于数据传输的端点。
- 在已声明的接口(
-
进行端点数据传输:
- 批量传输(Bulk Transfer):对于大多数数据通信,使用
usb.bulkTransfer(device, endpoint, buffer)。您需要根据数据传输方向(读/写)传入对应的端点地址和缓冲区。 - 控制传输(Control Transfer):用于设备配置或标准请求,使用
usb.controlTransfer(device, controlparam, buffer)。 - 中断传输(Interrupt Transfer):HID设备常用,使用
usb.interruptTransfer(device, endpoint, buffer)。
- 批量传输(Bulk Transfer):对于大多数数据通信,使用
关键代码片段示例(获取端点与中断传输):
import usb from '@ohos.usbV3';
// ... 权限申请、设备发现与打开、接口声明等步骤 ...
// 假设已获取到目标接口 targetInterface
let endpoints = targetInterface.endpoints;
let inEndpoint = null; // 输入端点
let outEndpoint = null; // 输出端点
for (let endpoint of endpoints) {
if (endpoint.direction === usb.USB_REQUEST_DIRECTION_IN) {
inEndpoint = endpoint;
} else if (endpoint.direction === usb.USB_REQUEST_DIRECTION_OUT) {
outEndpoint = endpoint;
}
}
// 使用中断传输从输入端点读取数据
if (inEndpoint) {
let buffer = new ArrayBuffer(64); // 根据端点包大小创建缓冲区
usb.interruptTransfer(device, inEndpoint, buffer).then(data => {
console.info('读取到数据:', data);
}).catch(error => {
console.error('读取失败:', error);
});
}
// 使用中断传输向输出端点写入数据
if (outEndpoint) {
let dataToSend = new Uint8Array([0x01, 0x02, 0x03]); // 示例数据
usb.interruptTransfer(device, outEndpoint, dataToSend.buffer).then(() => {
console.info('写入成功');
}).catch(error => {
console.error('写入失败:', error);
});
}
注意事项:
- 请确保您的HID设备符合USB HID类规范,并了解其报告描述符格式。
- 数据传输的缓冲区大小需匹配端点描述符中定义的
maxPacketSize。 - 操作完成后,务必调用
usb.releaseInterface(device, interface)释放接口,并调用usb.closeDevice(device)关闭设备连接。
通过以上步骤,您可以实现HarmonyOS Next手机APP与OTG外置HID设备之间的端点识别与数据读写。

