You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于C#实现Android应用与Windows PC的USB通信方案咨询

问题描述

我正尝试将Android应用与Windows PC进行对接,其中Android平板作为从设备,PC作为主设备。PC将运行C# Windows服务,请问需要采用何种C#技术实现与Android设备间的USB数据收发?

我已尝试通过以下代码枚举USB设备,但不清楚如何读取USB数据:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE PNPDeviceID LIKE '%USB%'");

// Get the collection of management objects
ManagementObjectCollection collection = searcher.Get();

foreach (ManagementObject device in collection)
{
    string description = device.GetPropertyValue("Description")?.ToString() ?? "";
    string manufacturer = device.GetPropertyValue("Manufacturer")?.ToString() ?? "";

}
解决方案

1. 首选技术:LibUsbDotNet

这是.NET生态中成熟的USB通信库,完美支持Windows服务环境,能直接与USB设备的端点进行数据交互,无需依赖复杂的原生API封装。

实现步骤:

  • 安装NuGet包:Install-Package LibUsbDotNet
  • 通过设备的VID(厂商ID)和PID(产品ID)定位目标Android设备(需提前在Android端配置对应信息)
  • 打开设备、获取USB接口、设置设备配置,最后通过IN/OUT端点完成读写操作

示例代码:

using LibUsbDotNet;
using LibUsbDotNet.Main;

// 替换为你的Android设备实际VID和PID
private const int TargetVendorId = 0x18D1;
private const int TargetProductId = 0x4EE2;

public void UsbDataTransfer()
{
    UsbDevice targetDevice = UsbDevice.OpenUsbDevice(new UsbDeviceFinder(TargetVendorId, TargetProductId));
    if (targetDevice == null)
    {
        // 设备未找到,添加错误处理逻辑
        return;
    }

    // 打开Android设备默认的USB接口(通常为接口0)
    UsbInterface usbInterface = targetDevice.OpenUsbInterface(0);
    usbInterface.ClaimInterface();

    // 从IN端点读取数据(Android端通常配置IN端点地址为0x81)
    byte[] readBuffer = new byte[1024];
    int readBytes = usbInterface.Read(readBuffer, 0, readBuffer.Length, 1000);
    if (readBytes > 0)
    {
        string receivedData = System.Text.Encoding.UTF8.GetString(readBuffer, 0, readBytes);
        // 处理接收到的数据
    }

    // 向OUT端点写入数据(Android端通常配置OUT端点地址为0x01)
    byte[] writeBuffer = System.Text.Encoding.UTF8.GetBytes("PC发送的测试数据");
    int writeBytes = usbInterface.Write(writeBuffer, 0, writeBuffer.Length, 1000);

    // 释放资源
    usbInterface.ReleaseInterface();
    targetDevice.Close();
}

2. 替代方案:原生WinUSB API(P/Invoke)

如果需要更底层的控制,可直接通过P/Invoke调用Windows原生WinUSB API,适合对性能或兼容性有特殊要求的场景。

核心要点:

  • 使用SetupDiGetClassDevs、SetupDiEnumDeviceInterfaces系列函数枚举USB设备,获取设备路径
  • 调用WinUsb_Initialize初始化设备句柄
  • 通过WinUsb_ReadPipe和WinUsb_WritePipe完成数据传输
  • 注意:需确保Android设备的驱动支持WinUSB,可通过Zadig工具替换设备驱动

3. 关于你当前的枚举代码

你使用的Win32_PnPEntity仅能获取设备的基本描述信息,无法直接进行USB数据通信。建议替换为LibUsbDotNet的设备枚举逻辑,或者通过SetupDi系列函数获取USB设备的专用信息(如设备路径、端点配置)。

Android端配合要求

  • 若PC作为USB主设备,Android作为从设备,需在Android端配置USB Accessory模式或自定义USB设备类:
    • 在Manifest中添加权限:
      <uses-feature android:name="android.hardware.usb.accessory" />
      <uses-permission android:name="android.permission.USB_ACCESSORY" />
      
    • 实现USB Accessory的广播接收逻辑,处理PC设备的连接请求,建立数据传输通道

内容的提问来源于stack exchange,提问作者Khaled Telfah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:12:45