HarmonyOS鸿蒙Next中手机APP与外置OTG设备进行通信,如何获取设备输入输出端点

HarmonyOS鸿蒙Next中手机APP与外置OTG设备进行通信,如何获取设备输入输出端点 应用场景:我们的应用场景是有一个设备需要通过手机对它进行调整参数,用的是一个type-c数据线进行HID通讯传输数据。

手机APP与OTG设备的通信,如何获取外接设备进行端点的读写

2 回复

在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接口。要获取设备的输入/输出端点并进行读写,主要步骤如下:

  1. 权限声明与动态申请

    • module.json5中声明ohos.permission.USB_MANAGER权限。
    • 在运行时,使用requestPermissionsFromUser动态申请权限。
  2. 发现与获取设备

    • 使用usb.getDevices()获取当前连接的USB设备列表。
    • 通过设备的vendorIdproductId等信息识别您的特定HID设备。
  3. 打开设备与获取接口

    • 使用usb.openDevice(device)打开目标设备。
    • 从设备描述符中获取配置和接口。对于HID设备,通常对应特定的接口类(如0x03)。
    • 使用usb.claimInterface(device, interface)声明独占该接口。
  4. 获取端点地址

    • 在已声明的接口(UsbInterface对象)中,通过endpoints属性获取该接口包含的所有端点数组。
    • 遍历端点数组,根据端点的direction属性判断方向:
      • usb.USB_REQUEST_DIRECTION_IN 对应输入端点(设备到主机)。
      • usb.USB_REQUEST_DIRECTION_OUT 对应输出端点(主机到设备)。
    • 同时,您可能需要结合端点的type(如usb.USB_REQUEST_TYPE_STANDARD)和address属性来精确定位用于数据传输的端点。
  5. 进行端点数据传输

    • 批量传输(Bulk Transfer):对于大多数数据通信,使用usb.bulkTransfer(device, endpoint, buffer)。您需要根据数据传输方向(读/写)传入对应的端点地址和缓冲区。
    • 控制传输(Control Transfer):用于设备配置或标准请求,使用usb.controlTransfer(device, controlparam, buffer)
    • 中断传输(Interrupt Transfer):HID设备常用,使用usb.interruptTransfer(device, endpoint, buffer)

关键代码片段示例(获取端点与中断传输):

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设备之间的端点识别与数据读写。

回到顶部