Android 使用没有 MAC 地址的 createInsecureRfcommSocketToServiceRecord 的蓝牙连接

Android Bluetooth connection using createInsecureRfcommSocketToServiceRecord without MAC address

我正在创建一个用于 Android 移动设备与蓝牙信标通信的应用程序。我已经在一个信标(充当客户端)和一个 android 移动设备(充当服务器,监听连接)之间成功实现了这一点。请在下面找到代码片段,

客户端应用程序

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MACaddress);
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c"));
mBluetoothAdapter.cancelDiscovery();
socket.connect();

服务器应用程序

mmServerSocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("NAME", UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c"));
socket = mmServerSocket.accept();

这适用于一台移动设备(服务器),我可以通过扫描附近的蓝牙设备获得它的 MACaddress。但考虑一下范围内大约有 20-25 个移动设备的情况——扫描会消耗很多时间。我想在不执行扫描的情况下执行此操作。

有没有办法不使用服务器的 MACaddress 来实现这一点?是否可以单独使用唯一的 UUID 建立连接?请注意,我不想配对设备。

也欢迎在这方面的任何其他解决方案。谢谢!

您不能在不识别蓝牙设备本身的情况下创建与蓝牙设备的套接字连接,并且蓝牙设备的唯一标识符是 MAC 地址。即使有一个 Android API 允许您单独通过 UUID 执行此操作,底层实现仍然必须搜索附近的设备(例如扫描)并找到一个接受套接字连接的设备UUID。所以问题中提到的扫描仍然必须发生。

是的,如果附近有许多蓝牙设备,扫描会消耗一些电量,而且 CPU 会非常耗电。您可以通过两种方式进行限制:

  1. 只简单扫了一眼。对于您的用例,您似乎只需扫描几秒钟,然后在找到支持设备后停止。这应该不会占用太多资源。

  2. 在 Android 5.0+ 上使用扫描过滤器以仅匹配您感兴趣的设备。