Android -BLE - Проблемы записи данных в характеристику - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь записать данные в BLE-характеристику c, но я получил статус 130 в моем обратном вызове, что означает GATT_WRONG_STATE. К сожалению, я понятия не имею, в каком состоянии что-то не так и как я могу это изменить.

Я использую BLE-приложение из Android образцов подключения (https://github.com/android/connectivity-samples/tree/master/BluetoothLeGatt ) с небольшими изменениями пока.

Вот моя DeviceControlActivity:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
            mConnected = true;
            updateConnectionState(R.string.connected);
            invalidateOptionsMenu();
        } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
            mConnected = false;
            updateConnectionState(R.string.disconnected);
            invalidateOptionsMenu();
            clearUI();
        } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            // Show all the supported services and characteristics on the user interface.
            displayGattServices(mBluetoothLeService.getSupportedGattServices());
        } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
            displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
            testWriteToCharacteristic();
        }
    }
};

private void testWriteToCharacteristic() {
        Log.d(TAG, "testWriteToCharacteristic");
        if (mNameService == null) {
            for (BluetoothGattService gattService: mBluetoothLeService.getSupportedGattServices()) {
                if (gattService.getUuid().equals(SampleGattAttributes.UUID_NAME_SERVICE)) {
                    mNameService = gattService;
                    Log.d(TAG, "rename service found");
                    break;
                }
            }
            mNameCharacteristic = mNameService.getCharacteristic(SampleGattAttributes.UUID_NAME_CHANNEL_CHARACTERISTICS);
        }
        mBluetoothLeService.writeCharacteristic(mNameCharacteristic);
    }
    [..]

.. поэтому я пытаюсь записать данные сразу после получения текущего значения для этой характеристики c. (делает это сразу после того, как ACTION_GATT_SERVICES_DISCOVERED также не работает)

и здесь мои изменения в BluetoothLeService:

 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
     [..]
     @Override
     public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
         Log.d(TAG, "onCharacteristicWrite, Status: " + status + ", " + characteristic.getUuid().toString());
         super.onCharacteristicWrite(gatt, characteristic, status);
         //Log.d(TAG, "onCharacteristicWrite value:"+characteristic.getStringValue(0)+" ");
     }

     @Override
     public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
         Log.d(TAG, "onReliableWriteCompleted");
         super.onReliableWriteCompleted(gatt, status);
     }
 };

 public void writeCharacteristic(BluetoothGattCharacteristic ch) {
     if (mBluetoothGatt == null) return;
     ch.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
     mBluetoothGatt.beginReliableWrite();
     String value = "TestValue" + new Random().nextInt(1000) + "\0";
     ch.setValue(value);
     mBluetoothGatt.writeCharacteristic(ch);
     mBluetoothGatt.executeReliableWrite();
 }

callbackMethod "onCharacteristicWrite" вызывается со статусом 130 GATT_WRONG_STATE. "onReliableWriteCompleted" никогда не вызывается. Я перепробовал все 3 настройки типа записи безрезультатно.

Вот вывод журнала:

2020-04-08 15:03:25.540 4290-4315/com.example.android.bluetoothlegatt I/BluetoothLeService: Connected to GATT server.
2020-04-08 15:03:25.540 4290-4315/com.example.android.bluetoothlegatt D/BluetoothGatt: discoverServices() - device: E1:4B:30:8B:ED:AD
2020-04-08 15:03:25.541 4290-4315/com.example.android.bluetoothlegatt I/BluetoothLeService: Attempting to start service discovery:true
2020-04-08 15:03:26.484 4290-4307/com.example.android.bluetoothlegatt D/BluetoothGatt: onConnectionUpdated() - Device=E1:4B:30:8B:ED:AD interval=6 latency=0 timeout=500 status=0
2020-04-08 15:03:27.178 4290-4307/com.example.android.bluetoothlegatt D/BluetoothGatt: onSearchComplete() = Device=E1:4B:30:8B:ED:AD Status=0
2020-04-08 15:03:27.291 4290-4315/com.example.android.bluetoothlegatt D/BluetoothGatt: onConnectionUpdated() - Device=E1:4B:30:8B:ED:AD interval=171 latency=6 timeout=600 status=0
2020-04-08 15:03:27.340 4290-4298/com.example.android.bluetoothlegatt I/bluetoothlegat: Compiler allocated 4MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
2020-04-08 15:03:28.742 4290-4290/com.example.android.bluetoothlegatt D/BluetoothAdapter: isLeEnabled(): ON
2020-04-08 15:03:28.742 4290-4290/com.example.android.bluetoothlegatt D/BluetoothLeScanner: could not find callback wrapper
2020-04-08 15:03:31.711 4290-4290/com.example.android.bluetoothlegatt D/BluetoothGatt: setCharacteristicNotification() - uuid: 33b5376e-0942-1f91-379b-ac5af36b9efa enable: true
2020-04-08 15:03:33.704 4290-4315/com.example.android.bluetoothlegatt D/BluetoothLeService: broadcast Update
2020-04-08 15:03:33.728 4290-4290/com.example.android.bluetoothlegatt D/DeviceControlActivity: testWriteToCharacteristic
2020-04-08 15:03:33.728 4290-4290/com.example.android.bluetoothlegatt D/DeviceControlActivity: rename service found
2020-04-08 15:03:34.130 4290-4307/com.example.android.bluetoothlegatt D/BluetoothLeService: onCharacteristicWrite, Status: 130, 33b5376e-0942-1f91-379b-ac5af36b9efa

Считать значение всех характеристик не проблема.

Любые предложения о том, как решить эту проблему?

С наилучшими пожеланиями, Майкл

РЕДАКТИРОВАТЬ - РЕШЕНИЕ ПРОБЛЕМЫ:

Это был ReliableWrite, вызывающий проблему. Убрал его и теперь он работает. Спасибо, Эмиль, за подсказку!

1 Ответ

0 голосов
/ 09 апреля 2020

Чтобы использовать надежные записи, свойства c характеристики должны включать бит надежной записи. Ваши характеристики c нет, поэтому вместо этого просто используйте «нормальные» записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...