вызов connectGatt() и createBond() вместе

Я пытаюсь создать связь между моим телефоном Android и моим устройством. Раньше они были соединены хорошо, позвонив device.connectGatt() с моим gattCallback. Но теперь, когда я хочу также добавить связь, вызвав device.createBond(), мой onConnectionStateChange показывает альтернативный шаблон подключения и отключения с кодом состояния 0 при подключении и 8 при отключении. Вот мой фрагмент кода того, как я пытаюсь использовать connectGatt и createBond вместе.

    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        System.out.println("on scan result");
        super.onScanResult(callbackType, result);
        BluetoothDevice device = result.getDevice();
        synchronized (this) {
            if (mBluetoothGatt == null) {
                if (device.createBond()) {
                    System.out.println("create bond success");
                    mBluetoothGatt = device.connectGatt(mListener.retrieveApplicationContext(), true, mGattCallback);
                }
                else System.out.println("create bond sb");
            }
        }
    }

Есть ли что-то неправильное в вызове этих двух методов таким образом? Я искал в Интернете информацию о создании облигаций, но ни одна из страниц не использует совместно createBond и connectGatt. В этом посте я получил только подсказку о том, как вызывать эти два метода следующим образом: Android BLE onCharacteristicChanged() с использованием уведомления не срабатывает

Кроме того, мой BroadCastReceiver всегда показывает привязку устройства, но никогда не показывает привязку устройства.


person Li Yinghao    schedule 24.12.2020    source источник


Ответы (1)


Метод createBond будет внутренне сначала подключаться к устройству, если он не подключен с помощью autoConnect, установленного в false. Это означает, что попытка соединения будет прервана через 30 секунд, если устройство не подключится в течение этого времени. Но вы подключаетесь, используя autoConnect, установленное в true, что означает отсутствие тайм-аута. Поэтому, если по какой-то причине для подключения требуется 31 секунда, соединение не произойдет.

Если бы я был на вашем месте, я бы сначала сам подключил устройство, а когда устройство успешно подключилось и службы были обнаружены (и проверили, есть ли у него нужные службы), позвонил createBond, чтобы убедиться, что все в порядке перед соединением.

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

person Emil    schedule 25.12.2020
comment
То есть вы говорите, что код состояния 8 может быть проблемой прошивки? Не могли бы вы указать более конкретные проблемы с прошивкой? Я пытался выяснить, была ли это ошибка стороны Android или стороны прошивки. - person Li Yinghao; 25.12.2020
comment
Например, если код прошивки дает сбой и устройство перезагружается. - person Emil; 25.12.2020
comment
На самом деле я пытался вызвать createBond() после того, как службы были найдены, но происходит то же самое: код состояния 0 подключен, а код состояния 8 отключен туда и обратно. Я почти уверен, что это не должно быть из-за сбоя кода прошивки или перезагрузки устройства, потому что после того, как я удалил метод createBond(), все работает так же хорошо. Существуют ли какие-либо другие возможные причины со стороны прошивки, которые вызывают этот код состояния 0 и 8 взад и вперед? - person Li Yinghao; 26.12.2020
comment
Это все равно, что спросить, почему веб-сервер перестает отвечать на запросы после того, как ему был отправлен определенный запрос. Используйте анализатор воздуха BLE или используйте отладчик, чтобы узнать, что происходит. - person Emil; 26.12.2020