基于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设备的连接请求,建立数据传输通道
- 在Manifest中添加权限:
内容的提问来源于stack exchange,提问作者Khaled Telfah
相关产品推荐
相关产品推荐

