Mudanças entre as edições de "PTC29008: Projeto 2: Sistema de aquisição de dados"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(20 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 2: Linha 2:
  
 
__toc__
 
__toc__
 +
 +
* [http://mqtt.org/ Site oficial do MQTT]
 +
* [https://mosquitto.org/ Mosquitto: um broker MQTT]
  
  
Linha 10: Linha 13:
  
  
Nesse sistema, a transmissão de mensagens de dados através dos links sem-fio faz uso do [https://coap.technology/ protocolo CoAP]. Esse protocolo foi desenhado para serviços web em dispositivos com restrições de recursos, tendo em mente aplicações da [https://en.wikipedia.org/wiki/Internet_of_things Internet das Coisas (IoT)]. As unidades de aquisição de dados se comportam como clientes CoAP, o servidor de coleta é um servidor CoAP.
+
Nesse sistema, a transmissão de mensagens de dados através dos links sem-fio faz uso do [https://mqtt.org/ protocolo MQTT]. Esse protocolo foi desenhado com um serviço do tipo publisher-subscriber voltado a dispositivos com restrições de recursos, tendo em mente aplicações da [https://en.wikipedia.org/wiki/Internet_of_things Internet das Coisas (IoT)]. Em linhas gerais, as unidades de aquisição de dados se comportam como publicadores MQTT, o servidor de coleta é um assinante.
  
  
 
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:
 
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:
# Especificar um protocolo de aplicação, que deve estar fundado no protocolo CoAP: esse protocolo de aplicação deve ser capaz de:
+
# Especificar um protocolo de aplicação, que deve estar fundado no protocolo MQTT: esse protocolo de aplicação deve ser capaz de:
 
## Configurar a unidade de aquisição de dados
 
## Configurar a unidade de aquisição de dados
 
## Transmitir mensagens contendo dados monitorados
 
## Transmitir mensagens contendo dados monitorados
# Implementar um cliente CoAP para o envio das mensagens de aquisição de dados
+
# Selecionar e usar uma implementação do MQTT, com a finalidade de enviar as mensagens de aquisição de dados
 
# Usar uma técnica de codificação de mensagens que possibilite o intercâmbio de dados entre sistemas heterogêneos
 
# 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 do protocolo de aplicação =
  
 
A especificação deve descrever:
 
A especificação deve descrever:
Linha 28: Linha 31:
 
# o comportamento do protocolo
 
# o comportamento do protocolo
  
= CoAP =
+
== Formato das mensagens da aplicação ==
 
 
* '''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:<syntaxhighlight lang=python>
 
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)
 
</syntaxhighlight>
 
 
 
 
 
O servidor CoAP de teste pode ser instalado assim:
 
 
 
# Instale o pacote Python [https://aiocoap.readthedocs.io/en/0.2-for-readthedocs/ aio-coap]: <syntaxhighlight lang=bash>
 
sudo pip3 install aiocoap
 
</syntaxhighlight>
 
# Copie [http://tele.sj.ifsc.edu.br/~msobral/ptc/coaps.tgz este script Python] que implementa o servidor de demonstração (descompacte-o).
 
# Execute o servidor com este comando: <syntaxhighlight lang=bash>
 
python3 coaps.py
 
</syntaxhighlight>... 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:
 
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: <syntaxhighlight lang=text>
+
* '''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
+
*# Placa se anuncia ao servidor:  
Lista de nomes de sensores: LISTA DE STRING
+
*#* mensagem de configuração é publicada em um subtópico que identifica a placa.
</syntaxhighlight>
+
*#* mensagem de configuração contém a lista de sensores da placa. Cada sensor possui estes atributos: status (se está ativado), tipo (ex: temperatura, pressão, ...), peeríodos de amostragem e de envio, limiares inferior e superior para alertas.
* '''Dados''': contêm os valores amostrados dos sensores, e têm este formato: <syntaxhighlight lang=text>
+
*# servidor configura a placa:
Lista de amostras dos sensores: LISTA DE <STRING,INTEIRO,TIMESTAMP>
+
*#* mensagem de configuração enviada para o subtópico da placa
</syntaxhighlight>
+
*#* mensagem contém os atributos de cada sensor, conforme configuração definida pelo servidor
 +
* '''Dados''': contêm os valores amostrados dos sensores, e têm este formato:  
 +
** Para cada sensor, há uma lista de valores lidos, companhados dos respectivos timestamps
  
  
A especificação e codificação das mensagens deve ser feita usando Protocol Buffers:
+
A especificação e codificação das mensagens deve ser feita usando [[PTC29008:_Projeto_2:_Codificação_de_Mensagens#Protocol_Buffers|Protocol Buffers]]:
  
 +
<!--
 
<syntaxhighlight lang=text>
 
<syntaxhighlight lang=text>
 
syntax = "proto2";
 
syntax = "proto2";
Linha 114: Linha 86:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
  
 +
As trocas de mensagens entre unidade de sensores e servidor de coleta é feita sempre por iniciativa da unidade de sensores, de acordo com uma MEF.
  
As trocas de mensagens entre unidade de sensores e servidor de coleta é feita sempre por iniciativa da unidade de sensores, de acordo com esta MEF:
+
<!--
 
 
 
[[imagem:PTC-Proj2-proto.jpg]]
 
[[imagem:PTC-Proj2-proto.jpg]]
 
<br>''O comportamento do protocolo de aquisição de dados no lado da unidade de sensores''
 
<br>''O comportamento do protocolo de aquisição de dados no lado da unidade de sensores''
 +
-->
  
= Servidor de coleta =
+
Como será usado MQTT, o comportamento da aplicação pode explorar o seguinte:
 +
* não são necessárias confirmações de mensagens de dados
 +
* a identificação da unidade de sensores pode ser feita por um tópico. Isso evita que mensagens da unidade de coleta sejam transmitidas para todas unidades de sensores desnecessariamente
 +
* o serviço de configuração seja identificado por um tópico específico
 +
 
 +
<!--
 +
=== Servidor de coleta ===
  
 
O servidor de coleta está disponível neste link:
 
O servidor de coleta está disponível neste link:
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/coap_server.tgz Servidor de coleta]
+
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/mqtt_server.tgz Servidor de coleta (versão para MQTT)]
  
  
 
Para usá-lo siga este procedimento:
 
Para usá-lo siga este procedimento:
# Descompacte o arquivo ''coap_server.tgz''. Note que será criado o subdiretório ''coap_server''
+
# Descompacte o arquivo ''mqtt_server.tgz''. Note que será criado o subdiretório ''mqtt_server''
# Entre no subdiretório ''coap_server'' e execute: <syntaxhighlight lang=bash>
+
# Entre no subdiretório ''mqtt_server'' e execute: <syntaxhighlight lang=bash>
 
python3 sensorapp.py
 
python3 sensorapp.py
 
</syntaxhighlight>
 
</syntaxhighlight>
# Faça requisições para o servidor
+
# Faça requisições para o servidor:
 +
#* Publicações para tópico ''ptc/sistema'': o servidor em resposta publica no tópico ''ptc/sistema/placa' uma mensagem contendo a listagem de placas de aquisição de dados conhecidas e respectivos sensores. '''OBS:'''  ''placa'' é o nome da unidade de sensores, informado no payload da mensagem recebida.
 +
#* Publicações para tópico ''ptc/config'': o conteúdo da mensagem publicada deve ser do tipo Config, e deve ser usada para registrar a unidade de sensores no servidor. O servidor em resposta publica no tópico ''ptc/config/placa'' uma mensagem também do tipo ''Config'', a qual contém o valor de período de amostragem a ser usado pela placa. '''OBS:'''  ''placa'' é o nome da unidade de sensores, informado em sua mensagem Config.
 +
#* Publicações para tópico ''ptc/dados'': o conteúdo da mensagem publicada deve ser do tipo ''Dados''. Tais publicações são usadas para enviar os valores amostrados dos sensores. O servidor de coleta recusa mensagens ''Dados'' de placas não registradas. Valores de sensores desconhecidos são ignorados.
 +
 
 +
= Entrega e apresentação do projeto =
 +
 
 +
O projeto deve ser apresentado ao professor em data e horário a combinar. A entrega deve ser feita pelo Moodle até dia '''20/11''':
 +
* [https://moodle.sj.ifsc.edu.br/mod/assign/view.php?id=4620 Entrega do projeto]
 +
-->

Edição atual tal como às 18h59min de 1 de outubro de 2020

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 MQTT. Esse protocolo foi desenhado com um serviço do tipo publisher-subscriber voltado a dispositivos com restrições de recursos, tendo em mente aplicações da Internet das Coisas (IoT). Em linhas gerais, as unidades de aquisição de dados se comportam como publicadores MQTT, o servidor de coleta é um assinante.


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 MQTT: 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. Selecionar e usar uma implementação do MQTT, com a finalidade de enviar as 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

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:
    1. Placa se anuncia ao servidor:
      • mensagem de configuração é publicada em um subtópico que identifica a placa.
      • mensagem de configuração contém a lista de sensores da placa. Cada sensor possui estes atributos: status (se está ativado), tipo (ex: temperatura, pressão, ...), peeríodos de amostragem e de envio, limiares inferior e superior para alertas.
    2. servidor configura a placa:
      • mensagem de configuração enviada para o subtópico da placa
      • mensagem contém os atributos de cada sensor, conforme configuração definida pelo servidor
  • Dados: contêm os valores amostrados dos sensores, e têm este formato:
    • Para cada sensor, há uma lista de valores lidos, companhados dos respectivos timestamps


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


As trocas de mensagens entre unidade de sensores e servidor de coleta é feita sempre por iniciativa da unidade de sensores, de acordo com uma MEF.


Como será usado MQTT, o comportamento da aplicação pode explorar o seguinte:

  • não são necessárias confirmações de mensagens de dados
  • a identificação da unidade de sensores pode ser feita por um tópico. Isso evita que mensagens da unidade de coleta sejam transmitidas para todas unidades de sensores desnecessariamente
  • o serviço de configuração seja identificado por um tópico específico