好的,虽然有一段时间了,但我找到了解决问题的方法。 我实际上打算放弃并使用UUID,但是我一直收到“服务发现失败(IO)异常”,当我试图找到解决服务发现问题的方法时,我找到了我的原始问题的解决方法... 生活不是很奇妙吗?:)
无论如何,这是我偶然发现的链接,尽管您应该注意答案中有一个错误(他们实际上只连接到端口1,而没有使用服务UUID)。
在这个简短的历史课之后,下面是解决方案:
使用反射,可以创建连接到端口号而不是UUID的Rfcomm socket:
int bt_port_to_connect = 5; // just an example, could be any port number you wish
BluetoothDevice device = ... ; // get the bluetooth device (e.g., using bt discovery)
BluetoothSocket deviceSocket = null;
...
// IMPORTANT: we create a reference to the 'createInsecureRfcommSocket' method
// and not(!) to the 'createInsecureRfcommSocketToServiceRecord' (which is what the
// android SDK documentation publishes
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
deviceSocket = (BluetoothSocket) m.invoke(device,bt_port_to_connect);
需要注意以下几点:
祝大家好运。
我正在使用bluecove,它允许我使用函数Connector.open()
来实现。
我使用以下URL:btspp://" + phoneID + ":" + phonePort
注意:可以添加一些选项(例如:authenticate=false;
或encrypt=false;
)。
phoneID
是蓝牙地址,phonePort
是端口号。
如何找到蓝牙地址? 从这个链接:
- 从主屏幕打开应用抽屉,然后打开“设置”。
- 选择“系统”。 (在某些型号上跳过此步骤)
- 向下滚动到底部,点击“关于手机”,“关于设备”或“关于平板电脑”。
- 向下滚动并点击“状态”。
- 向下滚动,列表中将显示“蓝牙地址”。
如何找到端口号? 我还没有找到应该使用哪个端口号... 我用了5,它可以工作,但我需要研究为什么,如果我想更换手机,我需要知道是否也需要更改端口。
蓝牙 Android 连接是通过 UUID 独占完成的。每个蓝牙设备都有一个 UUID,用于运行每个服务(请参见蓝牙 SDP)。
您只需向 Android 提供要监视的 UUID,在客户端模式下,它将自动找到要连接的套接字(包括端口)。在服务器模式下,它将等待指定的设备使用指定的 UUID 发起连接。 当建立连接时,BluetoothSocket 对象也是有效的(使用 getInput/Output Stream) 请参阅 Server Socket documentation 和 Client Socket documentation。
如果你真的想要检查所有内容,你可以查看Android从其他设备的SDP和你提供的UUID解码出来的内容。
使用这个教程获取蓝牙接口(非常容易)。 然后代码应该类似于这样:
IBluetooth ib =getIBluetooth();
Int otherDevicePort = ib.getRemoteServiceChannel(otherDeviceAddress, UUID);