I would like to exchange data/commands between a camera and an Android tablet device using the bulkTransfer
function. I wrote this Activity, but the method bulkTransfer
returns -1
(error status). Why does it return the error?
我想使用bulkTransfer功能在相机和Android平板电脑设备之间交换数据/命令。我写了这个Activity,但方法bulkTransfer返回-1(错误状态)。为什么会返回错误?
public class MainActivity extends Activity {
private TextView text;
private int TIMEOUT = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.txt);
usbTest();
}
private void usbTest() {
UsbDevice device = (UsbDevice) getIntent().getParcelableExtra(
UsbManager.EXTRA_DEVICE);
if (device == null)
text.setText("device null");
else
text.setText("device not null");
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
text.setText(text.getText() + "\nDevices connected: "
+ deviceList.values().size());
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext()) {
device = deviceIterator.next();
text.setText(text.getText() + "\nDevice name: "
+ device.getDeviceName());
text.setText(text.getText() + "\nDevice protocol: "
+ device.getDeviceProtocol());
text.setText(text.getText() + "\nDevice id: "
+ device.getDeviceId());
text.setText(text.getText() + "\nDevice product id: "
+ device.getProductId());
text.setText(text.getText() + "\nDevice vendor id: "
+ device.getVendorId());
text.setText(text.getText() + "\nDevice class: "
+ device.getDeviceClass());
text.setText(text.getText() + "\nDevice subclass: "
+ device.getDeviceSubclass());
text.setText(text.getText() + "\nDevice interface count: "
+ device.getInterfaceCount());
text.setText(text.getText() + "\n\n");
}
// communicate with device
UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection connection = manager.openDevice(device);
connection.claimInterface(intf, true);
for (int i = 0; i < intf.getEndpointCount(); i++) {
UsbEndpoint ep = intf.getEndpoint(i);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
endpoint = ep;
text.setText("Found: "+i);
}
}
}
// byte[] opensession = { 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,
// 0x10,
// 0x00, 0x00, 0x00, 0x00 };
// connection.bulkTransfer(endpoint, opensession, opensession.length,
// TIMEOUT);
byte[] getEvent = { 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, toByte(0xC7),
toByte(0x90), 0x00, 0x00, 0x00, 0x00 };
int status = connection.bulkTransfer(endpoint, getEvent,
getEvent.length, TIMEOUT);
//text.setText("Status: " + status);
byte[] capture = { 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x10,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00 };
connection.bulkTransfer(endpoint, capture, capture.length, TIMEOUT);
// teminate communication
BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
UsbDevice device = (UsbDevice) intent
.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) {
// call your method that cleans up and closes
// communication with the device
}
}
}
};
}
public static byte toByte(int c) {
return (byte) (c <= 0x7f ? c : ((c % 0x80) - 0x80));
}
}
2 个解决方案
#1
0
I suspect you are not correctly searching for interface and endpoint.
我怀疑你没有正确搜索接口和端点。
see explanation below.
见下面的解释。
Suggestion: test if the endpoint if it is valid and try to match it with device descriptor.
建议:测试端点是否有效并尝试将其与设备描述符匹配。
a interface can have multiple setting.
一个界面可以有多个设置。
AFAIK, for camera, their should be three alternate setting for the camera interface.
AFAIK,对于相机,它们应该是相机界面的三个备用设置。
- Zero Bandwidth -- no endpoints inside -- most possibly alternate setting 0
- 零带宽 - 内部没有端点 - 最可能是交替设置0
- Isochronous (if the camera support it) -- isochronous endpoint inside
- 等时(如果摄像机支持它) - 内部的等时端点
- Bulk -- bulk endpoint inside <-- place of you interest
- 批量 - 批量端点< - 你感兴趣的地方
(I dont know the actual USB camera specification but, this should be applicable to all streaming protocol over USB (as i see in Audio Class))
(我不知道实际的USB摄像头规格,但是这应该适用于USB上的所有流媒体协议(正如我在音频类中所见))
You need to search for the bulk alternate setting and then perform communication on the endpoint inside it.
您需要搜索批量备用设置,然后在其中的端点上执行通信。
#2
0
I think this function is not passing the correct endpoint
我认为这个函数没有传递正确的端点
int status = connection.bulkTransfer(endpoint, getEvent,
getEvent.length, TIMEOUT);
which is coming from
这是来自
UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
maybe the USB interface is not correct. Please check if index 0 parameter is correct.
也许USB接口不正确。请检查索引0参数是否正确。
#1
0
I suspect you are not correctly searching for interface and endpoint.
我怀疑你没有正确搜索接口和端点。
see explanation below.
见下面的解释。
Suggestion: test if the endpoint if it is valid and try to match it with device descriptor.
建议:测试端点是否有效并尝试将其与设备描述符匹配。
a interface can have multiple setting.
一个界面可以有多个设置。
AFAIK, for camera, their should be three alternate setting for the camera interface.
AFAIK,对于相机,它们应该是相机界面的三个备用设置。
- Zero Bandwidth -- no endpoints inside -- most possibly alternate setting 0
- 零带宽 - 内部没有端点 - 最可能是交替设置0
- Isochronous (if the camera support it) -- isochronous endpoint inside
- 等时(如果摄像机支持它) - 内部的等时端点
- Bulk -- bulk endpoint inside <-- place of you interest
- 批量 - 批量端点< - 你感兴趣的地方
(I dont know the actual USB camera specification but, this should be applicable to all streaming protocol over USB (as i see in Audio Class))
(我不知道实际的USB摄像头规格,但是这应该适用于USB上的所有流媒体协议(正如我在音频类中所见))
You need to search for the bulk alternate setting and then perform communication on the endpoint inside it.
您需要搜索批量备用设置,然后在其中的端点上执行通信。
#2
0
I think this function is not passing the correct endpoint
我认为这个函数没有传递正确的端点
int status = connection.bulkTransfer(endpoint, getEvent,
getEvent.length, TIMEOUT);
which is coming from
这是来自
UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
maybe the USB interface is not correct. Please check if index 0 parameter is correct.
也许USB接口不正确。请检查索引0参数是否正确。