Android蓝牙socket.connect()失败

时间:2014-07-04 11:56:25

标签: android sockets bluetooth connection

我试图在Android设备和RFID阅读器蓝牙之间建立连接。为此,我使用蓝牙聊天代码(bluetooth chat example)。但是当我在蓝牙聊天示例的第329行进行mmSocket.connect();时,每次java.io.IOException都会生成连接。我也试过这个方法来获取套接字:

tmp = mDevice.createRfcommSocketToServiceRecord(MY_UUID);
Method m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(mDevice, 1);

但没有。我尝试了3种不同的设备。第一个,运行android 4.4.2的Samung S2给了我这个错误:

failed:read failed, socket might closed, read ret: -1

运行android 4.0.3的平板电脑给我这个错误:

IOException: Connection refused

好奇心是,如果我尝试将手机与平板电脑连接,我就会失败。但是,如果我在这个应用程序的2个设备中运行,并且我尝试连接第二个,而第二个是搜索某些设备进行连接,则连接成功。但只有当第二个设备运行此应用程序并搜索某些设备才能连接时。我也试图取消配对,但没有。最后我想说,如果我尝试通过设置连接2台设备或一台设备与我的rfid蓝牙读卡器连接成功。最后我想说,当我试图将2个设备或设备与阅读器rfid连接时,如果设备没有配对,请比较一个要求我配对2设备的对话框,但之后这个连接失败了。

4 个答案:

答案 0 :(得分:6)

您的代码采用安全的BT连接,并以两种不同的方式尝试(这很好)。您需要尝试的第一个测试是使用以下方法不安全的BT连接

BluetoothSocket sock;

// open API
sock = device.createInsecureRfcommSocketToServiceRecord(serviceUuid);

// if failed: hidden API
createMethod = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class });
sock = (BluetoothSocket)createMethod.invoke(device, 1);


如果这不能解决问题,你应该问题。转向检查正确性 您传递给创作方法的uuid。你可能(?)使用了 默认SPP uuid:

UUID DEFAULT_SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

这适用于许多设备,但不适用于所有设备。


尝试询问您的同伴以获取其支持的uuids列表

// for apiVer >= 15
supportedUuids = device.getUuids();


// for apiVer < 15
try {
   Class cl = Class.forName("android.bluetooth.BluetoothDevice");
   Class[] params = {};
   Method method = cl.getMethod("getUuids", params);
   Object[] args = {};
   supportedUuids = (ParcelUuid[])method.invoke(device, args);
}
catch (Exception e) {
    // no op
    Log.e("uuids", "Activation of getUuids() via reflection failed: " + e);
}

并且,如果不为空,则使用数组中的第一个作为创建方法的参数。

您也可以使用由您自己编写的BTWiz,在透明的直通模型中为您完成所有这些操作,并且还支持异步蓝牙IO。

答案 1 :(得分:2)

我遇到了同样的问题。它很容易解决。您必须使用他的配置程序将您的RFID阅读器配置为SPP协议,然后他将工作。

答案 2 :(得分:1)

我也有这个问题,我尝试了这篇文章中所说的一切,但没有任何对我有用。我终于解决了这个问题。 我的错误代码使用类变量BluetoothAdapter来检查蓝牙是否打开,如下所示:

public class PrintClass extends Activity  {
private XXXX myClassVar;
private BluetoothAdapter bluetooth; // created and checked in other method

... other methods in my class....

}

我一直 bt套接字连接失败 。但我使用私有方法来激活蓝牙,插座问题就消失了。

    public class PrintClass extends Activity  {

private XXXX myClassVar;

private void turnBlueToothOn(){

     try {
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
        if(!bluetooth.isEnabled()){
            bluetooth.enable();
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
....other methods in my class....
}

为什么?我不知道,只为我工作!!!!

答案 3 :(得分:0)

有时,客户端蓝牙到服务器蓝牙的命令连接不起作用。它可能是驱动程序中的错误或蓝牙模块中的错误,或者库中的错误在Java中实现蓝牙。对我来说,只有帮助关闭,然后打开蓝牙,然后连接开始正常工作。