我有一个使用AOA与Linux机器通信的android手机。 Linux机器设置为启动连接,然后等待传入数据并将其回送到手机不变。这适用于手机的小数据包(小于1024字节)。但是,如果我只发送1024个字节,它似乎可以在Android端工作,但计算机永远不会看到数据包,只有任何较小的数据包。如果手机试图发送大于1024的数据包,计算机会收到这些数据包,但Android手机将无法再从计算机接收任何数据包。进一步混淆了这个问题,这在过去确实有效,但回到早期版本的手机上的发送/接收代码似乎没有任何影响。计算机上的代码尚未更改。
Android应用程序在启动时检查USB配件,如果找到一个,它会启动一个监听器和发送器线程。发送方线程在阻塞队列上等待传出数据包,并在收到它们后立即发送它们。侦听器线程不断尝试从输入流中读取,该输出流将阻塞直到数据可用。这是我用来设置和安装的代码。运行线程:
private boolean openUSB(){
mUSBManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mAccessory = mUSBManager.getAccessoryList();
if (mAccessory != null && mAccessory.length > 0) {
mParcelFileDescriptor = mUSBManager.openAccessory(mAccessory[0]);
mFileDescriptor = mParcelFileDescriptor.getFileDescriptor();
mListener = new Thread() {
public void run() {
listenerThread();
}
};
mListener.start();
mSender = new Thread() {
public void run() {
senderThread();
}
};
mSender.start();
displayText("Connected to USB accessory");
return true;
} else {
displayText("No USB accessory detected");
return false;
}
}
private void listenerThread(){
byte packet[] = new byte[SDR_PREFIX_SIZE+SDR_HEADER_SIZE+SDR_MAX_PAYLOAD+SDR_CRC_SIZE];
FileInputStream input = new FileInputStream(mFileDescriptor);
try {
ByteArrayOutputStream incoming = new ByteArrayOutputStream();
displayText("Listener Started");
while ( mFileDescriptor != null && input != null ) {
int read = input.read(packet,0,packet.length);
/* data in packet gets processed */
}
} catch ( Exception e) {
displayText("Listener Exception - "+e.getMessage(),true);
}
displayText("Listener Exited");
}
private void senderThread(){
displayText("sender started");
FileOutputStream output=new FileOutputStream(mFileDescriptor);
try {
byte data[] = mTransmitQueue.take();
while (data != null) {
displayText("Sending packet " + packet + ", "+data.length + " bytes");
output.write(data);
data = mTransmitQueue.take();
}
} catch ( Exception e) {
displayText("Sender Exception - "+e.getMessage(),true);
}
}
在过去,我遇到了让侦听器和发送器工作的问题,直到我发现用于创建文件流的一些中间对象被垃圾收集,但仍然需要。我现在将所有这些中间对象存储到成员变量(mUSBManager,mAccessory,mParcelFileDescriptor,mFileDescriptor)以赋予它们持久性。我怀疑这个问题类似,但我未能取得任何进展。我在这个问题上一直没有取得任何成功,并且真的希望其他人能够对导致这种情况的原因有所了解。
答案 0 :(得分:0)
我找到了解决办法,扩展用于接收数据的缓冲区似乎可以解决问题,即使现有缓冲区对于所有数据包都足够大。将缓冲区从1524增加到2524解决了未接收传入数据包的问题。这是一个kludgy解决方案,但它确实有效。