2012-07-27 173 views
4

我试图将数据从android设备发送到支持串行端口配置文件(SPP)的远程蓝牙设备。每次按下按钮后,我都会注意到每次打开和关闭套接字时,它都太慢了。 Run()和Onclick()函数应该执行哪些套接字命令?以下是这确实蓝牙IO类:使用Android设备通过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) 
    ... 

我在做什么错?

谢谢。

+0

之前不会丢失什么是您需要的那种蓝牙I/O的最小测试用例。所有的蓝牙操作都可能发生在一个测试功能之内吗?如果你可以提供,它可能更容易调试。 – speciousfool 2012-07-31 09:56:47

+0

您是否在清单中设置了正确的权限? – ligi 2012-07-31 10:54:43

+0

我有同样的问题..你有没有得到任何解决方案? – 2012-08-09 05:29:34

回答

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()调用

相关问题