2012-07-27 4 views
4

안드로이드 장치에서 SPP (Serial Port Profile)를 지원하는 원격 블루투스 장치로 데이터를 보내려고합니다. 버튼을 누를 때마다 소켓을 열고 닫을 때마다 너무 느립니다. 어떤 소켓 명령을 Run() 및 Onclick() 함수에서 실행해야합니까? 오류 메시지와 페어링 후안드로이드 장치를 사용하여 SPP를 통해 블루투스를 통해 데이터를 전송합니다.

public class Selecteddevice extends Activity implements OnClickListener { 

private static final String TAG = "THINBTCLIENT"; 
private BluetoothAdapter mBluetoothAdapter = null; 
private BluetoothDevice device; 
private BluetoothSocket btSocket = null; 
private OutputStream outStream = null; 

private static final UUID MY_UUID = 
     UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
public static String address; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    this.setContentView(R.layout.selecteddevice); 
    findViewById(R.id.toggleButton1).setOnClickListener(this); 
    findViewById(R.id.toggleButton2).setOnClickListener(this); 
    findViewById(R.id.toggleButton3).setOnClickListener(this); 

} 

@Override 
public void onStart() { 
    super.onStart(); 

    String address = getIntent().getStringExtra("address"); 
    TextView tv1 = (TextView) findViewById(R.id.textView_address); 
    tv1.setText("      DEVICE ADDRESS:  " + address); 

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    device = mBluetoothAdapter.getRemoteDevice(address); 
    run(); 
} 

public void run(){ 
    mBluetoothAdapter.cancelDiscovery(); 
    try { 
     btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 

    } catch (IOException e) 
    { 
     Log.e(TAG, "ON START: Socket creation failed.", e); 
    } 

    try { 
     btSocket.connect(); 

    } catch (IOException e) 
    {  
     Log.e(TAG, "sendTestByte: Socket connection failed.", e); 
    } 
} 

public void sendTestString(String s){ 
    try { 
     outStream = btSocket.getOutputStream(); 

    } catch (IOException e) 
    {  
     Log.e(TAG, "sendTestByte: OutputStream creation failed.", e); 
    } 

    try { 
     outStream.write(s.getBytes()); 
     Log.d(TAG, "sendTestByte: OutputStream write succeeded."); 

    } catch (IOException e) 
    {  
     Log.e(TAG, "sendTestByte: OutputStream writefailed.", e); 
    }  
} 


public void onClick(View v){ 
    switch(v.getId()) 
    { 
    case R.id.toggleButton1: 
     this.sendTestString("1"); 
     break; 
    case R.id.toggleButton2: 
     this.sendTestString("2"); 
     break; 
    case R.id.toggleButton3: 
     this.sendTestString("3"); 
     break; 
    } 
}   

@Override 
public void onPause() { 
    super.onPause(); 
    if (outStream != null) { 
     try { 
      outStream.flush(); 
     } catch (IOException e5) 
     { 
      Log.e(TAG, "ON PAUSE: Couldn't flush output stream.", e5); 
     } 
    } 
    try { 
     btSocket.close(); 
    } catch (IOException e6) 
    { 
     Log.e(TAG, "ON PAUSE: Unable to close socket.", e6); 
    } 
} 

@Override 
public void onStop() { 
    super.onStop(); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

} 

}


내 프로그램이 충돌 : 내가 잘못

07-27 13:00:57.483: E/THINBTCLIENT(7855): sendTestByte: OutputStream writefailed. 
    07-27 13:00:57.483: E/THINBTCLIENT(7855): java.io.IOException: socket closed 
    07-27 13:00:57.483: E/THINBTCLIENT(7855): at 
    android.bluetooth.BluetoothSocket.write(BluetoothSocket.java:331) 
    ... 

를하고있는 중이 야 무엇 블루투스 IO를 수행하는 클래스가되어 다음?

감사합니다.

+0

필요한 Bluetooth I/O 종류에 대한 최소 테스트 사례는 무엇입니까? 하나의 테스트 기능 안에서 모든 블루투스 동작이 가능합니까? 당신이 제공 할 수 있다면 디버그하기가 더 쉬울 수도 있습니다. – speciousfool

+0

매니페스트에 올바른 권한이 설정되어 있습니까? – ligi

+0

나는 같은 문제가 있습니다. 어떤 해결책을 얻었습니까 ??? –

답변

3
당신이 연결이 오류없이 설립하고, 다음과 같이 run() 방법에 OutputStream 멤버를 할당하려고 소켓를 얻을 수 있는지 경우

:

public void run() 
{ 
    mBluetoothAdapter.cancelDiscovery(); 
    try 
    { 
     btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);   
    } catch (IOException e) 
    { 
     Log.e(TAG, "ON START: Socket creation failed.", e); 
    } 

    try 
    { 
     btSocket.connect();  
    } catch (IOException e) 
    {  
     Log.e(TAG, "sendTestByte: Socket connection failed.", e); 
    } 

    try 
    { 
     outStream = btSocket.getOutputStream(); 
    } catch (IOException e) 
    {  
     Log.e(TAG, "sendTestByte: OutputStream creation failed.", e); 
    } 
} 

public void sendTestString(String s) 
{  
    try 
    { 
     outStream.write(s.getBytes()); 
     outSttream.flush(); // <-- Try flush to force sending data in buffer 
     Log.d(TAG, "sendTestByte: OutputStream write succeeded."); 
    } catch (IOException e) 
    {  
     Log.e(TAG, "sendTestByte: OutputStream writefailed.", e); 
    }  
} 

당신이 실제로 종료되지 않은 소켓을하지만,이 작동해야합니다. write() 전화를하기 전에 마스터 장치와의 연결이 끊어지지 않았는지 확인하십시오.

관련 문제