【问题标题】:USB communication between Android (accessory mode) and Windows PC (host)Android(附件模式)和Windows PC(主机)之间的USB通信
【发布时间】:2013-04-03 10:40:11
【问题描述】:

我尝试在我的笔记本电脑 (win7) 和我的安卓手机 (Android 4.2) 之间建立 USB 连接。 笔记本电脑应作为主机为安卓手机供电。目标是笔记本和手机可以发送和接收xml字符串

我尝试关注解释附件模式的 android 页面 (http://developer.android.com/guide/topics/connectivity/usb/accessory.html)。

  • 1: 我必须像他们在这里那样定义一个附件过滤器吗:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
    </resources>
    

    因为我不想识别特殊硬件。我希望能够识别所有类型的 Windows 计算机(例如,我将手机插入另一台计算机)。

  • 2: 我现在什么都没做。我只是按照android页面,插入usb电缆并观看日志。应用程序 startet 请求许可,但附件为空。任何提示为什么它为空? 代码:

    public class MainActivity extends Activity {
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    private static final String TAG = "USB_PERMISSION";
    UsbAccessory accessory;
    
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0,
            new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    registerReceiver(mUsbReceiver, filter);
    accessory = (UsbAccessory) getIntent().getParcelableExtra(
            UsbManager.EXTRA_ACCESSORY);
    manager.requestPermission(accessory, mPermissionIntent);
     }
    
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    String manufacturer;
                    Log.d(TAG, "permission accepted for accessory " + accessory);
                    if (accessory != null) {
                        manufacturer = accessory.getManufacturer();
                        Log.d(TAG, "Manufacturer: " + manufacturer);                        }
                } else {
                    Log.d(TAG, "permission denied for accessory "+ accessory);
                }
            }
        }
    }
    };
    }
    
  • 3:是否有任何库/项目可用于识别 Windows 端的 USB 连接?

  • 4:还有什么我应该考虑的吗?有什么问题吗?
  • 5:感谢您的帮助 :)

【问题讨论】:

  • 所以我猜#1 现在更清楚了。 Intentfilter 仅用于自动检测

标签: java android windows usb communication


【解决方案1】:

您应该在主机端(在您的情况下是 Windows)上有一个应用程序,它将要求 Android 进入附件模式。当它询问时,您将看到是否给予许可的选项。您有空附件,因为没有连接附件,它遵循 AOAP 发起通信。 因此,可以拥有未运行 Android 的附属设备并使用 AOAP 与其通信。

您可以在 USB 文件夹中的 android SDK 示例中找到适用于 Android 端的示例。

【讨论】:

  • 以及如何实现任何源应用程序?
  • 你有没有找到任何示例 pc 端来接收来自 android 的数据?
  • @seed 其实我没用过。一旦可以开始使用它,我就熟悉了它,但是它被推迟了,从那时起我就没有处理过它。但是,我认为一旦您了解协议,弄清楚它应该没什么大不了的。
  • @helleye 你的意思是我在安卓手机中的应用程序可以通过 USB 实际响应窗口?我之前有类似的要求,我在 windows 中使用 adb 与我的应用程序通信,我的应用程序用于在我的 windows 应用程序读取文件的预定义路径上创建文本文件。
  • @Calvin 是的,这就是附件模式的意义所在。你应该遵循AOA协议,你可以从阅读source.android.com/devices/accessories/protocol.html开始
【解决方案2】:

是的,你需要在Windows端使用WinUSB/libusb API来做主机工作,把Android转成附件模式,然后互相通话

【讨论】:

    【解决方案3】:

    您获得 0 附件的原因是因为您的 Android USB 端口没有连接附件设备,您的场景是使用 Windows PC 作为主机(您可以尝试编写一个 定制的WinUSB驱动),Android设备是纯USB设备,与AOA无关,当你从主机(Windows或macOS)发送模式切换请求时,Android设备进入附件模式,本身是附件,您将使用 getAccessoryList 找到一个附件。 顺便说一句,我通过 libusb 让 Windows 和 macOS 与 Android 一起工作。

    【讨论】:

      【解决方案4】:

      好的,我想我自己找到了答案。 Android USB 附件模式仅适用于 Android 手机和其他运行 Android 的设备(如 Arduino)之间。 所以这个设置是不可能的。

      【讨论】:

      • 这个答案不正确 - Arduino 不运行 Android,USB 主机也不需要这样做。但是,它确实需要能够以支持 USB 附件模式所需的特定方式进行通话。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多