Android 使用正确端点的 BulkTransfer 没有响应

No Response from Android BulkTransfer with proper Endpoints

我已经在这里看到很多关于 bulkTransfer 的问题,其中大多数使用了错误的接口来读写,但我确定我选择了正确的接口:

private UsbManager usbManager;
private UsbDevice usbDevice;
private UsbDeviceConnection usbDeviceConnection;
private UsbInterface usbInterface;
private UsbEndpoint readEndpoint;
private UsbEndpoint writeEndpoint;
private UsbEndpoint interruptEndpoint;
private PtpSession ptpSession;

public boolean Connect(UsbManager usbManager,UsbDevice usbDevice, PtpSession ptpSession)
{
    if(usbManager == null ||usbDevice == null||ptpSession == null)
        return false;
    else
    {
        this.usbManager = usbManager;
        this.usbDevice = usbDevice;
        this.ptpSession = ptpSession;

        for (int i = 0; i < this.usbDevice.getInterfaceCount(); i++) {
            UsbInterface uintf = this.usbDevice.getInterface(i);
            if (uintf.getInterfaceClass() == UsbConstants.USB_CLASS_STILL_IMAGE) {
                Log.d(TAG, "Imaging USB interface found");
                this.usbInterface = uintf;
                break;
            }
        }
    }

    // find the wright usb endpoints
    if(usbInterface == null)
        return false;
    else
    {
        for(int i = 0; i < usbInterface.getEndpointCount();i++)
        {
            UsbEndpoint ep = usbInterface.getEndpoint(i);
            if (ep.getDirection() == UsbConstants.USB_DIR_IN) {
                if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)
                {

                    readEndpoint = ep;
                }
                else if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_INT)
                {
                    interruptEndpoint = ep;

                }
            } else if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                writeEndpoint = ep;
            }
        }

        this.usbDeviceConnection = usbManager.openDevice(usbDevice);
        usbDeviceConnection.claimInterface(usbInterface,true);
    }

    if(readEndpoint == null || writeEndpoint == null ||interruptEndpoint == null)
        return false;
    return true;
}

这部分代码似乎是按照它应该的方式工作的,那么还有另外两种读写数据的方法:

private boolean writeData(byte[] data)
{
    int retry = 0;
    while (usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000) != data.length)
    {
        retry++;
        if (retry > 4)
        {
            return false;
        }
    }
    return true;
}

private byte[] readData()
{
    long rStart = System.currentTimeMillis();
    byte[] mReadData = new byte[30];
    while (true) {
        int bytesCount = usbDeviceConnection.bulkTransfer(readEndpoint, mReadData, mReadData.length, 5000);
        if (bytesCount >= 0) {
            return mReadData;
        }
        else if (System.currentTimeMillis() - rStart > 5000) {
            return new byte[]{};
        } else {
            Log.e(TAG, String.format("Bulk read -1 cmd"));
        }


    }
}

我可以发送数据并从 writeData 方法获得积极的反馈。然后我等待一段时间(100 甚至 1000 毫秒)并尝试读取数据。而且我从来没有得到任何数据来读取并且总是得到 -1 作为反馈(直到方法 returns 5 秒后一个空数组)。我已经尝试将 mReadData 数组的大小更改为其他值,但到目前为止没有任何效果(30 字节的数据大小将是 PTP 协议中典型 ResponseData 块的预期值)。

总的来说,我尝试使用带有原始 USB-OTG 适配器的智能手机(带有 Android 6.0.1 运行 的 Galaxy S7)从尼康 D3200 读取数据,我非常确定我的代码是问题所在,但经过数小时尝试不同的事情后,我真的不知道问题出在哪里。

这是我使用的 ISO 15740 标准的 Link:Link to ISO 15740

也许你们中有人知道我的问题是什么?

提前致谢, 多米尼克

以下代码将不起作用

private boolean writeData(byte[] data)
{
    int retry = 0;
    while (usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000) != data.length)
    {
        retry++;
        if (retry > 4)
        {
            return false;
        }
    }
    return true;
}  

改为使用以下检查连接状态

 int ret = usbDeviceConnection.bulkTransfer(writeEndpoint, data, data.length, 5000;


     if(ret < 0)
                    {
                      Log.d("TAG", "Error happened!");
                    }
                    else if(ret == 0)
                    {
                        Log.d("TAG", "No data transferred!");
                    }
                    else
                    {
                        Log.d("TAG", "success!");
                    }

(https://www.developer.android.com/studio/debug/am-logcat.html 除了记录之外,您还可以使用 try {...} catch {...} 块或 logcat,...)

复制自android usb UsbDeviceConnection.bulkTransfer returns -1

那么有多种可能为什么你write/read没有数据

  • 编程错误(可能是引用错误因为writeData()方法不知道对usbDeviceConnection对象的引用) 尝试将其作为

    之类的参数提供给方法
    private UsbDeviceConnection usbDeviceConnection;
    private boolean writeData(UsbDeviceConnection  usbDeviceConnection, byte[] data) { ... }
    

    并使用

    调用方法
     writeData(usbDeviceConnection, ...);
    

( http://www.programcreek.com/java-api-examples/index.php?api=android.hardware.usbUsbDeviceConnection )

同样适用于readData()方法

https://developer.android.com/reference/android/hardware/usb/UsbDeviceConnection.html