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:
Header | Data |
---|---|
<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.
Valores | Protocolo 0 | Protocolo 1 | Protocolo 2 | Protocolo 3 |
---|---|---|---|---|
Headers | … | … | … | … |
<1 bytes> Data 1 | Batt level | Batt level | Batt level | Batt level |
<4 bytes> Data 2 | Timestamp | Timestamp | Timestamp | |
<1 bytes> Data 3 | Temp | Temp | ||
<4 bytes> Data 4 | Press | Press | ||
<1 bytes> Data 5 | Hum | Hum | ||
<4 bytes> Data 6 | Co | Co | ||
<4 bytes> Data 7 | RMS | |||
<4 bytes> Data 8 | Amp x | |||
<4 bytes> Data 9 | Frec x | |||
<4 bytes> Data 10 | Amp y | |||
<4 bytes> Data 11 | Frec y | |||
<4 bytes> Data 12 | Amp z | |||
<4 bytes> Data 13 | Frec 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.12Freqx
: Valores aleatorios entre 29.0 y 31.0Ampy
: Valores aleatorios entre 0.0041 y 0.11Freqy
: Valores aleatorios entre 59.0 y 61.0Ampz
: Valores aleatorios entre 0.008 y 0.15Freqz
: Valores aleatorios entre 89.0 y 91.0RMS
: 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 30Hum
: Valor aleatorio entre 30 y 80Pres
: Valor aleatorio entre 1000 y 1200CO
: 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
yMAC
).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 sutimestamp
.Configuración: Esta tabla contendrá las variables
ID_protocol
yTransport_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:
Una video demostracion el cual deben subir a Youtube entregando solo el link.
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
obleak
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.