EMECA - Sistemas DistribuΓ­dos

Trabalho PrΓ‘tico 4

πŸ“– DescriΓ§Γ£o Geral

Este projeto demonstra a implementaΓ§Γ£o de um sistema de comunicaΓ§Γ£o de sensores baseado em Contiki OS v3.x, com foco em processamento modular, comunicaΓ§Γ£o via UDP (Unicast/Multicast) e adaptaΓ§Γ£o a mΓΊltiplas plataformas de hardware (Motes Z1 e SKY).

A arquitetura separa claramente as responsabilidades: sensores modulares independentes recolhem dados, um cliente UDP os recolhe e envia, e um servidor UDP os recebe e apresenta no terminal. Cada componente pode ser compilado para diferentes plataformas com ajustes automΓ‘ticos via prΓ©-processador.

Contiki OS v3.x C Embedded Systems WSN

🎯 Objetivos de Aprendizagem

πŸ›οΈ Arquitetura do Sistema

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 CLIENTE (Mote)                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                 UDP Client Process                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Recolhe eventos dos sensores modulares           β”‚   β”‚
β”‚  β”‚ Envia pacotes UDP para Servidor                  β”‚   β”‚
β”‚  β”‚ Monitora consumo energΓ©tico                      β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚            ↓              ↓              ↓               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚Temp Process β”‚ β”‚Button Processβ”‚ β”‚   Energest  β”‚      β”‚
β”‚  β”‚ (PeriΓ³dico) β”‚ β”‚ (Evento)     β”‚ β”‚   (Leitura) β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚         ↓              ↓                                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚
β”‚  β”‚      Hardware Sensors (Z1/SKY)      β”‚               β”‚
β”‚  β”‚ tmp102/sht11 (Temp) | Button        β”‚               β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
               UDP (Unicast/Multicast)
               Port 1234
                    ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 SERVIDOR (Mote)                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                 UDP Server Process                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Recebe pacotes UDP                               β”‚   β”‚
β”‚  β”‚ Formata dados por tipo de sensor                 β”‚   β”‚
β”‚  β”‚ Imprime no terminal                              β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    

πŸ“ Estrutura de Ficheiros

1️⃣ ConfiguraΓ§Γ£o e Build

Makefile β€” ConfiguraΓ§Γ£o de compilaΓ§Γ£o

Ver Makefile

project-conf.h β€” ConfiguraΓ§Γ£o centralizada do projeto

Ver project-conf.h

clean.sh β€” Script de limpeza

Ver clean.sh

2️⃣ MΓ³dulos de Sensores

sensor-common.h β€” DefiniΓ§Γ΅es partilhadas

Ver sensor-common.h

sensor-temp.h / sensor-temp.c β€” Processo de leitura de temperatura

Ver sensor-temp.h Ver sensor-temp.c

sensor-button.h / sensor-button.c β€” Processo de detecΓ§Γ£o de botΓ£o

Ver sensor-button.h Ver sensor-button.c

3️⃣ ComunicaΓ§Γ£o UDP

udp-client.h / udp-client.c β€” Cliente UDP (Emissor)

Ver udp-client.h Ver udp-client.c

udp-server.h / udp-server.c β€” Servidor UDP (Recetor)

Ver udp-server.h Ver udp-server.c

πŸ”„ Fluxo de ExecuΓ§Γ£o

Passo Processo AΓ§Γ£o Tempo
1 udp-client Inicia e regista ligaΓ§Γ£o UDP 0s
2 udp-client Aguarda 30s para estabilizaΓ§Γ£o de rede 0-30s
3 udp-client Ativa sensor de temperatura (periodic: 10s) 30s
4 udp-client Ativa sensor de botΓ£o (Z1 apenas) 30s
5 sensor-temp LΓͺ temperatura e envia evento 30s, 40s, 50s...
6 sensor-button Aguarda pressΓ£o e envia evento (Γ  pressΓ£o) Evento
7 udp-client Recebe evento e envia via UDP Reativo
8 udp-server Recebe e imprime pacote Reativo
9 udp-client Imprime mΓ©tricas de energia (Energest) A cada envio

πŸ’‘ Conceitos-Chave de Contiki OS

Conceito Uso no Projeto Ficheiro
Processos PROCESS, PROCESS_THREAD, AUTOSTART_PROCESSES sensor-*.c, udp-*.c
Eventos process_alloc_event(), process_post(), PROCESS_WAIT_EVENT_UNTIL sensor-*.c, udp-client.c
Timers etimer_set(), etimer_expired(), etimer_reset() sensor-temp.c
Sensores SENSORS_ACTIVATE, sensor.value() sensor-temp.c, sensor-button.c
Network Stack simple_udp_register(), simple_udp_sendto() udp-client.c, udp-server.c
IPv6 uip_ip6addr(), uip_ds6_nbr_add(), PROCESS_BROADCAST udp-client.c
Energia energest_type_time(), energest_flush() udp-client.c, project-conf.h
CompilaΓ§Γ£o Condicional #if CONTIKI_TARGET_Z1, #if UNICAST, etc. Todos os ficheiros

πŸ› οΈ CompilaΓ§Γ£o e ExecuΓ§Γ£o

Compilar para diferentes plataformas:

# Cliente UDP para Z1
$ make TARGET=z1 udp-client

# Cliente UDP para SKY
$ make TARGET=sky udp-client

# Servidor UDP para Z1
$ make TARGET=z1 udp-server

# Limpeza de build
$ bash clean.sh
    

Modificar modo de comunicaΓ§Γ£o:

Editar project-conf.h:

#define UNICAST 1  // Unicast (para servidor especΓ­fico)
#define UNICAST 0  // Multicast (broadcast para todos)
    

πŸ“Š Estrutura de Dados

Pacote de Sensor (pacote_sensor_t):

typedef struct {
  uint16_t seq;        // NΓΊmero de sequΓͺncia
  uint8_t id;          // Identificador do sensor (ID_Z1_TEMP, etc)
  uint32_t timestamp;  // Segundos desde boot
  int16_t value;       // Valor do sensor (temperatura em 1/10 ΒΊC, botΓ£o em pulsos)
} __attribute__((packed)) pacote_sensor_t;

// Tamanho: 8 bytes (alinhado para compatibilidade entre arquiteturas)
    

Identificadores de Sensores:

ID_Z1_TEMP    = 1   // Temperatura (Z1, sensor tmp102)
ID_SKY_TEMP   = 2   // Temperatura (SKY, sensor sht11)
ID_Z1_BUTTON  = 3   // BotΓ£o (Z1)
ID_SKY_BUTTON = 4   // BotΓ£o (SKY, se disponΓ­vel)
    

πŸ”— Todos os Ficheiros do Projeto

πŸ“„ Makefile βš™οΈ project-conf.h 🧹 clean.sh πŸ“š sensor-common.h 🌑️ sensor-temp.h 🌑️ sensor-temp.c πŸ”˜ sensor-button.h πŸ”˜ sensor-button.c πŸ“‘ udp-client.h πŸ“‘ udp-client.c πŸ–₯️ udp-server.h πŸ–₯️ udp-server.c

πŸ“š AplicaΓ§Γ΅es e ExtensΓ΅es PossΓ­veis