按顺序为CLassic和Low Energy Devices进行Android蓝牙设备扫描/发现

时间:2014-11-27 11:21:01

标签: android bluetooth bluetooth-lowenergy discovery network-scan

我正在开发一款Android应用程序,用于搜索经典和低能耗蓝牙设备,这样当我按下“搜索”按钮时,它会向我显示范围内的所有蓝牙设备(低能量和经典)。由于经典的BT发现和LE扫描是不同的东西,我必须单独实现它们并将它们组合在一个功能中,以便

searchFirstLowEnergyThenClassic()或searchFirstClassicThenLowEnergy()

为了实现这一点,我必须知道发现/扫描何时结束,以便我立即开始扫描/发现其他技术。

这是我的实施:

  1. 开始经典BT发现
  2. 收到BluetoothAdapter.ACTION_DISCOVERY_FINISHED
  3. 开始BLE Scaning - > onReceive动作等于(ACTION_DISCOVERY_FINISHED)
  4. BLE扫描结束时停止搜索
  5. 这看起来不错,但是当我扩展行为时会出现问题。当我想要搜索时,我首先使用LE扫描或基于最后连接技术的经典发现进行搜索。例如,如果设备上次连接到Classic BT设备,则运行searchFirstClassicThenLowEnergy()。否则,searchFirstLowEnergyThenClassic()。

    正如您可能猜到的那样,它变得更加复杂。例如,当经典BT发现结束时,应用程序应该知道搜索是否结束还是应该继续进行LE扫描。

    还有这个问题。当用户在扫描/发现第一项技术期间停止搜索时,它将收到BluetoothAdapter.ACTION_DISCOVERY_FINISHED,但由于搜索被用户终止,因此不应启动LE扫描。

    我使用一些标志(虽然工作不正常)实现了这个但是我的代码看起来很脏。

    else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                // Classic Bluetooth discovery ended
                lastOpenedType = getLastOpenedType();
                if (lastOpenedType == BT_CLASSIC && !isSearchStoppedByUser()) {
                    // Search should continue with low energy scan
                    startBtLeScanning();
                } else if (lastOpenedType != BT_CLASSIC && !isSearchStoppedByUser()){
                    // Search ended
                    searchProgressLayout.setVisibility(View.INVISIBLE);
                } else {
                    // Search ended by user
                    searchProgressLayout.setVisibility(View.INVISIBLE);
                }
          }
    

    简而言之,我在问一个人是否有更明智,更简单的解决方案?

    PS。如果可能的话,非常感谢没有广播意图的解决方案。

2 个答案:

答案 0 :(得分:6)

BluetoothAdapter的startDiscovery()方法搜索经典和BLE设备。从扫描中获得结果后,您可以根据设备类型将它们分开。例如:

int deviceType = device.getType();

if(deviceType == BluetoothDevice.DEVICE_TYPE_CLASSIC)
{

}
else if(deviceType == BluetoothDevice.DEVICE_TYPE_LE)
{

}
else if(deviceType == BluetoothDevice.DEVICE_TYPE_DUAL)
{   

}

因此,不需要单独搜索。

答案 1 :(得分:-1)

startLESCan是一种更先进,更好的扫描蓝牙设备的方法,具有一些进步,如耗能更少。