精华内容
下载资源
问答
  • Android AOA协议

    2017-03-08 13:51:15
    Android AOA协议
  • Android USB AOA协议

    2017-03-08 13:55:37
    Android USB AOA协议
  • AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB...
  • 基于AOA协议实现Android设备的USB通信.pdf
  • Android平台下AOA协议的PWM控制系统.pdf
  • Andriod AOA协议通信总结

    千次阅读 2019-07-20 17:31:49
    Andriod AOA协议通信总结 Android从3.1版本可开始引进了对 AOA协议 ( Android Open Accessory Protocol) 的支持,这是一种允许外部USB硬件与Android设备进行交互的特殊Accessory模式。 Android 开放配件 (AOA) 支持...

    Andriod AOA协议通信总结

    Android从3.1版本可开始引进了对 AOA协议 ( Android Open Accessory Protocol) 的支持,这是一种允许外部USB硬件与Android设备进行交互的特殊Accessory模式。

    Android 开放配件 (AOA) 支持功能可让外部 USB 硬件(Android USB 配件)与处于配件模式下的 Android 设备进行交互。当某台 Android 设备处于配件模式时,所连接的配件会充当 USB 主机(为总线供电并列举设备),而 Android 设备则充当 USB 配件。
    Android USB 配件专门用于和 Android 设备相连。这些配件遵循 AOA 要求,从而能够检测到支持配件模式的 Android 设备,并且必须提供 500 毫安(电压为 5 伏)的充电电流。之前发布的部分 Android 设备只能充当 USB 设备,无法发起与外部 USB 设备的连接。AOA 支持功能打破了这一局限,让您能够构建可以与各种 Android 设备建立连接并与其进行交互的配件。

    USB accessory overview

    USB accessory mode allows users to connect USB host hardware specifically designed for Android-powered devices. The accessories must adhere to the Android accessory protocol outlined in the Android Accessory Development Kit documentation. This allows Android-powered devices that cannot act as a USB host to still interact with USB hardware. When an Android-powered device is in USB accessory mode, the attached Android USB accessory acts as the host, provides power to the USB bus, and enumerates connected devices. Android 3.1 (API level 12) supports USB accessory mode and the feature is also backported to Android 2.3.4 (API level 10) to enable support for a broader range of devices.

    USB host overview

    When your Android-powered device is in USB host mode, it acts as the USB host, powers the bus, and enumerates connected USB devices. USB host mode is supported in Android 3.1 and higher.

    官网上也有对相应API的说明演示,但是不全,无法使用。实际开发还是要AOA协议结合API一起使用才行。

    一、Host端流程

    Created with Raphaël 2.2.0 开始 主机Host与从机Accessory连接 主机Host检测已连接设备 检测到Accessory设备? 判断是否有USB权限? 按照AOA协议发生指令建立连接 发送数据 结束并释放资源 yes no yes no

    host端发送数据总的流程如上图。示例代码如下

    1、AndroidManifest.xml配置

    需要添加如下feature

    <uses-feature android:name="android.hardware.usb.host"/>
    

    在对应的activity中添加intent-filter,通过vnd.android.document/root 及 UsbManager.ACTION_USB_ACCESSORY_ATTACHED广播可以监听设备插入自启动

            <!-- 添加activity自启动,这里采用的是vnd.android.document/root 也可以监听UsbManager.ACTION_USB_ACCESSORY_ATTACHED-->
            <activity android:name=".activity.MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:mimeType="vnd.android.document/root" />
                </intent-filter>
            </activity>
    

    2、检测USB权限

    Activity启动说明检测到设备插入,此时判断应用是否已经被授权。应用如果是system的,系统自带PASS,代码如下

    private UsbManager mUsbManager;
    private OpenDevicesReceiver  mOpenDevicesReceiver;
    
    ...
    private void openDevices() {
        mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(USB_ACTION), 0);
        IntentFilter intentFilter = new IntentFilter(USB_ACTION);
        mOpenDevicesReceiver = new OpenDevicesReceiver(this);
        registerReceiver(mOpenDevicesReceiver, intentFilter);
    
        if (mUsbManager.hasPermission(usbDevice)) {
            initAccessory(usbDevice);//已经有权限继续操作
        } else {
            mUsbManager.requestPermission(usbDevice, pendingIntent);//申请权限,结果触发pendingIntent中广播
        }
    }
    
    ...
    
    // 申请USB权限的广播
    class OpenDevicesReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                if (usbDevice != null) {
                     initAccessory(usbDevice);//已获取权限继续操作
                } else {
                    //usbDevice 为 null
                }
            } else {
                //未获取权限
            }
        }
    }
    
    

    3、与Accessory建立连接

    根据AOA协议需要发送三种指令:

    1.发送 51 控制请求(“获取协议”)以确定设备是否支持 Android 配件协议。如果设备支持协议,则返回一个非零数字,代表所支持的协议版本。该控制请求为端点 0 上的请求,具有以下特征:

    requestType: USB_DIR_IN | USB_TYPE_VENDOR
    request: 51
    value: 0
    index: 0
    data: protocol version number (16 bits little endian sent from the
    device to the accessory)

    2.如果设备返回所支持的协议版本,则向设备发送含标识字符串信息的控制请求。该信息让设备可以确定适合配件的应用(如果没有适合配件的应用,则向用户呈现一个网址)。该控制请求为端点 0 上的请求(适用每个字符串 ID),具有以下特征:

    requestType: USB_DIR_OUT | USB_TYPE_VENDOR
    request: 52
    value: 0
    index: string ID
    data zero terminated UTF8 string sent from accessory to device

    支持以下字符串 ID,并且每个字符串的最大值为 256 个字节(必须以零结束,以 \0 结尾)。

    manufacturer name: 0
    model name: 1
    description: 2
    version: 3
    URI: 4
    serial number: 5

    3.发送控制请求,要求设备以配件模式启动。该控制请求为端点 0 上的请求,具有以下特征:

    requestType: USB_DIR_OUT | USB_TYPE_VENDOR
    request: 53
    value: 0
    index: 0
    data: none

    发送代码如下,第一条指令的作用就是获取AOA版本号,可以省略。

        private void initAccessory(UsbDevice usbDevice) {
            UsbDeviceConnection usbDeviceConnection = mUsbManager.openDevice(usbDevice);
            if (usbDeviceConnection == null) {
                // 建立连接失败
                return;
            }
    
            // 发送51指令  可以省略
            byte[] bytes = new byte[]{(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,
                    (byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,
                    (byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,
                    (byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02};
    
            int i = usbDeviceConnection.controlTransfer(0xc0, 51, 0, 0, bytes, 16, 100);
            Log.i(TAG, "i " + i);
    
            // 发送52指令,MANUFACTURER MODEL  VERSION 对应Accessory端 xml中配置,其余的可自行填补,省略亦可。
            initStringControlTransfer(usbDeviceConnection, 0, "Demo, Inc."); // MANUFACTURER
            initStringControlTransfer(usbDeviceConnection, 1, "AccessoryChat"); // MODEL
            initStringControlTransfer(usbDeviceConnection, 2, "Accessory Demo"); // DESCRIPTION
            initStringControlTransfer(usbDeviceConnection, 3, "1.1"); // VERSION
            initStringControlTransfer(usbDeviceConnection, 4, "http://www.android.com"); // URI
            initStringControlTransfer(usbDeviceConnection, 5, "0123456789"); // SERIAL
    
            // 发送53指令
            usbDeviceConnection.controlTransfer(0x40, 53, 0, 0, new byte[]{}, 0, 100);
    
            // 释放资源
            usbDeviceConnection.close();
    
            // 启动AOA连接后一些参数初始化
            initDevice();
        }
    
        private void initStringControlTransfer(UsbDeviceConnection deviceConnection, int index, String string) {
            deviceConnection.controlTransfer(0x40, 52, 0, index, string.getBytes(), string.length(), 100);
        }
    
        private void initDevice() {
            Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
    
                    // 发送过AOA指令后,设备会由MTP,ADB 变成 Android Accessory Interface 状态
                    // AOA 当前不支持同时进行 AOA 连接和 MTP 连接。要从 AOA 切换到 MTP,配件必须首先与 USB 设备断开连接(断开物理连接或以电气等效的方式断开),然后使用 MTP 重新连接 USB 设备。
                    HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
                    Collection<UsbDevice> values = deviceList.values();
                    if (!values.isEmpty()) {
                    
                        // 一般都只有一个device,多个需要修改判断
                        for (UsbDevice usbDevice : values) {
                            int productId = usbDevice.getProductId();
    
                            // 设备ID是否符合要求,正常AOA协议发送成功建立连接后,模式和ID都会改变
                            if (productId == 0x2D00 || productId == 0x2D01) {
                                if (mUsbManager.hasPermission(usbDevice)) {
                                    mUsbDeviceConnection = mUsbManager.openDevice(usbDevice);
                                    if (mUsbDeviceConnection != null) {
                                        // 正常默认  0 是Android Accessory Interface (配件如果打开usb调试 )1表示 ADB
                                        // 所以也没必要遍历了,参数直接给0
                                        mUsbInterface = usbDevice.getInterface(0);
                                        int endpointCount = mUsbInterface.getEndpointCount();
                                        for (int i = 0; i < endpointCount; i++) {
                                            UsbEndpoint usbEndpoint = mUsbInterface.getEndpoint(i);
                                            // 获取 mUsbEndpointOut 与 mUsbEndpointIn ,分别表示输出/读取流
                                            if (usbEndpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                                                if (usbEndpoint.getDirection() == UsbConstants.USB_DIR_OUT) {
                                                    mUsbEndpointOut = usbEndpoint;
                                                } else if (usbEndpoint.getDirection() == UsbConstants.USB_DIR_IN) {
                                                    mUsbEndpointIn = usbEndpoint;
                                                }
                                            }
                                        }
                                        if (mUsbEndpointOut != null && mUsbEndpointIn != null) {
                                            // 到这里一切都正常说明连接真正OK,接下来可以使用读写数据了
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    

    4、数据流读写方式

    使用系统API即可,AOA 传输速度会比 MTP/ADB 慢一些,示例代码如下

                        try {
                            in = new FileInputStream("/storage/emulated/0/test.zip");
                        } catch (FileNotFoundException e) {
    					    Log.e(TAG, "FileNotFoundException " + e.toString());
    					    return;
                        }
    
                        // 使用bulkTransfer传输API时,最大 BUFFER SIZE 就是 16384(16k)
                        // 如果设置BUFFER 多大,多余的数据会丢失
                        byte[] bytes = new byte[16 * 1024];
                        int n = 0;
                        try {
                            while ((n = in.read(bytes, 0, bytes.length)) != -1) {
    
                                // 使用mUsbEndpointOut 表示输出,换成mUsbEndpointIn 即读取
                                i = mUsbDeviceConnection.bulkTransfer(mUsbEndpointOut, bytes, n, 3000);
    
                                // 数据 发送/读取 成功会返回数据大小byte,返回-1表示数据发送失败
                                if (i > 0) {
                                    // 数据 发送/读取 成功
                                }
                        }
                        in.close();
                        } catch (IOException e) {
    					    Log.e(TAG, "IOException " + e.toString());
    					    return;
                        }
                        Log.e(TAG, "end " + in);
    

    二、Accessory端流程

    Created with Raphaël 2.2.0 开始 检测到当前为Accessory 判断权限? 初始化IO对象 创建循环读取数据的线程 读取结束并释放资源 yes no

    Accessory端接收数据总的流程如上图。示例代码如下

    1、AndroidManifest.xml配置

    添加如下feature

        <uses-feature android:name="android.hardware.usb.accessory"/>
    

    Activity添加 USB_ACCESSORY_ATTACHED action自启动,同时需要添加meta-data,指定resource="@xml/accessory_filter"

    
            <activity android:name=".activity.MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
    
                <meta-data
                    android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
                    android:resource="@xml/accessory_filter"/>
            </activity>
    

    accessory_filter.xml 如下,和主机端发送52指令要匹配

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!--<usb-accessory />-->
        <usb-accessory
            manufacturer="OldSix, Inc."
            model="AccessoryChat"
            version="1.1"/>
    </resources>
    

    2、系统启动AOA应用

    接收到主机端发出aoa这个匹配的信息后,在SystemUI中会启动对应Activity:
    相关代码目录 frameworks/base/packages/SystemUI/src/com/android/systemui/usb/
    UsbConfirmActivity.java – 确认启动AOA应用
    UsbPermissionActivity – AOA应用(非系统应用签名)需要申请权限
    UsbAccessoryUriActivity – 无对应的AOA应用,如果主机端发送的52指令中URI有效,显示URIUsbResolverActivity – 多个匹配的应用选择器

    3、检测USB权限

    检测权限与host端类似,参数不同

    private UsbManager mUsbManager;
    
        private void initData() {
            mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    
            // 这监听ACTION_USB_ACCESSORY_DETACHED广播,当退出AOA状态时需要做一些操作
            mUsbDetachedReceiver = new UsbDetachedReceiver(this);
            IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
            registerReceiver(mUsbDetachedReceiver, filter);
    
            // 这监听权限申请广播,USB_ACTION为自定义字段
            mOpenAccessoryReceiver = new OpenAccessoryReceiver(this);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(USB_ACTION), 0);
            IntentFilter intentFilter = new IntentFilter(USB_ACTION);
            registerReceiver(mOpenAccessoryReceiver, intentFilter);
    
            UsbAccessory[] accessories = mUsbManager.getAccessoryList();
            UsbAccessory usbAccessory = (accessories == null ? null : accessories[0]);
            if (usbAccessory != null) {
                Log.i(TAG, "usbAccessory " + mUsbManager.hasPermission(usbAccessory));
                if (mUsbManager.hasPermission(usbAccessory)) {
                    openAccessory(usbAccessory);
                } else {
                    mUsbManager.requestPermission(usbAccessory, pendingIntent);
                }
            }
        }
    
    public class OpenAccessoryReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            UsbAccessory usbAccessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                if (usbAccessory != null) {
                    // 已获取权限
                } else {
                    // 异常情况
                }
            } else {
                // 未授予权限
            }
        }
    }
    

    4、读取数据

    读取数据需要开一个单独的循环线程,不断的去读buffer中数据

    private ParcelFileDescriptor mParcelFileDescriptor;
    private FileInputStream mFileInputStream;
    private FileOutputStream mFileOutputStream;
    
        private void openAccessory(UsbAccessory usbAccessory) {
            mParcelFileDescriptor = mUsbManager.openAccessory(usbAccessory);
            Log.i(TAG, "mParcelFileDescriptor " + mParcelFileDescriptor);
            if (mParcelFileDescriptor != null) {
                FileDescriptor fileDescriptor = mParcelFileDescriptor.getFileDescriptor();
                mFileInputStream = new FileInputStream(fileDescriptor);
                mFileOutputStream = new FileOutputStream(fileDescriptor);
    
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        int i = 0;
    					// 将读取的数据保存到本地文件
    					try {
                            out = new FileOutputStream("/cache/update.zip");
    					} catch (FileNotFoundException e) {
    					    Log.e(TAG, "FileNotFoundException " + e.toString());
    					}
                        while (i >= 0) {
                            try {
                                i = mFileInputStream.read(mBytes);
                            } catch (IOException e) {
                                Log.e(TAG, "IOException " + e.toString());
                                break;
                            }
                            if (i > 0) {
                                try {
                                    out.write(mBytes, 0, i);
                                } catch (IOException e) {
                                    Log.e(TAG, "write IOException " + e.toString());
                                    break;
                                }
                            }
                        }
    					try {
    					    out.close();
    					} catch (IOException e) {
    					    Log.e(TAG, "close IOException " + e.toString());
    					}
                    }
                }).start();
            }
        }
    

    如果需要向主机端传数据,需要向buffer中写数据,让主机端去读

    mFileOutputStream.write(byte[] byte);
    

    其他问题

    1、AOA模式下,数据传输速度太慢了,相对而言MTP>ADB>AOA,实际测算,AOA只有MTP 1/2不到。暂时没啥提升速度的办法,还望有大佬指教。
    2、源码中有demo,目录:frameworks\base\libs\usb\tests\AccessoryChat\accessorychat
    但是没有accessory端native的demo。看源码,最终accessory端是可以通过 /dev/usb_accessory 节点去读(接收)写(发送),/dev/usb_accessory 节点是主机端先发送52、53指令后有效。

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    #define DRIVER_NAME "/dev/usb_accessory"
    
    #define MAX_USBFS_BUFFER_SIZE   16384
    
    int open_accessory()
    {
        int fd = open(DRIVER_NAME, O_RDWR);
        if (fd < 0) {
            fprintf(stderr, "Error: could not open %s\n", DRIVER_NAME);
            return -1;
        }
        return fd;
    }
    
    static void usb_accessory_read(int fd)
    {
        char c;
        char buf[MAX_USBFS_BUFFER_SIZE];
        int n;
        while((n = read(fd, buf, MAX_USBFS_BUFFER_SIZE)) >= 0)
        {
            fprintf(stderr, "Error: %d\n", n);
            write(1, buf, n);
            putchar('\n');
        }
    }
    
    static void usb_accessory_write(int fd, char* buff, int length)
    {
        char write_buff[MAX_USBFS_BUFFER_SIZE + 1] = {0x00};
    
        length = (length >= MAX_USBFS_BUFFER_SIZE) ? MAX_USBFS_BUFFER_SIZE : length;
    
        fprintf(stderr, "Error: length %d\n", length);
        memcpy(write_buff, buff, length);
        int result = write(fd, write_buff, length);
        fprintf(stderr, "Error: result %d\n", result);
    }
    
    int main()
    {
        //usb_accessory_write(open_accessory(), "123456789", 9);
        usb_accessory_read(open_accessory());
        return 0;
    }
    
    展开全文
  • 基于AOA协议和Android平台的异屏互动的设计与实现.pdf
  • 基于AOA协议的android USB通信

    千次阅读 2018-02-11 13:18:37
    摘 要:AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android...

    摘 要:AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件模式下基于AOA协议实现Android手机控制步进电机的实例。
    关键词:Android;AOA;USB通信

    最近业界的统计数据显示,智能手机与自动化及机械系统之间存在着很大的市场潜力。2011年Google推出Android开放配件协议AOA(Android Open Accessory Protocol)及配件开发工具包ADK(Accessory Development Kit)提供了Android设备与Android配件通过USB或蓝牙进行通信的API,为基于Android系统的智能设备控制外设提供了条件。利用Android,系统可以连接从家用电器到重型机械、机器人等多种设备。
    Android作为一种基于开源Linux的智能手机操作系统,广泛应用于手机、平板电脑等移动设备中。在各种Android设备提供的接口中,USB接口是常见接口,该接口的作用是为Android设备充电并通过PC端的驱动程序实现Android设备与PC的交互。如何拓展Android设备的USB接口功能是当前的研究热点之一。针对该问题,本文介绍了一种基于AOA协议实现Android设备USB通信的方案,并通过Android手机控制步进电机的案例给出了方案的实现方法。
    1 Android USB通信模式
    Android系统支持多种USB外围设备。根据Android设备在USB通信中充当的角色,可以将Android USB通信分为主机模式(Host Mode)和配件模式(Accessory Mode)[1]两种模式。
    1.1 主机模式
    主机模式是指Android设备充当USB主机并为总线供电。此模式下,Android设备需支持USB主机功能或OTG功能,此时Android设备的USB主机称为USB嵌入式主机EH(Embedded Host)[2]。与PC上的USB主机相比,EH设备可能无法为连接到其总线上的未识别外围设备加载驱动程序,因此它们对其目标外围设备列表TPL(Target Peripheral List)进行了定义[3]。这些外围USB设备大部分为HID设备(Human Interface Device)、BOMS设备(Bulk Only Mass Storage,如U盘)和CDC设备(Comm-
    unication Device Class,USB通信设备类,如打印机),其驱动程序已存在于Android平台的系统中(Linux Kernel),因此Android设备可以与其直接通信。
    主机模式示意图如图1所示。
    1.2 配件模式
    配件模式是指Android设备充当USB从机,外部设备充当主机并为总线供电。此模式下,外部USB设备称为Android配件。该模式为不具备主机功能的Android设备提供与USB设备交互的能力。Android设备和Android配件都必须支持AOA协议。不支持AOA协议的设备可以通过Android配件开发板(ADK板)与Android设备连接,成为Android设备的间接配件。
    配件模式示意图如图2所示。

    基于AOA协议实现Android设备的USB通信

    本文介绍的基于AOA协议的Android设备USB通信方案即采用配件模式。主机模式和配件模式在Android 3.1(API level 12)及更高的平台中直接支持。配件模式作为一个附加库也被Android 2.3.4(API level 10)支持。设备厂商可以选择是否在设备的Linux系统镜像中包含附加库。对主机和配件模式的支持最终取决于设备的硬件,而不是Android平台的等级(软件)。
    1.3 Android配件、ADK及AOA协议
    Android配件是指遵循AOA协议的硬件,是Android配件模式中的概念。从硬件角度讲,Android配件具有实现USB EH功能和AOA协议的微处理器以及包括USB接口在内的输入/输出接口。Android配件必须与Android平台一起工作。
    ADK是开发Android配件的参考开发包,该开发包基于Arduino公司的开源电子成型平台[4]。ADK开发包包括Android配件硬件设计文档、Android配件固件源码、Android设备程序源码。
    AOA协议是Android设备与Android配件之间进行USB通信需遵循的连接协议,该协议规定了Android配件如何检测Android设备并与其建立通信。AOA协议规定配件需具备以下4项功能[5]:
    (1)侦听自身的USB接口,等待与其连接的Android设备。
    (2)检测Android设备是否支持AOA协议。
    (3)如果需要,启动Android设备的USB配件模式。
    (4)与Android设备建立USB通信。
    2 USB配件模式开发
    Android配件模式开发需要在Android设备端和Android配件端分别进行开发。
    2.1 Android设备端开发
    Android设备端需进行以下两项工作:
    (1)确保设备支持AOA协议。设备对AOA协议是否支持由设备硬件和Android系统版本决定。
    (2)调用ADK中的API开发USB应用程序。
    ADK中与USB配件模式相关的两个类是UsbManager和UsbAccessory。UsbManager用于枚举连接的USB配件并与其通信,UsbAccessory代表Android配件并包含获取配件描述信息的方法。
    在编写程序前,需要为Android工程做以下设置工作[6]:
    (1)配置Android Mainfest文件,声明使用配件模式,指定最低SDK版本,并设置配件过滤意图。
    (2)配置accessory_filter.xml文件。accessory_filter.xml文件用于描述希望Android设备检测的USB配件的描述信息,包含manufacturer、model、version 3个属性。在Android配件的固件程序中,同样包含以上3个属性值。根据AOA协议,当Android配件连接到Android设备上时,配件会发送该属性值到Android设备。Android程序将唯一响应与其accessory_filter.xml中指定的属性值匹配的Android配件。
    Android设备端程序开发的流程如下:
    (1)发现配件并过滤。
    (2)获取与配件通信的权限。通过广播接收器(Broad-castReceiver)的方式以弹出授权对话框的形式询问用户是否允许与Android配件通信。
    (3)开始与配件通信。创建文件输入输出流代表USB批量传输端点,通过独立线程以流传输的方式实现USB通信。
    (4)终止与配件通信。通过广播接收器侦听USB配件与Android设备的断开操作,当事件发生时,关闭文件输入/输出流。
    2.2 Android配件端开发
    Android配件端需进行以下两项工作:
    (1)根据ADK中的硬件设计文档设计具有USB主控制器的硬件电路,并支持USB协议。
    (2)将AOA协议以固件代码的形式下载至Android配件的主芯片中。
    目前,已有多家公司为Android设备的配件模式开发提供专门的ADK板,ADK板将AOA协议以程序的方式烧写至芯片中,ADK板也即Android配件。目前常见的ADK板有Arduino的Arduino Mega ADK板、SparkFun的IOIO板,此外还有DIY Drones、Microchip、RT Corp、Seeed Studio、Troido等公司生产的ADK板。采用ADK板将可节省Android配件端的开发时间。
    3 系统设计
    3.1 总体设计
    构建的系统框图如图3所示。

    基于AOA协议实现Android设备的USB通信

    采用的ADK板是由英国飞特蒂亚FTDI(Future Technology Devices International Ltd.)公司生产的Android平台USB主控模块(USB Android Host Module)[7],型号为UMFT311EV,于2012年7月31日推出。UMFT311EV板具有USB主控功能和USB接口桥接功能,其特性如下:
    (1)采用USB Android主控芯片FT311D,单芯片内集成USB协议。
    (2)兼容USB 2.0全速模式(最大传输速率12 Mb/s,即1.5 MB/s,最大输出电流500 mA)。
    (3)6种接口类型,即GPIO(7路)、UART、PWM(4路)、I2C Master、SPI Master、SPI Slave。
    (4)6种接口只能单一工作,通过跳线帽和3个接口类型选择引脚选择接口类型。
    UMFT311EV板支持AOA协议,作为Android配件无需用户做配件端的开发,而且为Android设备端的程序开发提供Java驱动包。因此采用UMFT311EV板能够实现Android手机、平板与其他设备的通信,进行设备控制和数据采集,并能与现有系统快速集成,降低开发难度和开发时间。
    在此,以Android手机小米MI2和步进电机28BYJ48为例,通过UMFT311EV板的4路GPIO口实现Android手机USB控制步进电机。
    3.2 软件设计
    在设计Android手机端软件时,采用FTDI公司为Android平台提供的驱动包。根据该驱动包,架构如图4所示的应用程序。

    基于AOA协议实现Android设备的USB通信


    FT311驱动层提供驱动UMFT311EV板上接口的方法和实现Android应用程序与UMFT311EV板USB通信的方法。该层为用户层提供封装的方法,为用户开发程序屏蔽底层编程细节。用户层通过调用FT311驱动层的方法实现对UMFT311EV板上接口的控制。
    本实验编程采用FT311驱动层提供的配置GPIO、读GPIO、写GPIO、重置GPIO 4个方法实现对步进电机的控制,程序流程如图5所示。

    基于AOA协议实现Android设备的USB通信

    4 系统测试
    本设计中将Android手机作为脉冲信号源和脉冲分配器,通过软件编程为步进电机提供脉冲信号,并通过驱动芯片ULN2003驱动步进电机。系统测试过程如下:

    以上就是基于AOA协议实现Android设备的USB通信的全文介绍,希望对您学习Android应用开发有所帮助.
    展开全文
  • Android开放配件(AOA)协议是一种Android终端通过USB总线与Android配件进行通信的协议,该协议为Android终端应用于设备控制和数据采集领域提供了条件。在一些设备控制应用中,有采用Android设备作为控制终端的需求。
  • 使用AOA协议的Android设备Beaglebone USB音频驱动 v2.0 如何测试: 编译安装驱动 在安卓手机上运行安卓应用 点击“连接”按钮 单击“获取音频”按钮 在计算机中运行任何声音文件。 现在声音很沙哑。 会被时间修复...
  • USB的ADB/AOA协议(一种是ADB模式,一种是AOA模式)。AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。 ADK中与USB配件模式相关的两个类是UsbManager和UsbAccessory。 > USB ...

      USB的ADB/AOA协议(一种是ADB模式,一种是AOA模式)。AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。

     ADK中与USB配件模式相关的两个类是UsbManager和UsbAccessory

    > USB
    Android实战技巧之四十九:Usb通信之USB Host- http://blog.csdn.net/lincyang/article/details/50739342
    Android手机通过USB接口与外设通信研究(附原理分析及方案选型)- http://blog.csdn.net/HowieXue/article/details/79167618
    提供了Arduino等其他设备USB串口的安卓端硬件驱动代码Github: https://github.com/mik3y/usb-serial-for-android (LGPL licence) 
    Android开发之USB数据通信- http://blog.csdn.net/true100/article/details/51791929
    Android实战技巧之四十九:Usb通信之USB Host- http://blog.csdn.net/lincyang/article/details/50739342

    -- CarLife App
     CarLife安卓手机的连接模式有两种,一种是ADB模式,一种是AOA模式。USB连接:AOA连接和ADB连接协议 Android。
     针对安卓5.0以上的手机系统与车机连接,务必采用AOA连接方式才可通过百度侧认证。
     - 2017年10月,我们已更新<Baidu CarLife Integration Specification v2.1.0>,文档中仅保留了AOA连接方式。
     -紧接着通知相关存在连接问题的车企/供应商,进行问题排查,并通知进行AOA连接方式整改。
     - 2018年6月底,百度明确验收文档提出针对安卓5.0以上的手机系统连接,必须要使用AOA连接方式。

    -- Android 开放配件 (AOA)调试-https://blog.csdn.net/encourage2011/article/details/78450995
     车载导航的开发中,有可能需要开发支持Android CarLife或者Android Weblink等功能,而这些功能需要使用AOA协议的支持。

    > USB 的 AOA协议 的主机模式和主机模式
    基于AOA协议实现Android设备的USB通信- https://blog.csdn.net/tianruxishui/article/details/37903841
       主机模式和配件模式在Android 3.1(API level 12)及更高的平台中直接支持。配件模式作为一个附加库也被Android 2.3.4(API level 10)支持。设备厂商可以选择是否在设备的Linux系统镜像中包含附加库。对主机和配件模式的支持最终取决于设备的硬件,而不是Android平台的等级(软件)。

    1 主机模式
        主机模式是指Android设备充当USB主机并为总线供电。此模式下,Android设备需支持USB主机功能或OTG功能,此时Android设备的USB主机称为USB嵌入式主机EH(Embedded Host)[2]。与PC上的USB主机相比,EH设备可能无法为连接到其总线上的未识别外围设备加载驱动程序,因此它们对其目标外围设备列表TPL(Target Peripheral List)进行了定义[3]。这些外围USB设备大部分为HID设备(Human Interface Device)、BOMS设备(Bulk Only Mass Storage,如U盘)和CDC设备(Comm-
    unication Device Class,USB通信设备类,如打印机),其驱动程序已存在于Android平台的系统中(Linux Kernel),因此Android设备可以与其直接通信。

    2 配件模式
        配件模式是指Android设备充当USB从机,外部设备充当主机并为总线供电。此模式下,外部USB设备称为Android配件。该模式为不具备主机功能的Android设备提供与USB设备交互的能力。Android设备和Android配件都必须支持AOA协议。不支持AOA协议的设备可以通过Android配件开发板(ADK板)与Android设备连接,成为Android设备的间接配件。
      基于AOA协议的Android设备USB通信方案即采用配件模式。

    -- Android配件、ADK及AOA协议
        Android配件是指遵循AOA协议的硬件,是Android配件模式中的概念。从硬件角度讲,Android配件具有实现USB EH功能和AOA协议的微处理器以及包括USB接口在内的输入/输出接口。Android配件必须与Android平台一起工作。
        ADK是开发Android配件的参考开发包,该开发包基于Arduino公司的开源电子成型平台[4]。ADK开发包包括Android配件硬件设计文档、Android配件固件源码、Android设备程序源码。

    -- Android Open Accessory protocol(AOA)
      AOA 2.0版新增了两项功能:音频输出(从Android设备输出到配件),并支持Android设备的配件作为一个或多个人机接口设备(HID)。提供给Android应用程序开发人员的Android SDK的API保持不变。原AOA协议提供了一个Android应用程序通过USB与USB主机(配件)直接进行通信的支持。 AOA 2.0保留了该支持,但增加了新的功能,让配件与Android操作系统本身通信(特别是音频输入系统)。 AOA 2.0的设计使得它可以构建一个配件,也使得除了原有的功能集外新的音频和/或HID的支持得到使用。 

     AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。
     Android系统下USB通信的两种模式,USB配件模式下基于AOA协议实现Android手机控制步进电机:
     2011年Google推出Android开放配件协议AOA(Android Open Accessory Protocol)及配件开发工具包ADK(Accessory Development Kit)提供了Android设备与Android配件通过USB或蓝牙进行通信的API,为基于Android系统的智能设备控制外设提供了条件。利用Android,系统可以连接从家用电器到重型机械、机器人等多种设备。

        AOA协议是Android设备与Android配件之间进行USB通信需遵循的连接协议,该协议规定了Android配件如何检测Android设备并与其建立通信。AOA协议规定配件需具备以下4项功能:
        (1)侦听自身的USB接口,等待与其连接的Android设备。
        (2)检测Android设备是否支持AOA协议。
        (3)如果需要,启动Android设备的USB配件模式。
        (4)与Android设备建立USB通信。

    --  ADK中与USB配件模式相关的两个类UsbManager和UsbAccessory。UsbManager用于枚举连接的USB配件并与其通信,UsbAccessory代表Android配件并包含获取配件描述信息的方法。

      采用的ADK板是由英国飞特蒂亚FTDI(Future Technology Devices International Ltd.)公司生产的Android平台USB主控模块(USB Android Host Module)[7],型号为UMFT311EV,于2012年7月31日推出。UMFT311EV板具有USB主控功能和USB接口桥接功能,其特性如下:
        (1)采用USB Android主控芯片FT311D,单芯片内集成USB协议。
        (2)兼容USB 2.0全速模式(最大传输速率12 Mb/s,即1.5 MB/s,最大输出电流500 mA)。
        (3)6种接口类型,即GPIO(7路)、UART、PWM(4路)、I2C Master、SPI Master、SPI Slave。
        (4)6种接口只能单一工作,通过跳线帽和3个接口类型选择引脚选择接口类型。
        UMFT311EV板支持AOA协议,作为Android配件无需用户做配件端的开发,而且为Android设备端的程序开发提供Java驱动包。因此采用UMFT311EV板能够实现Android手机、平板与其他设备的通信,进行设备控制和数据采集,并能与现有系统快速集成,降低开发难度和开发时间。
        在此,以Android手机小米MI2和步进电机28BYJ48为例,通过UMFT311EV板的4路GPIO口实现Android手机USB控制步进电机。

    -- USB通信的几种方式及使用场景- https://blog.csdn.net/wodeluoye/article/details/49594061
      将Android USB通信分为主机模式(Host Mode)和配件模式(Accessory Mode)[1]两种模式。
      自Android3.1(API Level 12)版本开始,Android系统直接支持USB主机模式和从机模式,同时为能够使更广泛的设备支持USB从机模式,Google官方还提供了相应的开发库向后兼容至Android2.3.4(API Level 10)版本。至于在之前的Android版本没有直接提供USB通信支持时,我们只能使用ADB的方式来实现Android设备与其他的设备通过USB线进行通信(Android设备只能以从机的方式接入,因为之前的Android设备都不支持OTG),而这也是到目前为止Android设备与PC通过USB线进行通信的唯一方式(常见的案例有豌豆荚、360手机助手等)。采用的ADK板是由英国飞特蒂亚FTDI(Future Technology Devices International Ltd.)公司生产的Android平台USB主控模块(USB Android Host Module)[7],型号为UMFT311EV,于2012年7月31日推出。
      以上关于Android设备支持USB主机模式和从机模式的支持方式只是软支持,另外还须有硬件支持,并且硬件对两种模式的支持具有决定性。

    -- Android usb学习笔记:Android AOA协议设备端 流程总结- https://blog.csdn.net/lidec/article/details/54908174
      Android通过AOA协议与嵌入式设备通信的流程就已经分析完了,在设备端我们借助了libusb库,通过其api操作usb,将手机设置为accessory模式,然后通过libusb读写数据,在Android手机端监听accessory事件,同时查询本地accessory列表,一旦拿到accessory引用,就可以获取读写流,同时Android 端最好将accessory的相关处理放在单独进程的服务中处理,防止应用闪退导致usb资源无法释放,在此连接无法成功的问题。
      wifi稳定性的限制。项目采用了Android手机与嵌入式设备通过usb直接连接的方式进行通信。其中Android的usb层使用了Android自身的AOA模式,嵌入式端借助libusb库与Android端通信。在应用层简单实现了一个tcp连接,最终可以抽象为双方socket端口与端口间的通信过程。

    -- USB,AOA开源项目
    libusb项目链接 https://github.com/libusb/libusb.git 
    设备aoa模式参考项目链接 https://github.com/timotto/AOA-Proxy.git 
    本例程设备端项目链接 https://git.oschina.net/vonchenchen/aoa_proxy.git 
    本例程Android端项目链接 https://git.oschina.net/vonchenchen/aoa_android.git
    将运行Linux机器转变为Android配件- https://github.com/gibsson/linux-adk

    > ADK中与USB配件模式相关的两个类UsbManager和UsbAccessory。UsbManager用于枚举连接的USB配件并与其通信,UsbAccessory代表Android配件并包含获取配件描述信息的方法。

    1. UsbAccessory中你需要小心的坑及解决方案- https://blog.csdn.net/ljYangscut/article/details/79320670
    1.系统不广播Usb连接事件(android.hardware.usb.action.USB_ACCESSORY_ATTACHED)
    2.系统有时不广播Usb断开事件(android.hardware.usb.action.USB_ACCESSORY_DETACHED)
    3.系统有时会异常缓存UsbAccessory,导致没连接上时App却可以获取到不可用的Accessory

    -- linux里使用libusb库来模拟aoa协议来作为外设端。
     Usb Accessory模式, 这个模式正常的使用方法是用来和专为Android设备设计的USB主机硬件通讯的. 
     USB Accessory有两种API可供选择, 第一种是android.hardware.usb包, 只能用在Android 3.1及之后的系统上, 不需要额外添加library, 第二种是com.android.future.usb包, 需要额外添加 Google APIs add-on library , 也就是谷歌服务, 但是可以运行在Android 2.3.4以及之后的系统上, 这里我们使用第一种来演示, 第二种可以去官方文档进行了解 .

    使用UsbAccessary模式来与pc通信-https://blog.csdn.net/lj402159806/article/details/69940628
    UsbAccessory demo下载- https://github.com/GavinAndre/UsbAccessoryDemo
    UsbAccessory - https://github.com/LucianZala/linuxUsbAccessory 
    UsbAccessory - https://github.com/quandoo/android2android-accessory

    2. UsbManager
    public static final String ACTION_USB_ACCESSORY_ATTACHED =     "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";
    public static final String ACTION_USB_ACCESSORY_DETACHED =   "android.hardware.usb.action.USB_ACCESSORY_DETACHED";
    public static final String ACTION_USB_DEVICE_ATTACHED = "android.hardware.usb.action.USB_DEVICE_ATTACHED";
    public static final String ACTION_USB_DEVICE_DETACHED = "android.hardware.usb.action.USB_DEVICE_DETACHED";

    - USB连接广播 Android
    public class UsbConnect {
        private final static String ACTION = "android.hardware.usb.action.USB_STATE";
        public void start(Context context) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(ACTION);
            context.registerReceiver(usBroadcastReceiver, filter);
        }
        BroadcastReceiver usBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                Toast.makeText(context, "aciton =" + action, Toast.LENGTH_SHORT).show();
                if (action.equals(ACTION)) {
                    boolean connected = intent.getExtras().getBoolean("connected");
                    Toast.makeText(context, "aciton =" + connected, Toast.LENGTH_SHORT).show();
                    if (connected) {
     
                    } else {
     
                    }
                }
            }
        };
    }

    展开全文
  • 安卓系统 适用于具有 AOA 协议的 Android 设备的 Android 应用程序,可将其用作显示器、键盘或鼠标。 必须安装名为 andromon-linux 的支持驱动程序
  • AOA协议 这是用于测试目的的简单实现。 我只是想使用 AOA 协议通过 USB 传输图像。 相应的安卓应用代码可在“ ”获得 如何测试: 由于仅用于测试目的,因此测试方法繁琐。 请按照以下步骤进行测试 下载驱动源 运行...
  • 提出了一个通过Android手机控制Android配件UMFT311EV开发板生成PWM信号的系统。系统基于Android开放配件协议,通过操作Android手机界面控制PWM信号的周期和占空比。
  • USB和Touchkey单片机CH554评估板免费发放活动-CH559做主机通过AOA协议和安卓手机通讯,提供安卓端调试软件.rar
  • Android开放配件(AOA)协议是一种Android终端通过USB总线与Android配件进行通信的协议,该协议为Android终端应用于设备控制和数据采集领域提供了条件。在一些设备控制应用中,有采用Android设备作为控制终端的需求。...
  • 具体如下: A.等待安卓设备连接; B.确定手机支持附属模式(配件模式 );... // 设置Android配件模式 获取批量传输端点 (4)获取AOA协议版本、关联URL、启动配件模式 AOAModeInit(); // AOA初始化函数 (5)、批量数据通讯

    具体如下:

    A.等待安卓设备连接;

    B.确定手机支持附属模式(配件模式 );

    当安卓设备接入USB主机时,一定处于以下3种模式之一:

    *a.支持附属模式,并且已经在处于这种模式中;

    *b.支持附属模式,但是还没有进入该模式;

    *c.不支持附属模式;

    当连接初始化时,处理器需要检测安卓设备的VID(供应商ID)和PID(产品ID)。如果设备已经在附属模式(case a),VID需要匹配谷歌ID 0x18D1,PID应是0x2D00或者0x2D01。如果满足以上条件,处理器就可以和安卓设备建立数据通路,使用协议通过批量端点进行通讯。在配件模式,没有必要启动设备。

    NOTE:

    0x2D00用于支持配件模式的安卓设备;

    0x2D01用于支持配件模式和ADB (Android Debug Bridge)协议,额外开放了2个端点的二次端口用于安卓调试,如果你可以在PC上进行模拟处理器,就可以用这2个端点进行调试。通常,不要使用这个接口除非(In general, do not use this interface unless your accessory is implementing a passthrough to ADB on the device.)。

    C.如果VID和PID不符合安卓设备的配件模式,处理器就不能辨别这个安卓设备是否支持配件模式(目前不在该状态)或者(不支持该模式)。这是因为设备并不会在一开始就报告VID和PID,因此,处理器应该尝试让设备进入配件模式,以判定设备是否支持该模式。

    主机尝试启动Android配件模式:

    ●发送一个0x33控制请求(Get Protocol),来得出设备是否支持( the Android accessory protocol),返回一个非零的数字,这个数字代表了该设备支持的协议版本号;这是一个端点0的控制请求,主要有以下特性:

    requestType:    USB_DIR_IN | USB_TYPE_VENDOR(0xC0)

    request:        0x33

    value:          0

    index:          0

    data:       protocol version number (16 bits little endian sent from the device to the            accessory)

    ●如果设备返回合理的协议版本,处理器将向设备发送一个标识字符串,这个字符串信息将为设备找一个合适的应用(APP),如果不存在合适的应用(APP),将会提供一个URL。这些是端点0的控制请求(对于每个不同的字符串ID),有以下特性:

    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR(0x40)

    request:        0x34

    value:          0

    index:          string ID

    data            zero terminated UTF8 string sent from accessory to device

    *以下字符串ID是被支持的,每个字符串ID最大长度不超过256B,并且一定以 `\0`结尾

    manufacturer name:   0

    model name:          1

    description:         2

    version:             3

    URI:                4

    serial number:      5

    ●当发送标识字符串时,需要设备启用配件模式,这是一个端点0的控制请求,主要有以下特性:

    requestType:    USB_DIR_OUT | USB_TYPE_VENDOR(0x40)

    request:        0x35

    value:          0

    index:          0

    data:           none

    在发送完最后一个控制请求后,连接的USB设备应该在配件模式下向总线重新报告自己的信息,处理器可以重新枚举该设备(进行一次复位操作);如果设备成功切换至配件模式 ,VID和PID会不同,并且符合谷歌的VID和PID,而不是制造商ID,处理器可以和安卓设备建立通讯。

    如果以上任何一个步骤出错,设备都无法支持配件模式,处理器需要等待下一个设备连接。

    建立通讯连接

    C.如果处于accessory mode的安卓设备被插上,处理器查询设备的接口和端点描述符去获取和设备通信的批量端点。一个PID是0x2D00的安卓设备拥有一个包含2个批量端点的接口,用于数据上下传。一个PID是0x2D01的安卓设备拥有2个接口,2个批量端点分别用于2个接口的数据上下传,第一个接口是标准通信(standard communication),第二个接口主要用于ADB  communication。为了能够和接口通讯,需要找到一个批量上下传端点,使用SET_CONFIGURATION (0x09) 请求设置配置为1,然后就可以和端点通讯了。

    二、硬件设计

    CH559是一款兼容MCS51的增强型E8051内核单片机,79%的指令是单字节单周期指令,内置63K Code Flash,6K+256B Ram。CH559内置USB2.0全速主从模式,USB 主机模式下提供双USB口,可同时管理两个 USB 设备。支持最大 64 字节数据包,内置 FIFO,支持 DMA。

    CH554是一款兼容MCS51的增强型E8051内核单片机,79%的指令是单字节单周期指令,内置1K+256B RAM,16KB iFlash-ROM。CH554提供丰富的接口资源,包括ADC模数转换、3组定时器和信号捕捉及PWM、双异步串口、SPI等。CH554提供6通道电容检测模块,互电容方式支持最多15个触摸按键,并且支持USB2.0全速主从模式。下面代码是基于CH559写的,但是理论上USB单片机都可以实现。

    三、软件设计

    (1)、USB主机功能开启

    InitUSB_Host( );

    (2)、等待USB设备连接

    if ( UIF_DETECT )            // 如果有USB主机检测中断则处理

    {

    UIF_DETECT = 0;          // 清中断标志

    AccessoryModeOpenSuc = 0;//清除模式设置标志位

    s = AnalyzeRootHub( );   // 分析ROOT-HUB状态

    if ( s == ERR_USB_CONNECT )

    {

    FoundNewDev = 1;

    }

    }

    (3)、设置Android配件模式

    s = InitRootDevice( );  // 初始化USB设备,Accessory mode预设置

    s = InitRootDevice( );  // 设置Android配件模式

    获取批量传输端点

    (4)获取AOA协议版本、关联URL、启动配件模式

    AOAModeInit();          // AOA初始化函数

    (5)、批量数据通讯

    展开全文
  • 具体如下: A.等待安卓设备连接; B.确定手机支持附属模式(配件模式 );... // 设置Android配件模式 获取批量传输端点 (4)获取AOA协议版本、关联URL、启动配件模式 AOAModeInit(); // AOA初始化函数 (5)、批量数据通讯
  • Android usb学习笔记:Android AOA协议Android端 流程总结

    千次阅读 热门讨论 2017-04-22 13:00:15
    上篇文章中我们了解了嵌入式设备端将Android手机设置为accessory模式的流程以及嵌入式设备端接收和发送数据的流程,本文将对应介绍...本文的源码下载地址:https://git.oschina.net/vonchenchen/aoa_android.git实现
  • Android AOA协议Android端 流程总结

    千次阅读 2017-04-25 13:37:56
    本文的源码下载地址:https://git.oschina.net/vonchenchen/aoa_android.git 实现 USBConnStatusManager 底层启动accessory模式 Android系统api通过UsbManager类管理usb相关,这里我们关注一下与...
  • Android usb学习笔记:Android AOA协议设备端 流程总结

    万次阅读 热门讨论 2017-04-20 21:14:51
    Android手机与嵌入式设备通过usb直接连接的方式进行通信,其中Android的usb层使用了Android自身的AOA模式,嵌入式端借助libusb库与Android端通信。上层协议参考了usbmuxd库,并在Android端用java实现了usbmuxd的部分...
  • 1 环境配置 在AndroidManifest.xml文件里添加代码 <intent-filter> <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> </intent-filter&g...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 639
精华内容 255
关键字:

aoa协议