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
 
(17 revisões intermediárias pelo mesmo usuário 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
  
Linha 31: Linha 34:
  
 
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 80: 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''
 
== Versão 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:<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:
+
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
# Instale o pacote Python [https://aiocoap.readthedocs.io/en/0.2-for-readthedocs/ aio-coap]: <syntaxhighlight lang=bash>
+
* 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
sudo pip3 install aiocoap
+
* o serviço de configuração seja identificado por um tópico específico
</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).
 
 
 
== Versão MQTT ==
 
 
 
* [http://mqtt.org/ Site oficial do MQTT]
 
* [https://mosquitto.org/ Mosquitto: um broker MQTT]
 
 
 
O cliente MQTT deve conseguir conversar com o broker MQTT do IFSC-SJ. Ele deve conseguir publicar e receber mensagens do broker.
 
* '''Endereço do broker:''' mqtt.sj.ifsc.edu.br
 
  
 
+
<!--
= Servidor de coleta =
+
=== 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 usando a URI ''/ptc''.
+
# Faça requisições para o servidor:
#* Mensagens GET geram respostas contendo a listagem de placas de aquisição de dados conhecidas e respectivos sensores
+
#* 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.
#* Mensagens POST do tipo ''Config'' podem ser usadas para a placa se registrar no servidor. A resposta a esse tipo de mensagem é um payload também do tipo ''Config'' com o valor de período de anostragem a ser usado pela placa.
+
#* 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.
#* Mensagens POST do tipo ''Dados'' 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.
+
#* 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 =
 
= Entrega e apresentação do projeto =
Linha 150: Linha 121:
 
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''':
 
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]
 
* [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