[英]Android Bluetooth Inputstream.read never receiving data
我正在為Android開發游戲,其中兩個設備先連接,然后交換少量數據,然后斷開連接並使用這些數據。 我從藍牙聊天示例開始。 在這一點上,我可以正常工作,但是有時(大多數),其中一台設備從未收到任何數據。 這是兩個設備上的相同應用程序,因此兩者的發送和接收代碼相同。 我這樣連接:
public BluetoothClientThread(BluetoothDevice get_device,boolean secure){
BluetoothSocket temp=null;
device=get_device;
socket_type=secure?"Secure":"Insecure";
try{
if(secure){
temp=device.createRfcommSocketToServiceRecord(UUID_SECURE);
}
else{
temp=device.createRfcommSocketToServiceRecord(UUID_INSECURE);
}
}
catch(IOException e){
StorageManager.error_log_add(context,TAG,"create() on "+socket_type+" client socket failed.",e);
}
socket=temp;
}
public void run(){
bluetooth_adapter.cancelDiscovery();
try{
socket.connect();
}
catch(IOException e){
StorageManager.error_log_add(context,TAG,"Connection failed.",e);
try{
socket.close();
}
catch(IOException ioe){
StorageManager.error_log_add(context,TAG,"close() on "+socket_type+" client socket failed during connection failure.",ioe);
}
connection_failed();
return;
}
synchronized(BluetoothService.this){
bluetooth_client_thread=null;
}
connected(socket,device,socket_type,false);
}
連接后,我將獲取套接字的getInputStream()和getOutputStream()。 然后,我使用以下代碼讀取套接字上的輸入:
public void run(){
String packet="";
while(true){
try{
int get_byte=input.read();
char get_char=(char)get_byte;
if(get_char!='\u0003'){
StorageManager.error_log_add(context,"BluetoothService","Adding packet raw data: \""+get_char+"\"",null);
packet+=get_char;
}
else{
StorageManager.error_log_add(context,"BluetoothService","Packet received:\n"+packet,null);
handler.obtainMessage(Activity_Battle_Menu.HANDLER_READ,packet).sendToTarget();
packet="";
}
if(done && they_done){
handler.obtainMessage(Activity_Battle_Menu.HANDLER_READY).sendToTarget();
}
}
catch(IOException e){
StorageManager.error_log_add(context,TAG,"Connection lost.",e);
connection_lost();
break;
}
}
}
它一次讀取一個字節的數據,然后將字節附加到數據包字符串中。 到達ETX字符時(發送時我會粘貼在所有內容的結尾),這表示已收到完整的數據包,並通過處理程序將其傳遞給活動,並對其進行操作。 這是我的編寫代碼:
public void write(byte[] buffer){
try{
StorageManager.error_log_add(context,"BluetoothService","Writing data:\n"+new String(buffer),null);
output.write(buffer);
}
catch(IOException e){
StorageManager.error_log_add(context,TAG,"write() on "+socket_type+" connected socket failed.",e);
}
}
如您所見,當發送數據“包”,接收到字節以及接收到整個“包”時,我將寫入日志。
我不確定是否有任何相關內容,但是:我正在使用帶有Cyanogenmod 7.1(Android 2.3.7)和在VirtualBox(Android 2.3.5)中運行的Android x86的Nook Color進行測試。 我的應用程序的minSdkVersion是8(Android 2.2)。 對於計算機上運行的Android,我正在使用Rocketfish USB藍牙適配器。
每個實例應該發送兩個數據包。 首先,發送包含所有需要的游戲數據的數據包。 收到其他實例的游戲數據后,應用程序會將自己的布爾值done設置為true。 它還將“完成”數據包發送到另一個實例。 因此,一旦兩個實例都完成了,並且知道另一個已經完成,我們就知道所有數據都已發送和接收,並且它們都斷開/停止了它們的藍牙線程並對該數據執行操作。
由於我在發送和接收數據時都在兩個設備上都進行了登錄,因此日志告訴了我發生了什么。
-首先,我同時啟動兩個游戲和進行藍牙活動(顯然)。
-接下來,我從仿真實例連接到Nook實例。
-模擬實例發送其游戲數據包。
-Nook實例接收模擬實例的游戲數據,並發送自己的數據(有時這兩個是按順序切換的,因為它們是異步發生的)。
-由於Nook實例收到了游戲數據包,因此現在發送其“完成”包。
-這就對了。 仿真實例從不接收任何數據包。 它甚至從不接收單個字節,並且input.read()只是阻塞,等待永不到達的輸入(像應該這樣)。
這就是我的問題。 似乎正在發生以下兩種情況之一:
即使Nook實例上沒有拋出任何異常,該數據也永遠不會通過output.write()發送,並且日志會驗證它是否被調用。
數據永遠不會在模擬實例上被input.read()接收。 也許在傳輸中迷路了?
據我所知,我的代碼牢不可破。 問題似乎與藍牙有關。 也許一個或兩個Android實例都設置了錯誤的藍牙設置?
我還想補充一下,每隔一段時間(可能是1/15次),每一次稀有,所有數據包都會正確發送和接收,並且游戲會按預期進行。 因此,無論什么錯誤,只有通常會發生,但並非總是如此。
我可以使用藍牙訪問另一個Android設備。 從那以后,我就測試了我的游戲,它可以連接並且設備可以正確地交易數據。 我在藍牙程序之后發現了程序中的其他一些bug,但這不是那里還是那里!
之前的Nook Color和HTC Status是一起工作的。 因此,我正式斷定我的計算機上的藍牙適配器有故障。 上面發布的代碼效果很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.