使用android设备通过SPP通过蓝牙发送数据

使用android设备通过SPP通过蓝牙发送数据,android,bluetooth,Android,Bluetooth,我正在尝试将数据从android设备发送到支持串行端口配置文件(SPP)的远程蓝牙设备。我注意到每当我在每次按下按钮后打开和关闭插座时,它都太慢了。在Run()和Onclick()函数中应该执行哪些套接字命令?以下是一个执行蓝牙IO的类: public class Selecteddevice extends Activity implements OnClickListener { private static final String TAG = "THINBTCLIENT"; priva

我正在尝试将数据从android设备发送到支持串行端口配置文件(SPP)的远程蓝牙设备。我注意到每当我在每次按下按钮后打开和关闭插座时,它都太慢了。在Run()和Onclick()函数中应该执行哪些套接字命令?以下是一个执行蓝牙IO的类:

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)
    ...
我做错了什么


谢谢。

如果您确定连接已建立且没有任何错误,并且可以获取套接字,请尝试在
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);
    }       
}
public void run()
{
mBluetoothAdapter.cancelDiscovery();
尝试
{
btSocket=device.createrFComSocketToServiceRecord(我的UUID);
}捕获(IOE异常)
{   
Log.e(标记“启动时:套接字创建失败”,e);
}
尝试
{
btSocket.connect();
}捕获(IOE异常)
{       
e(标记“sendTestByte:套接字连接失败”,e);
}   
尝试
{
outStream=btSocket.getOutputStream();
}捕获(IOE异常)
{       
Log.e(标记“sendTestByte:OutputStream创建失败”,e);
}
}
公共void sendTestString(字符串s)
{    
尝试
{
outStream.write(s.getBytes());

outstream.flush();//对于您需要的蓝牙I/O类型,最简单的测试用例是什么?是否所有的蓝牙操作都可能发生在一个测试函数中?如果您能提供,调试可能会更容易。您在清单中设置了正确的权限吗?我也有同样的问题。.您有什么解决方案吗???