Android 至 android 使用 USB 进行数据传输
Android to android data transfer using usb
我创建了一个应用程序,可以通过 wifi 将数据从 android 传输到 android。我正在探索 usb 主机 api 以添加对通过 usb 进行数据传输的支持。我正在关注 android 主机 API 文档
https://developer.android.com/guide/topics/connectivity/usb/host
并遵循所有步骤。到目前为止,我能够授予所选设备的权限让我们说 phone "A" 并成功打开 USB 设备写入数据,但我不知道如何 create/access usbdevice on other phone "B"?我看到其他 phone 未收到有关 usb attached/unattached 事件的通知。当我添加 "android.hardware.usb.action.USB_STATE" 时,另一方会收到事件更改通知,但我不知道如何 get/access phone "B" 上的 usbdevice 对象来初始化 read/write 数据?当前的主机协议是否是单边协议?在这方面的任何帮助将不胜感激。
Phone B是UsbDevice,它应该使用USB Accessory功能来连接Accessory host(Phone A)。
Phone B 选择to accessory usb gadget function,即Phone B的sys.usb.config = accessory。 [getprop sys.usb.config => 附件]
App级设计参考AOA:
https://source.android.com/devices/accessories/protocol
https://developer.android.com/guide/topics/connectivity/usb/accessory.html#java
UsbAccessory accessory;
ParcelFileDescriptor fileDescriptor;
FileInputStream inputStream;
FileOutputStream outputStream;
...
private void openAccessory() {
Log.d(TAG, "openAccessory: " + accessory);
fileDescriptor = usbManager.openAccessory(accessory);
if (fileDescriptor != null) {
FileDescriptor fd = fileDescriptor.getFileDescriptor();
inputStream = new FileInputStream(fd);
outputStream = new FileOutputStream(fd);
Thread thread = new Thread(null, this, "AccessoryThread");
thread.start();
}
}
进一步阅读后,我确定了问题所在。我必须通过发送特殊的 controlTransfer 消息从主机强制设备进入附件模式。
我在这里找到了
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_MANUFACTURER, MANUFACTURER);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_MODEL, MODEL);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_DESCRIPTION, DESCRIPTION);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_VERSION, VERSION);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_URI, URI);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_SERIAL, SERIAL);
// The device should re-enumerate as an accessory.
conn.controlTransfer(UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR,
UsbAccessoryConstants.ACCESSORY_START, 0, 0, null, 0, 10000);
我创建了一个应用程序,可以通过 wifi 将数据从 android 传输到 android。我正在探索 usb 主机 api 以添加对通过 usb 进行数据传输的支持。我正在关注 android 主机 API 文档
https://developer.android.com/guide/topics/connectivity/usb/host
并遵循所有步骤。到目前为止,我能够授予所选设备的权限让我们说 phone "A" 并成功打开 USB 设备写入数据,但我不知道如何 create/access usbdevice on other phone "B"?我看到其他 phone 未收到有关 usb attached/unattached 事件的通知。当我添加 "android.hardware.usb.action.USB_STATE" 时,另一方会收到事件更改通知,但我不知道如何 get/access phone "B" 上的 usbdevice 对象来初始化 read/write 数据?当前的主机协议是否是单边协议?在这方面的任何帮助将不胜感激。
Phone B是UsbDevice,它应该使用USB Accessory功能来连接Accessory host(Phone A)。 Phone B 选择to accessory usb gadget function,即Phone B的sys.usb.config = accessory。 [getprop sys.usb.config => 附件]
App级设计参考AOA:
https://source.android.com/devices/accessories/protocol https://developer.android.com/guide/topics/connectivity/usb/accessory.html#java
UsbAccessory accessory;
ParcelFileDescriptor fileDescriptor;
FileInputStream inputStream;
FileOutputStream outputStream;
...
private void openAccessory() {
Log.d(TAG, "openAccessory: " + accessory);
fileDescriptor = usbManager.openAccessory(accessory);
if (fileDescriptor != null) {
FileDescriptor fd = fileDescriptor.getFileDescriptor();
inputStream = new FileInputStream(fd);
outputStream = new FileOutputStream(fd);
Thread thread = new Thread(null, this, "AccessoryThread");
thread.start();
}
}
进一步阅读后,我确定了问题所在。我必须通过发送特殊的 controlTransfer 消息从主机强制设备进入附件模式。
我在这里找到了
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_MANUFACTURER, MANUFACTURER);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_MODEL, MODEL);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_DESCRIPTION, DESCRIPTION);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_VERSION, VERSION);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_URI, URI);
sendString(conn, UsbAccessoryConstants.ACCESSORY_STRING_SERIAL, SERIAL);
// The device should re-enumerate as an accessory.
conn.controlTransfer(UsbConstants.USB_DIR_OUT | UsbConstants.USB_TYPE_VENDOR,
UsbAccessoryConstants.ACCESSORY_START, 0, 0, null, 0, 10000);