Frozen-Burrito / hydrate-extension-inteligente

Repositorio para el software de aplicación para la extensión inteligente de botellas de agua Hydrate.
2 stars 0 forks source link

[BUG] El driver de BLE no crea los servicios GATT #3

Closed Frozen-Burrito closed 2 years ago

Frozen-Burrito commented 2 years ago

Descripción del Error El driver BLE es inicializado con éxito y puede entrar en estado de ADVERTISING, pero al ser emparejado con un dispositivo periférico, se puede observar que el driver BLE solo creó los servicios por default de un servidor GATT (Generic Attribute y Generic Access). Los servicios Hydrate y Batería no son inicializados ni usados en el perfil GATT.

Cómo Reproducir Pasos para reproducir el error:

  1. Programar el chip ESP32 con la versión 1.0.0+2 actual.
  2. Monitorear el chip a través de consola.
  3. Emparejar la extensión de botellas con un dispositivo periférico.
  4. Usar software con capacidad de analizar servidores GATT desde el dispositivo periférico para observar que los servicios esperados no son accesibles.

Comportamiento Esperado Cuando la extensión para botellas es emparejada con un dispositivo periférico (un dispositivo móvil, en este caso) debería hacer accesibles los servicios GATT Hydrate y Batería, con sus UUID correspondientes, para que la app de Hydrate pueda obtener los registros de hidratación.

Screenshots Los servicios descubiertos en el dispositivo embebido desde la app nRF Connect:

Screenshot_20220915-065955_nRF Connect

Entorno

Contexto Adicional Los logs producidos por el dispositivo a través de idf.py -p <PORT> monitor al inicializar el dispositivo pueden ser observados a continuación:

I (29) boot: ESP-IDF v4.4.1 2nd stage bootloader
I (29) boot: compile time 14:02:38
I (29) boot: chip revision: 3
I (32) boot_comm: chip revision: 3, min. bootloader chip revision: 0
I (39) boot.esp32: SPI Speed      : 40MHz
I (44) boot.esp32: SPI Mode       : DIO
I (48) boot.esp32: SPI Flash Size : 2MB
I (53) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (62) boot: ## Label            Usage          Type ST Offset   Length
I (69) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (76) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (84) boot:  2 factory          factory app      00 00 00010000 00100000
I (91) boot: End of partition table
I (96) boot_comm: chip revision: 3, min. application chip revision: 0
I (103) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=1d9e8h (121320) map
I (155) esp_image: segment 1: paddr=0002da10 vaddr=3ffbdb60 size=02608h (  9736) load
I (159) esp_image: segment 2: paddr=00030020 vaddr=400d0020 size=7aaech (502508) map
I (343) esp_image: segment 3: paddr=000aab14 vaddr=3ffc0168 size=020e0h (  8416) load
I (346) esp_image: segment 4: paddr=000acbfc vaddr=40080000 size=171d4h ( 94676) load
I (387) esp_image: segment 5: paddr=000c3dd8 vaddr=50000000 size=00010h (    16) load
I (399) boot: Loaded app from partition at offset 0x10000
I (399) boot: Disabling RNG early entropy source...
I (411) cpu_start: Pro cpu up.
I (411) cpu_start: Starting app cpu, entry point is 0x400811e4
0x400811e4: call_start_cpu1 at C:/Espressif/frameworks/esp-idf-v4.4.1-2/components/esp_system/port/cpu_start.c:160

I (0) cpu_start: App cpu up.
I (427) cpu_start: Pro cpu start user code
I (427) cpu_start: cpu freq: 160000000
I (427) cpu_start: Application information:
I (432) cpu_start: Project name:     nvs-test
I (437) cpu_start: App version:      1
I (441) cpu_start: Compile time:     Sep  9 2022 14:01:36
I (447) cpu_start: ELF file SHA256:  a189ec326b5c14a4...
I (453) cpu_start: ESP-IDF:          v4.4.1
I (459) heap_init: Initializing. RAM available for dynamic allocation:
I (466) heap_init: At 3FFAFF10 len 000000F0 (0 KiB): DRAM
I (472) heap_init: At 3FFB6388 len 00001C78 (7 KiB): DRAM
I (478) heap_init: At 3FFB9A20 len 00004108 (16 KiB): DRAM
I (484) heap_init: At 3FFC6B38 len 000194C8 (101 KiB): DRAM
I (490) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (496) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (503) heap_init: At 400971D4 len 00008E2C (35 KiB): IRAM
I (510) spi_flash: detected chip: generic
I (514) spi_flash: flash io: dio
W (518) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (532) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (582) MAIN: Size minimo de heap libre: 227012 bytes
I (3582) BTDM_INIT: BT controller compile version [5688ed5]
I (3582) system_api: Base MAC address is not set
I (3582) system_api: read default base MAC address from EFUSE
I (3582) MAIN: NVS inicializado
I (3592) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
I (3582) BLE: Estado de BLE: Initializing
I (3702) MAIN: Nuevo registro de hidratacion generado: { water: 74, temp: -2, bat: 16, time: 3}
I (3702) MAIN: Nuevo registro de hidratacion enviado para almacenamiento, total 1
I (3702) BLE: Estado de BLE: Initializing
I (4032) BLE: Tabla de atributos creada, handle = 23
I (4032) BLE: Servicios inicializados con exito
E (4032) BT_APPL: service not created

I (4032) BLE: SERVICE_START_EVT, status 0, service_handle = 40
I (4052) BLE: Advertising comenzado
I (4212) BLE: Estado de BLE: Advertising
(...)

Notar el mensaje de error E (4032) BT_APPL: service not created, parece un indicador del problema.

Frozen-Burrito commented 2 years ago

Efectivamente, el mensaje de error E (4032) BT_APPL: service not created era un indicador del problema. Los servicios no estaban siendo creados correctamente, ya que detecté errores en la tabla de atributos GATT y en la configuración de ciertas características.

Estos problemas han sido solucionados, asignando la longitud adecuada a cada UUID (en especial a aquellos de 32 y 128 bits) y separando los dos servicios (hidratación y batería) en dos tablas de atributos GATT correspondientes. Confirmé que los servicios son accesibles a través de la misma app.