安卓蓝牙RFCOMM连接过慢

4
我正在使用以下代码从我的HTC One X创建不安全的rfcomm连接到SENA蓝牙ESD110串行模块:
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(addr);
BluetoothSocket socket = null;

try{
socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString(SERVICE_UUID));

 mBluetoothAdapter.cancelDiscovery();

socket.connect();
sendMessage(socket,"working!");
socket.close();

这里的重点是使用自动配对功能连接模块,目前一切正常,但建立连接需要大约15秒钟。

调试仍然保持在:

socket.connect();

等待15秒后,才连接并将字符串传输到模块中(需要1秒钟)。

可能手机在连接MAC地址之前正在处理其他数据(服务发现等),那么如何使其连接更快呢? 或者这可能是HTC硬件问题吗?

2个回答

1

编辑 如果您的问题是慢速服务发现,您可以尝试通过直接使用反射来创建RfcommSocket方法来跳过整个服务发现 - 我在我的BT-SPP相关项目中出于其他原因而这样做 - 它看起来像这样:

BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice bd = bta.getRemoteDevice(mac);
Method m = bd.getClass().getMethod("createRfcommSocket",new Class[] { int.class });
bt_connection = (BluetoothSocket) m.invoke(bd, Integer.valueOf(1));

前置评论:您是否必须一直扫描?如果您有记住MAC地址的选项,您可以更快地连接。在我看来,长时间等待来自于发现 - 只有在这真正完成后(不是在mBluetoothAdapter.cancelDiscovery()之后直接完成),您才能连接 - 这可能需要一些时间..


嗨Ligi,我用手机的MAC地址两次连接了同一个“设备” - 没有扫描,第一次连接花费了15秒,第二次也是15秒。我认为手机正在为可用服务“扫描”蓝牙模块,这需要太长时间,但我已经给手机所需的服务UUID了... - itai
嗨,感谢您的帮助,我编辑了代码,但是在使用反射时出现了一些错误:BluetoothDevice device = mBluetoothAdapter.getRemoteDevice("00:01:95:13:5C:4F"); Method m = device.getClass().getMethod("createInsecureRfcommSocket",new Class[] { int.class }); BluetoothSocket socket = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 但是我得到了:IllegalAccessException - 未处理的异常类型InvocationTargetException。 - itai
createInsecureRfcommSocket/createRfcommSocket/createInsecureRfcommSocketToServiceRecord/createeRfcommSocketToServiceRecord - 所有对这个函数的反射都返回错误。 - itai
你能在调用之前尝试使用 m.setAccessible(true) 吗? - ligi
实际上我得到了以下异常:在这一行:Method m = device.getClass().getMethod("createRfcommSocket",new Class[] { int.class });中,未处理的异常类型为NoSuchMethodException。 - itai
我也遇到了同样的问题,连接到SPP模块的蓝牙连接总是需要10-20秒才能成功。我一直在我的代码中使用上述技术来建立连接,但它只是作为一个备选方案,如果.connect()失败并出现众所周知的“无法启动发现”异常,那么上述反射方法就是一个众所周知的解决方法。然而,我改变了我的代码,直接使用反射方法,而不必先尝试.connect()方法,现在它可以立即连接。所以我给个赞。 - Trevor

0

第二次会更快吗?在设备获取目标设备的定时信息之前,第一次查找电话需要一段时间。

然而,即使必须查找目标,也不应该需要15秒钟。

也许你正在遇到这个错误: http://code.google.com/p/android/issues/detail?id=29039

请注意,有一种情况下创建连接可以工作,但需要比正常情况下更长时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接