Чтение характеристики из rxBleDevice дает исключение в Android, в iOS, почему оно работает нормально, используя тот же UUID - PullRequest
0 голосов
/ 25 октября 2019

В настоящее время я работаю с приложением, которое включает чтение данных с устройства ble. Я пытаюсь прочитать данные термометра Andesfit, артериального давления Andesfit, шкалы веса тела Andesfit.

Для этого мне нужно уведомить, используя Характеристика UUID. Уведомление работает нормально, и я получаю данные должным образом, когда любое из устройств излучает данные.

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

Чтобы показать последнюю запись, мне нужно прочитать характеристику, используя UUID

В iOS я могу получить последнюю запись и уведомить, используя ту же характеристику UUID, и она работаетхорошо.

 characteristic UUID is 2A1C

 peripheral.setNotifyValue(true, for: characteristic)
 peripheral.readValue(for: characteristic)

Но в Android, если я пытаюсь читать, используя характеристику UUID, которая использовалась для уведомления, это дает мне исключение.

rxBleDevice.establishConnection(false, Timeout(12000, TimeUnit.MILLISECONDS))
                .flatMapSingle { rxBleConnection ->

                    rxBleConnection.readCharacteristic(UUID.fromString("00002a1c-0000-1000-8000-00805f9b34fb"))
                        .subscribe({bytes ->

                    },{t: Throwable? ->
                        var mess = t!!.localizedMessage
                        t.printStackTrace()
                    })

Сообщение об исключении:

Исключение GATT из MAC-адреса F4: 5E: AB: 0D: 7B: 93, с типом BleGattOperation {description = 'CHARACTERISTIC_READ'}

Вот моя операция обнаружения сервисов в Android

В моем сервисном обнаружении я ясно вижу, что этот характерный UUID предназначен только для уведомления.

V/RxBle#ServiceDiscoveryOperation: Primary Service - Health Thermometer (00001809-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation: Instance ID: 51
V/RxBle#ServiceDiscoveryOperation: -> Characteristics:
V/RxBle#ServiceDiscoveryOperation:  * Temperature Measurement (00002a1c-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:    Properties: [ INDICATE ]
V/RxBle#ServiceDiscoveryOperation:    -> Descriptors: 
V/RxBle#ServiceDiscoveryOperation:      * Client Characteristic Configuration (00002902-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:      * Characteristic Presentation Format (00002904-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:  * Temperature Type (00002a1d-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:    Properties: [ READ ]
V/RxBle#ServiceDiscoveryOperation:  * Intermediate Temperature (00002a1e-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:    Properties: [ NOTIFY ]
V/RxBle#ServiceDiscoveryOperation:    -> Descriptors: 
V/RxBle#ServiceDiscoveryOperation:      * Client Characteristic Configuration (00002902-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:  * Measurement Interval (00002a21-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:    Properties: [ READ WRITE INDICATE ]
V/RxBle#ServiceDiscoveryOperation:    -> Descriptors: 
V/RxBle#ServiceDiscoveryOperation:      * Client Characteristic Configuration (00002902-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:      * Valid Range (00002906-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation: Primary Service - Battery Service (0000180f-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation: Instance ID: 65
V/RxBle#ServiceDiscoveryOperation: -> Characteristics:
V/RxBle#ServiceDiscoveryOperation:  * Battery Level (00002a19-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:    Properties: [ READ NOTIFY ]
V/RxBle#ServiceDiscoveryOperation:    -> Descriptors: 
V/RxBle#ServiceDiscoveryOperation:      * Client Characteristic Configuration (00002902-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation:      * Report Reference (00002908-0000-1000-8000-00805f9b34fb)
V/RxBle#ServiceDiscoveryOperation: --------------- ====== Finished peripheral content ====== ---------------

1 Ответ

1 голос
/ 25 октября 2019

почему он работает нормально, используя один и тот же UUID (на iOS и Android это не так)?

Как видите, характеристика, которую вы хотите прочитать, имеет свойство [INDICATE], а не[ЧИТАТЬ]. ОС Android проверяет разрешения для характеристики перед выполнением над ней операции и не позволяет запустить ее, если целевая характеристика не имеет соответствующего свойства. iOS, с другой стороны, выполняет операцию, и периферийное устройство может (или не может) принимать ее независимо от этих характерных свойств.

...