Mudanças entre as edições de "PTC29008: Projeto 2: Sistema de aquisição de dados"
(12 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:// | + | 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 | + | # 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 | ||
− | # | + | # 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: | + | * '''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: |
− | + | *# 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. | |
− | * '''Dados''': contêm os valores amostrados dos sensores, e têm este formato: | + | *# 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: | + | 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. | ||
− | + | <!-- | |
− | |||
[[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: | |
− | + | * não são necessárias confirmações de mensagens de dados | |
− | * não | ||
* 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 | ||
− | == | + | <!-- |
− | + | === Servidor de coleta === | |
− | |||
− | + | O servidor de coleta está disponível neste link: | |
− | + | * [http://tele.sj.ifsc.edu.br/~msobral/ptc/mqtt_server.tgz Servidor de coleta (versão para MQTT)] | |
− | |||
− | |||
− | # | + | Para usá-lo siga este procedimento: |
− | + | # Descompacte o arquivo ''mqtt_server.tgz''. Note que será criado o subdiretório ''mqtt_server'' | |
− | + | # Entre no subdiretório ''mqtt_server'' e execute: <syntaxhighlight lang=bash> | |
− | + | python3 sensorapp.py | |
− | # | ||
− | |||
− | |||
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | # 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 = | = Entrega e apresentação do projeto = | ||
Linha 137: | 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
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.
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:
- 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
- Transmitir mensagens contendo dados monitorados
- 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
A especificação do protocolo de aplicação
A especificação deve descrever:
- o serviço oferecido
- as mensagens do protocolo
- o formato dessas mensagens
- 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:
- 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.
- 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
- Placa se anuncia ao 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