Bluetooth :Connection refused问题

Jevons_z 发布于 2014/05/27 17:15
阅读 919
收藏 0

    我先说一下我主要的工作,我在开发安卓蓝牙APP,目的是为了实现:在安卓电视上安装此APP,然后通过这个APP连接到蓝牙游戏手柄上。

    跟大多数人一样,主要的问题出现在蓝牙的连接上。

    在蓝牙连接部分,一开始我用的是官网的程序来发起请求连接:

    try{
        tmp = mDevice.createRfcommSocketToServiceRecord(myUUID);
    }catch(IOException e){}
    mSocket = tmp;

    然后就是mSocket.connect();

    其中有private final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");不过这里面一直会报uable to start discovery的错误,从而蓝牙设备也无法正常的连接。后来技术论坛上找到同样的问题,有网友提供了解决方法,就是讲上面程序修改成为:

    try{
         m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
         try {
             tmp = (BluetoothSocket)m.invoke(mDevice, 1);
         } catch (IllegalAccessException e) {
              // TODO Auto-generated catch block
             e.printStackTrace();
        } catch (IllegalArgumentException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
        } catch (InvocationTargetException e) {
             // TODO Auto-generated catch block
              e.printStackTrace();
        }
    }catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mSocket = tmp;

    然后再开启mSocket.connect();

    我照做了,把程序修改了之后,自己开发的蓝牙APP终于能正常连接了。不过这个正常的连接是建立在两台开发的安卓手机上。

    后面我便尝试着用其中一台装有该APP的安卓手机去请求连接蓝牙游戏手柄(说明一点,蓝牙游戏手柄是成品设备,开关打开之后它便在那里等待其他蓝牙设备如蓝牙手机去请求连接它,然后正常的话它会反馈会配对连接的信息),但是,如下的问题出现了:

java.io.IOException: Connection refused
at android.bluetooth.BluetoothSocket.connectNative(Native Method)
at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:204)
at com.Jevons.bluetooth.MainActivity$ConnectThread.run(MainActivity.java:492)

    在请求连接上,一直被游戏手柄拒绝。结果很明显,连接失败了。

    说了那么多,我想表达的问题就是:为什么会出现这种拒绝连接的错误?求各位有经验或者有研究的神友能够协助小弟一把。

    前面的一长串铺垫,除了表达这个app建立在安卓手机上的时候能够正常的建立起连接(不管是作为服务端还是作为客户端),其实也是想让蓝牙APP开发的遇到类似的连接问题的同胞们,也能借鉴一下。

以下是问题补充:

@Jevons_z:补充一点,虽然用了网友建议的程序之后,APP能正常在手机上运行,但是,程序里面使用的 m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); tmp = (BluetoothSocket)m.invoke(mDevice, 1); 这两句表达的是什么意思呢? 改成了这两句,是不是意味着Client端不需要用到UUID?还是说这两句语言里面已经用了UUID,只是我们没看出来而已。 求大神指点迷路。。。 (2014/05/27 17:30)
加载中
0
Oneself丶x
Oneself丶x
http://my.oschina.net/hes/blog/228911 看看我这个对你有帮助没!
J
Jevons_z
你好,谢谢你。我看了一下你的东西,也修正了我的程序,在Connect之前发起配对请求,不过结果还是fail了。
0
L
Luantian
sdk 2.3以上的用createRfcommSocketToServiceRecord方法连接不上,须采用createInsecureRfcommSocketToServiceRecord方法(此方法需sdk2.3以上才有)。                

UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
int sdk = Integer.parseInt(Build.VERSION.SDK);
if (sdk >= 10) {
     btSocket = btDev.createInsecureRfcommSocketToServiceRecord(uuid);
} else {
      btSocket = btDev.createRfcommSocketToServiceRecord(uuid);
}
返回顶部
顶部