Android Bluetooth Низкое энергопотребление Gatt Ошибка реализации сервиса

Я использовал пакет android.bluetooth в своем проекте, но я пытаюсь реализовать IBluetoothGatt для чтения и записи характеристик. Но у меня есть некоторые проблемы, как показано ниже

public final class BluetoothGatt implements BluetoothProfile {
    private static final String TAG = "BluetoothGatt";
    private static final boolean DBG = true;
    private static final boolean VDBG = false;

    private IBluetoothGatt mService;  // IBluetoothGatt red highlights. Some functions in IBluetoothGatt interface just work by put breakpoints.

    private BluetoothGattCallback mCallback;
    private int mClientIf;
    private boolean mAuthRetry = false;
    private BluetoothDevice mDevice;
    private boolean mAutoConnect;
    private int mConnState;
    private final Object mStateLock = new Object();
    private Boolean mDeviceBusy = false;
    private int mTransport;

    private static final int CONN_STATE_IDLE = 0;
    private static final int CONN_STATE_CONNECTING = 1;
    private static final int CONN_STATE_CONNECTED = 2;
    private static final int CONN_STATE_DISCONNECTING = 3;
    private static final int CONN_STATE_CLOSED = 4;

    private List<BluetoothGattService> mServices;

написать характерные красные блики в интерфейсе IBluetoothGatt

public void onCharacteristicWrite(String address, int status, int handle) {
            if (VDBG) Log.d(TAG, "onCharacteristicWrite() - Device=" + address
                        + " handle=" + handle + " Status=" + status);

            if (!address.equals(mDevice.getAddress())) {
                return;
            }

            synchronized(mDeviceBusy) {
                mDeviceBusy = false;
            }

            BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle);
            if (characteristic == null) return;

            if ((status == GATT_INSUFFICIENT_AUTHENTICATION
              || status == GATT_INSUFFICIENT_ENCRYPTION)
              && mAuthRetry == false) {
                try {
                    mAuthRetry = true;
                    mService.writeCharacteristic(mClientIf, address, handle,
                        characteristic.getWriteType(), AUTHENTICATION_MITM,
                        characteristic.getValue());
                    return;
                } catch (RemoteException e) {
                    Log.e(TAG,"",e);
                }
            }

2 ответа

Использовать эту статью очень полезно. BLE

Комментарий, если у вас есть какие-либо проблемы

Вот код для подключения к устройству.

public boolean connect(final String address)
{

    if (mBluetoothAdapter == null || address == null)
    {
        Log.e(TAG, "BluetoothAdapter not initialized or unspecified address.");
        return false;
    }
    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
    if (device == null)
    {
        Log.e(TAG, "Device not found.  Unable to connect.");
        return false;
    }
    // We want to directly connect to the device, so we are setting the autoConnect
    // parameter to false.
    mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

    return true;
}

Для справки, источники IBluetoothGatt можно найти по адресу: https://android.googlesource.com/platform/packages/apps/Bluetooth/+/android-5.0.2_r1/src/com/android/bluetooth/gatt/GattService.java . #259

Android использует систему под названием Binder (модель IPC, специфичную для Android) для отделения пользовательских приложений (т. е. приложения, которое вы пишете) от системных служб, которые фактически реализуют эту функциональность. Для большей части платформы Android код связывается с вашим приложением «напрямую» без необходимости использования моста IPC, поэтому вы привыкли легко находить исходный код через свою IDE. Для более сложных случаев использования, когда важно явное разделение процессов, они используют мост IPC и скрывают функциональность за автоматически созданным интерфейсом IPC, созданным из вспомогательного файла (обычно это ISomethingSomething, и вы можете найти файл ISomethingSomething.aidl в основном файле). исходники фреймворка). Например, IBluetoothGatt.aidl.

Реализация этих вспомогательных файлов обычно находится в frameworks/base/services или в одном из каталогов frameworks/base/opt. В случае Bluetooth он находится в одном из каталогов поставляемых пакетов . Разница здесь связана с тем, хотят ли они иметь возможность создавать версии Android с APK или без него. Например, если они хотят поставлять версии Android без поддержки Bluetooth, они могут для этого просто исключить APK-пакет Bluetooth.

Просмотр этих источников иногда важен, поскольку таким образом вы найдете множество неожиданных ошибок или просто неправильную документацию, особенно для новейших API.

Другие вопросы по тегам