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
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 42: Linha 45:
 
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 Protocol Buffers:
  
 +
<!--
 
<syntaxhighlight lang=text>
 
<syntaxhighlight lang=text>
 
syntax = "proto2";
 
syntax = "proto2";
Linha 80: Linha 84:
 
}
 
}
 
</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''
 +
-->
  
 
+
Como será usado MQTT, o comportamento da aplicação pode explorar o seguinte:  
Essa MEF é particularmente adequada para a aplicação baseada no CoAP. No caso do MQTT, o comportamento da aplicação deve ser adaptado:  
+
* não são necessárias confirmações de mensagens de dados
* não é necessária a confirmação 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
 
* 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
  
== Versão CoAP ==
+
<!--
 
 
* [https://tools.ietf.org/html/rfc7252 RFC 7252]
 
* [https://realpython.com/instance-class-and-static-methods-demystified/ Dica: métodos de instância, classe e estáticos em Python]
 
* [https://www.python-course.eu/python3_properties.php Dica: propriedades em Python (alternativa a ''setters'' e ''getters'']
 
 
 
<!--* 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.
 
 
 
=== Servidor de coleta ===
 
 
 
O servidor de coleta está disponível neste link:
 
* [http://tele.sj.ifsc.edu.br/~msobral/ptc/coap_server.tgz Servidor de coleta (versão para CoAP)]
 
 
 
 
 
Para usá-lo siga este procedimento:
 
# Descompacte o arquivo ''coap_server.tgz''. Note que será criado o subdiretório ''coap_server''
 
# Entre no subdiretório ''coap_server'' e execute: <syntaxhighlight lang=bash>
 
python3 sensorapp.py
 
</syntaxhighlight>
 
# Faça requisições para o servidor usando a URI ''/ptc''.
 
#* Mensagens GET geram respostas contendo a listagem de placas de aquisição de dados conhecidas e respectivos sensores
 
#* 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.
 
#* 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.
 
 
 
== 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 ===
  
Linha 170: Linha 119:
 
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 das 19h37min de 29 de setembro 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:
    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:


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