Приложение Android не подключается к устройству с низким энергопотреблением Bluetooth

Я начинаю с разработки для Android и пытаюсь создать простое соединение Bluetooth с низким энергопотреблением между моим телефоном Android и микроконтроллером (PSoC4BLE), чтобы записать значение в одну из характеристик микроконтроллера.

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

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

Вот код:

public class MainActivity extends Activity {

// bluetooth variables
private BluetoothAdapter mBluetoothAdapter;
private BluetoothGatt mBluetoothGatt;
private BluetoothGattCharacteristic mMyCharacteristic;
private static final UUID CAR_SERVICE = UUID.fromString("00000000-0000-1000-1000-100000000000");
private static final UUID CAR_CHARACTERISTIC = UUID.fromString("00000000-0000-2000-2000-200000000000");
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
};

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // initialize bluetooth adapter
    final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();

    // create a device that represents the bluetooth device and assign it's known MAC address
    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice("00:A0:50:0F:13:1C");

    // make the connection to the device
    mBluetoothGatt = device.connectGatt(MainActivity.this, false, mGattCallback);

    // get a reference to my user interface button
    Button btnWrite = (Button)findViewById(R.id.BtnWrite);

    // define the button behaviour
    btnWrite.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // create the characteristic variable
            byte[] value = new byte[1];
            value[0] = (byte) 1;
            mMyCharacteristic.setValue(value);
            // set the service UUID and the characteristic UUID
            mMyCharacteristic = mBluetoothGatt.getService(CAR_SERVICE).getCharacteristic(CAR_CHARACTERISTIC);
            // write the characteristic en the device
            mBluetoothGatt.writeCharacteristic(mMyCharacteristic);
        }
    });
}

}

ОБНОВЛЕНИЕ 1 Наконец я получаю logcat, и он говорит:

java.lang.RuntimeException: Невозможно запустить действие ComponentInfo{lenovo.car/lenovo.car.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод 'android.bluetooth.BluetoothDevice android.bluetooth.BluetoothAdapter.getRemoteDevice.lang.String)'для ссылки на пустой объект Причины: java.lang.NullPointerException: попытка вызвать виртуальный метод'android.bluetooth.BluetoothDevice android.bluetooth.BluetoothAdapter.getRemoteDevice(java.lang.String)'для ссылки на нулевой объект

Пожалуйста, есть идеи? Я обнаружил, что приложение падает наfinal BluetoothDevice device = mBluetoothAdapter.getRemoteDevice("00:A0:50:0F:13:1C");

1 ответ

Вы не подключаетесь к удаленному устройству на самом деле.

// make the connection to the device
mBluetoothGatt = device.connectGatt(MainActivity.this, false, mGattCallback);

Получение экземпляра BluetoothGatt не достаточно, вам нужно вызвать mBluetoohGatt.connect() метод на объекте Гатта.

Обратите внимание также, что mBluetoohGatt.connect() возвращает логическое значение, указывающее, был ли отправлен запрос на подключение.

Кроме того, на следующем шаге состояние соединения должно быть изменено. Это уведомлено через

Метод mGattCallback.onConnectionStateChange().

После установления соединения вы должны отправить запрос для получения услуг устройства. Это доступно через

Метод mBluetoothGatt.discoverServices.

Если запрос на обнаружение услуг выполнен успешно, вы должны получить все сервисы вашего устройства.

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

Чтобы прочитать текущее значение по определенной характеристике, вы должны

вызовите mBluetoothGatt.readCharacteristic(), применяя характеристику, значение которой вы хотите узнать.

Характеристика со вставленным значением должна быть уведомлена через mGattCallback.onCharacteristicRead (). Это работает при условии, что признак со значением, которое вы запрашиваете, доступен для чтения.

Чтобы записать текущее значение по определенной характеристике, вы должны

вызовите mBluetoothGatt.writeCharacteristic(), применив характеристику с новым значением.

В качестве подтверждения вашего запроса вы должны получить уведомление через mBluetoothGatt.onCharacteristicWrite (). Это работает, если ваша характеристика доступна для записи.

Надеюсь, это поможет как-то.

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