使用不带MAC地址的createInsecureRfcommSocketToServiceRecord进行Android蓝牙连接

时间:2016-06-27 07:25:32

标签: android bluetooth mac-address rfcomm beacon

我正在创建一个与蓝牙信标通信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建立连接?请注意,我不想配对设备。

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

1 个答案:

答案 0 :(得分:1)

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

是的,如果周围有许多蓝牙设备,扫描可能会占用一些电力和CPU。您可以通过以下两种方式进行限制:

  1. 仅短暂扫描。对于您的使用案例,您似乎可以扫描几秒钟,然后在找到支持设备后停止。这不应该太耗费资源。

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