2012-05-12 6 views
2

두 기기가 연결되어있는 소량의 데이터를 교환 한 Android 용 게임을 제작 한 다음 연결 해제하고 사용합니다. 블루투스 채팅 예제로 시작했습니다. 이 시점에서는 대부분 작동하지만 일부 (대부분)의 경우 장치 중 하나에 어떤 데이터도 수신되지 않습니다. 이것은 두 장치 모두에서 동일한 응용 프로그램이므로 두 코드의 송수신 코드는 같습니다. 이 같은 연결 오전 :Android 블루투스 Inputstream.read 데이터 수신 안 함

연결되면
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; 
      } 
     } 
    } 

그것은 패킷 String으로 바이트를 추가, 한 번에 데이터를 한 바이트를 읽습니다. 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) 및 Android x86 (VirtualBox) (Android 2.3.5)에서 Nook Color로 테스트 중입니다. 내 앱의 minSdkVersion은 8입니다 (Android 2.2). 내 컴퓨터에서 실행되는 Android의 경우 Rocketfish USB Bluetooth 어댑터를 사용하고 있습니다.

각 인스턴스에서 보낸 데이터 패킷 두 개가 있어야합니다. 먼저 필요한 모든 게임 데이터를 포함하는 데이터 패킷이 전송됩니다. 다른 인스턴스의 게임 데이터가 수신되면 앱은 자신의 부울 값을 true로 설정합니다. 또한 "완료"패킷을 다른 인스턴스로 보냅니다. 따라서 두 인스턴스가 완료되고 다른 인스턴스가 완료되었다는 것을 알게되면 모든 데이터가 송수신되었음을 알게되고 둘 다 블루투스 스레드의 연결을 끊거나 중지하고 데이터를 처리합니다.

데이터를 보내고받을 때 두 장치에서 모두 로깅을하므로 로그에서 무슨 일이 벌어지고 있는지 이야기합니다.

- 먼저 두 게임을 모두 시작하고 블루투스 활동으로 이동합니다 (분명히).

다음으로 에뮬레이트 된 인스턴스의 Nook 인스턴스에 연결합니다.

- 에뮬레이션 된 인스턴스가 게임 데이터 패킷을 보냅니다.

-Nook 인스턴스는 에뮬레이트 된 인스턴스의 게임 데이터를 수신하고 자신의 데이터를 보냅니다 (때로는이 두 데이터가 비동기 적으로 발생하기 때문에 순서가 바뀌는 경우도 있음).

- 게임 데이터 패킷을 받았기 때문에 Nook 인스턴스는 이제 "done"패킷을 보냅니다.

- 그게 전부입니다. 에뮬레이트 된 인스턴스는 어느 패킷도 수신하지 않습니다. 그것은 심지어 단일 바이트를받지 않으며, input.read()는 결코 블록하지 않고 결코 도달하지 않는 입력을 기다린다.

그래서 내 문제입니다.두 가지 중 하나가 일어나고있는 것 같습니다 :

  1. 결코 어떤 예외를 발생하지 않으며, 로그가 호출되는 것을 확인하더라도, 눅 인스턴스) output.write (가 전송되지됩니다 데이터 .

  2. 에뮬레이트 된 인스턴스의 input.read()는 데이터를 수신하지 않습니다. 어쩌면 그것은 전송에서 길을 잃을 수 있습니까?

내가 알 수있는 한, 내 코드는 견고합니다. 문제는 블루투스와 관련된 것 같습니다. 아마 하나 또는 두 개의 안드로이드 인스턴스가 느슨한 블루투스 설정을 가지고 있습니까?

드문 경우 (어쩌면 1/15 회)를 추가하고 모든 패킷을 올바르게 보내고 받아야하므로 게임이 제대로 진행됩니다. 그래서 무엇이 잘못 되었든간에 항상 사용되지만 항상 그런 것은 아닙니다.

답변

1

블루투스가 장착 된 다른 Android 기기에 액세스 할 수 있습니다. 그 이후로 나는 내 게임을 테스트했고 연결되어 장치가 데이터를 올바르게 교환합니다. 블루투스 제품 이후에 발생하는 프로그램에 몇 가지 다른 버그를 발견했습니다.하지만 여기에도 마찬가지가 아닙니다!

이전의 눅 컬러와 HTC 상태가 함께 작동합니다. 나는 컴퓨터에 결함이있는 Bluetooth 어댑터가 있음을 공식적으로 결론 짓고 있습니다. 위에 게시 된 코드는 충분히 잘 작동합니다.

관련 문제