Android 5.0多个BLE设备服务发现

时间:2017-03-24 12:40:24

标签: android bluetooth-lowenergy

我已经开始新开发Android应用程序了。我有完全相同的设备具有不同的MAC地址,我需要同时或分别发现服务,特性和读取数据。在我的使用案例中,设备必须与平板电脑或手机配对。我可以连接到BluetoothGatt并获得BluetoothGattCalback,我可以发现服务,特性和读取数据。如果我将两个或更多设备配对,我只能发现一个设备的服务。当我列出我正在编写设备的服务时#39; MAC地址,以了解哪个服务属于哪个设备。 这是我的BluetoothGattCalback:

    private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        String intentAction;
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            intentAction = ACTION_GATT_CONNECTED;
            mConnectionState = STATE_CONNECTED;
            broadcastUpdate(intentAction);
            Log.i(TAG, "Connected to GATT server.");
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:" +
                    mBluetoothGatt.discoverServices());
            try{
                mBluetoothGatt.wait(1000);
            }catch (Exception e){

            }

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            intentAction = ACTION_GATT_DISCONNECTED;
            mConnectionState = STATE_DISCONNECTED;
            Log.i(TAG, "Disconnected from GATT server.");
            broadcastUpdate(intentAction);
            //mBluetoothGatt.disconnect();
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
        } else {
            Log.w(TAG, "onServicesDiscovered received: " + status);
        }
        //mBluetoothGatt.disconnect();

    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
                                     BluetoothGattCharacteristic characteristic,
                                     int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }
        mBluetoothGatt.disconnect();

    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) {
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
    }
};

以下代码是我如何连接到gatt:

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    for (BluetoothDevice bd:mBluetoothAdapter.getBondedDevices()
         ) {
        mBluetoothGatt=bd.connectGatt(this,false,mGattCallback);
        try{
            Thread.sleep(250);
        }catch(Exception e){

        }
    }

我试图将Thread.sleep(250)增加到500-1000-2000没有任何改变。 也许我不知道如何正确循环以连接每个设备的gatt。

注意:有时会发现服务,并且两个设备的列表加倍,但列出的设备MAC地址全部相同。

重要提示:我不想构建多个BluetoothGattCalback和BluetoothGatt,因为设备数量在任何情况下都可能发生变化。

任何帮助将不胜感激。 感谢。

编辑:

通过使BluetoothGattCallback的Override方法同步并使用内部BluetoothGatt参数而不是@Emil提到的全局参数来解决上述问题。但它给我带来了所有新问题:

如果我没有重新启动我的BLE设备,那么在发现服务后它就无法连接到GATT服务器,即使我重新启动程序。

1 个答案:

答案 0 :(得分:1)

问题是你在第二次循环迭代中覆盖了mBluetoothGatt。当您在设备连接后再调用mBluetoothGatt.discoverServices()时,您将在错误的gatt对象上执行discoverServices()。只需直接使用gatt参数而不是mBluetoothGatt。

你应该删除那些睡眠并等待电话。