Trabalho PrΓ‘tico 4
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
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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 β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Makefile β ConfiguraΓ§Γ£o de compilaΓ§Γ£o
project-conf.h β ConfiguraΓ§Γ£o centralizada do projeto
UNICAST β Define modo Unicast (1) ou Multicast (0)UIP_CONF_IPV6_RPL β Desativa RPL para comunicaΓ§Γ£o 1-saltoNETSTACK_CONF_RDC β Define camada RDC (Radio Duty Cycling)NETSTACK_CONF_MAC β Define camada MAC (CSMA)ENERGEST_CONF_ON β Ativa monitorizaΓ§Γ£o de energiaclean.sh β Script de limpeza
sensor-common.h β DefiniΓ§Γ΅es partilhadas
pacote_sensor_t com atributo packed (compatibilidade entre arquiteturas)sensor-temp.h / sensor-temp.c β Processo de leitura de temperatura
tmp102 (sensor integrado)sht11_sensor (sensor de humidade com temp)sensor-button.h / sensor-button.c β Processo de detecΓ§Γ£o de botΓ£o
udp-client.h / udp-client.c β Cliente UDP (Emissor)
udp-server.h / udp-server.c β Servidor UDP (Recetor)
| 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 |
| 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 |
# 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
Editar project-conf.h:
#define UNICAST 1 // Unicast (para servidor especΓfico)
#define UNICAST 0 // Multicast (broadcast para todos)
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)
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)