以下是服务器端的一系列事项:
>检查各种蓝牙状态(适配器可用,已启用等).
>使用我选择的预定义UUID调用listenUsingRfcommWithServiceRecord().
>请求使设备可被发现
>由于可被发现异步发生,我调用accept()并等待传入连接.
在客户端:
>检查各种蓝牙状态(适配器可用,已启用等).
>对于getBondedDevices()中的每个设备,我将getName()与服务器名称进行比较.如果匹配,请跳至步骤6.
>开始BT发现
>对于每个已发现的设备(请注意,2a中的配对设备未显示在此处),请将设备名称与服务器名称进行比较.如果匹配,请转到步骤6.
>取消发现
>在从步骤2找到的设备上,使用服务器端使用的相同预定义UUID调用createRfcommSocketToServiceRecord().
>调用connect()并等待它返回连接的套接字.
当客户端和服务器之前从未配对时,上述过程对我来说非常好.但是,Android在设备列表中注册后,它们将不可避免地在connect()/ accept()阶段超时.
我一直在寻找解决方案几天,并尝试了很多东西,包括这个:
Connecting to a already paired Bluetooth device
反射方法对我也不起作用.似乎connect()会立即返回,但是当我尝试getOutputStream()时,我得到一个异常.在accept()方面,它甚至没有注册有人试图连接.我认真地需要一些帮助或指针来让设备在之前配对后建立连接.
以下是有关设备的一些信息:
>我正在测试两台LG G2X手机上的服务器和客户端.
>它们都运行在Android 2.3.3上,对应于API级别10.
>再次,上述工作在我在设置中手动取消配对后工作.
提前谢谢你.我在Android和蓝牙方面大约有两周的时间,所以如果您发现任何缺失的步骤或最佳做法,请同时指出它们.
解决方法
为了正确建立蓝牙连接,我必须做一些类似于下面的伪代码:
BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); socket.connect();
我完全按照蓝牙聊天示例得到了这个答案:Bluetooth Chat Service.为什么它从getBondedDevices()无法在设备上运行超出我的范围.也许对Android有更多了解的人可以回答这个问题.