Tarea 2

Universidad de Chile Facultad de Ciencias Físicas y Matemáticas Departamento de Ciencias de la computacion CC5326 – Diseño de Internet de las Cosas


Profesor: Luciano Radrigan F. Auxiliar: Alberto Abarzua P.

Objetivos a cumplir:

  • Programar el cliente BLE en la Raspberry Pi.
  • Programar el servidor BLE en el ESP32.
  • Enviar un paquete desde el ESP32 con datos generados en el mismo dispositivo, el cual será recibido por la Raspberry Pi.
  • Almacenar la información en una base de datos PostgreSQL utilizando Docker (Usar lo mismo de la Tarea 1).
  • Posibilitar el cambio del protocolo de envío de datos desde la base de datos, para esta tarea no es necesario que implementen el protocolo 4 de la T1 (Se mantiene todo el resto por lo que pueden reutilizar su codigo).
  • Permitir el cambio del tipo de conexión (BLE Continuo / Discontinuo) desde la base de datos.
  • Los cambios en la base de datos deberán reflejarse en el ESP32 (por ejemplo, si se cambia el protocolo de envío, el ESP32 deberá enviar los datos con el nuevo protocolo).
  • Deberá ser posible trabajar con ambos ESP32 al mismo tiempo; es decir, se debe poder recibir datos de ambos ESP32 de forma simultánea y almacenarlos en la base de datos.

Modos de conexión (Transport Layer)

En este caso al trabajar con Bluetooth Low Energy (BLE) se tendra que trabajar con dos modos de conexión, los cuales son:

  • Modo Continuo: En este modo se realiza la conexión entre ESP32 y Raspberry y envía los datos de forma continua.

  • Modo Discontinuo: En este modo se realiza la conexión entre los dispositivos, se envia un paquete de datos para entrar en un intervalo de espera donde la ESP debe estar en modo Deep Sleep y luego de un tiempo se vuelve a enviar un paquete de datos.

Encabezados de los paquetes

Cada paquete deberá contar con su propio encabezado, que incluirá la siguiente información. Este será común para todos los protocolos de envío:

HeaderData
<2 bytes>ID (ID unico del mensaje)
<6 bytes>Device MAC
<1 bytes>Transport Layer (TCP o UDP)
<1 bytes>ID Protocol
<2 bytes>Length (Headers + Body)

Protocolos de envío

Los protocolos de envío determinan la forma y el contenido que deben seguir los paquetes enviados por los ESP32. Estos paquetes se enviarán a través de TCP o UDP, dependiendo de la configuración asignada a la ESP32, la cual se encuentra en la base de datos.

ValoresProtocolo 0Protocolo 1Protocolo 2Protocolo 3
Headers
<1 bytes> Data 1Batt levelBatt levelBatt levelBatt level
<4 bytes> Data 2TimestampTimestampTimestamp
<1 bytes> Data 3TempTemp
<4 bytes> Data 4PressPress
<1 bytes> Data 5HumHum
<4 bytes> Data 6CoCo
<4 bytes> Data 7RMS
<4 bytes> Data 8Amp x
<4 bytes> Data 9Frec x
<4 bytes> Data 10Amp y
<4 bytes> Data 11Frec y
<4 bytes> Data 12Amp z
<4 bytes> Data 13Frec z

En resumen, cada protocolo de envío tiene la estructura Headers + Body. El “Body” contiene los datos que se enviarán, los cuales están especificados en las tablas anteriores. Este “Body” depende del protocolo de envío que se haya configurado en la base de datos.

Generacion de datos

Acceloremeter_kpi: Representa un sensor de vibraciones que mide en los tres ejes y calcula su promedio mediante la fórmula de la raíz cuadrada de la media (RMS). Los valores son float y se generan con las siguientes fórmulas:

  • Ampx: Valores aleatorios entre 0.0059 y 0.12
  • Freqx: Valores aleatorios entre 29.0 y 31.0
  • Ampy: Valores aleatorios entre 0.0041 y 0.11
  • Freqy: Valores aleatorios entre 59.0 y 61.0
  • Ampz: Valores aleatorios entre 0.008 y 0.15
  • Freqz: Valores aleatorios entre 89.0 y 91.0
  • RMS: sqrt{(Ampx^2 + Ampy^2 + Ampz^2)}

THPC_Sensor (Temperatura-Humedad-Presión-CO): Representa un sensor de cada uno de estos aspectos. Los valores son enteros, excepto para CO que es float.

  • Temp: Valor aleatorio entre 5 y 30
  • Hum: Valor aleatorio entre 30 y 80
  • Pres: Valor aleatorio entre 1000 y 1200
  • CO: Valor aleatorio entre 30 y 200

Batt_Sensor: Representa el nivel de batería del aparato. El valor es un u_int8 aleatorio entre 1 y 100.

Base de Datos

La base de datos debe contener las siguientes tablas:

  • Datos: Esta tabla almacenará todos los datos recibidos, incluyendo un sello de tiempo (timestamp) y el identificador del dispositivo (Id_device y MAC).

  • Logs: Esta tabla registrará la información de cada conexión recibida por el servidor, incluyendo el ID_device, el tipo de capa de transporte (Transport_Layer), el protocolo utilizado y su timestamp.

  • Configuración: Esta tabla contendrá las variables ID_protocol y Transport_Layer, que se utilizarán para configurar el envío de datos al iniciar la conexión del ESP32. Estas variables deben poder modificarse de alguna manera.

  • Loss: Esta tabla almacenará el tiempo de demora en la comunicación (tiempo desde el momento de envío hasta el momento de escritura en la base de datos, calculado usando la diferencia entre esos timestamps) y la cantidad de pérdida de paquetes (packet loss) en bytes para cada comunicación que haya ocurrido.

Para la creación del servicio de base de datos, se proporcionará un servicio de Docker, el cual debe iniciarse con el siguiente comando en el directorio base del proyecto:

docker-compose up -d

Como configurar el adaptador Bluetooth

Para poder utilizar el adaptador Bluetooth que se les entrego primero deberan configurarlo, para esto deberan seguir los siguientes pasos:

  • Primero deben desactivar el Bluetooth que viene por defecto en la Raspberry Pi, para esto deberan abrir y editar el archivo /boot/config.txt:

    sudo nano /boot/config.txt
    
  • Luego deberan agregar la siguiente linea al final del archivo:

    dtoverlay=disable-bt
    
  • Luego deberan reiniciar la Raspberry Pi:

    sudo reboot
    

Entrega

Para la fecha de entrega deberan subir a U-cursos:

  1. Una video demostracion el cual deben subir a Youtube entregando solo el link.

  2. Subir el código a U-cursos. Si es posible, incluya un enlace a un repositorio de Git donde se trabajó en la tarea.

Recomendaciones

  • El funcionamiento de BLE es muy diferente a los sockets que conocemos, por lo que se recomienda partir con anticipación y leer la documentación oficial de ESP32 y Raspberry Pi.

  • En el apunte de la asignatura se encuentra un ejemplo de cómo utilizar BLE en la Raspberry Pi.

  • Se recomienda utilizar la libreria pygatt o bleak en python para la comunicación BLE en la Raspberry Pi.

  • Su primer y mas importante objetivo debera ser lograr la comunicación entre los dispositivos, luego de esto podrá comenzar a trabajar en el resto de los objetivos.

  • Es muy imporante que la fuente de la verdad sea la base de datos, esto quiere decir que si se cambia el protocolo de envío en la base de datos, el ESP32 debe enviar los datos con el nuevo protocolo.

  • Puede serle util trabajar sobre el codigo de la Tarea 1, ya que para la siguiente tarea deberan integrar todo lo que han hecho hasta ahora.