簡體   English   中英

Android Bluetooth Inputstream.read從不接收數據

[英]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()只是阻塞,等待永不到達的輸入(像應該這樣)。

這就是我的問題。 似乎正在發生以下兩種情況之一:

  1. 即使Nook實例上沒有拋出任何異常,該數據也永遠不會通過output.write()發送,並且日志會驗證它是否被調用。

  2. 數據永遠不會在模擬實例上被input.read()接收。 也許在傳輸中迷路了?

據我所知,我的代碼牢不可破。 問題似乎與藍牙有關。 也許一個或兩個Android實例都設置了錯誤的藍牙設置?

我還想補充一下,每隔一段時間(可能是1/15次),每一次稀有,所有數據包都會正確發送和接收,並且游戲會按預期進行。 因此,無論什么錯誤,只有通常會發生,但並非總是如此。

我可以使用藍牙訪問另一個Android設備。 從那以后,我就測試了我的游戲,它可以連接並且設備可以正確地交易數據。 我在藍牙程序之后發現了程序中的其他一些bug,但這不是那里還是那里!

之前的Nook Color和HTC Status是一起工作的。 因此,我正式斷定我的計算機上的藍牙適配器有故障。 上面發布的代碼效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM