PTC29008: Projeto 2: Sistema de aquisição de dados

De MediaWiki do Campus São José
Revisão de 10h09min de 11 de junho de 2019 por 127.0.0.1 (discussão) (→‎CoAP)
Ir para navegação Ir para pesquisar

Próxima aula


No projeto 2 será desenvolvido um protótipo de um sistema de aquisição de dados. Cada unidade de aquisição de dados, representada por um kit baseado em RaspberryPi 3, é responsável por coletar dados de monitoramento e enviá-los para um servidor de coleta. A comunicação entre as unidades e o servidor se dá por links sem-fio ponto-a-ponto, implantados com o protocolo do projeto 1. A figura a seguir ilustra um cenário desse sistema de aquisição de dados remotos.

PTC-Proj2-aquisicao-dados.jpg
O sistema de aquisição de dados remotos


Nesse sistema, a transmissão de mensagens de dados através dos links sem-fio faz uso do protocolo CoAP. Esse protocolo foi desenhado para serviços web em dispositivos com restrições de recursos, tendo em mente aplicações da Internet das Coisas (IoT). As unidades de aquisição de dados se comportam como clientes CoAP, o servidor de coleta é um servidor CoAP.


O projeto tem por objetivo geral implementar a unidade de aquisição de dados, a qual monitora dados ambientais e os envia para o servidor de coleta. Os objetivos específicos são:

  1. Especificar um protocolo de aplicação, que deve estar fundado no protocolo CoAP: esse protocolo de aplicação deve ser capaz de:
    1. Configurar a unidade de aquisição de dados
    2. Transmitir mensagens contendo dados monitorados
  2. Implementar um cliente CoAP para o envio das mensagens de aquisição de dados
  3. Usar uma técnica de codificação de mensagens que possibilite o intercâmbio de dados entre sistemas heterogêneos

A especificação do protocolo de aplicação

A especificação deve descrever:

  1. o serviço oferecido
  2. as mensagens do protocolo
  3. o formato dessas mensagens
  4. o comportamento do protocolo

CoAP

  • Port UDP: 5683
  • Endereço IPv6 (micro do professor): 2804:1454:1004:312:206:4fff:fe49:b7e4


  • Exemplo de criação de socket UDP IPv6:
    import socket
    
    # define endereço e port do destino
    destino = ('2804:1454:1004:312:206:4fff:fe49:b7e4', 5683)
    
    # cria socket UDP sobre IPv6
    sock = socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    
    # Vincula o socket ao endereço IPv6 este host, e a um port 
    # escolhido pelo sistema operacional
    s.bind(('::', 0))
    
    # envio mensagem pro destino
    s.sendto(b'xyzabc123', destino)
    


O servidor CoAP de teste pode ser instalado assim:

  1. Instale o pacote Python aio-coap:
    sudo pip3 install aiocoap
    
  2. Copie este script Python que implementa o servidor de demonstração (descompacte-o).
  3. Execute o servidor com este comando:
    python3 coaps.py
    
    ... e ele iniciará escutando no port UDP 5683 (e com IPv6).

Formato das mensagens da aplicação

As mensagens da aplicação são de dois tipos:

  • Configuração: trocadas no início da sessão, servem para identificar os sensores e o período de amostragem e transmissão de dados. Seu conteúdo é formado pelo seguinte:
    periodo: INTEIRO
    Lista de nomes de sensores: LISTA DE STRING
    
  • Dados: contêm os valores amostrados dos sensores, e têm este formato:
    Lista de amostras dos sensores: LISTA DE <STRING,INTEIRO,TIMESTAMP>
    


A especificação e codificação das mensagens deve ser feita usando Protocol Buffers:

syntax = "proto2";
 
package sensor;
 
message Sensor {
  // nome do sensor
  required string nome = 1;

  // valor amostrado do sensor
  required int32 valor = 2; 

  // timestamp da amostragem, em milissegundos desde 1/1/2019 0:0:0
  optional int32 timestamp = 3;
}

message Config {
  // periodo dado em milissegundos
  required int32 periodo = 1;

  // lista de nomes de sensores
  repeated string sensores = 2;  
}

message Dados {
  // lista de sensores com seus valores amostrados e timestamp
  repeated Sensor amostras = 1;
}