Click here to load reader
Upload
davi-gameiro-salgado
View
275
Download
22
Embed Size (px)
Citation preview
Plataformas para aInternet das Coisas
Paulo F. Pires1, Flavia C. Delicato1, Thais Batista2, Thomaz Barros1, Everton Cavalcante1,3, Marcelo Pitanga1
1DCC/PPGI, Universidade Federal do Rio de Janeiro, Rio de Janeiro, Brasil2DIMAp, Universidade Federal do Rio Grande do Norte, Natal, Brasil
3IRISA-UMR CNRS/Université de Bretagne-Sud, Vannes, França
Plataformas de middleware para IoT
3
Carriots• Plataforma que utiliza serviços de nuvem para gerenciar dados providos
por dispositivos
• Platform as a Service (Paas) desenvolvida para conexão de dispositivos (M2M) no contexto de IoT
• Coleta e armazena qualquer tipo de dado de quaisquer dispositivo
• Permite a construção de aplicações
• Capacidade de suportar milhares de dispositivos conectados à uma mesma aplicação
Sistemas
Dispositivos
Pessoas
Produtos conectados
4
Carriots: Construindo um Projeto de IoT
Front end Sistemas de TI Personalizados
Plataforma
Hardware
Internet
Internet
Apresentação
Aplicação(BD, middleware e
motor de regras)
Sensores e Atuadores“Coisas”
5
Carriots: Construindo um Projeto de IoT
Serviços Personalizados
HTTPREST
Serviços WebHTTPS
Interface Web
HTTP3G/4G/Ethernet
GatewayZigbee/Rádio
OutrasAPIs
HTTPAPI
Gateway
8
Carriots: Dispositivos
• Sensores― Coletam os dados brutos lidos por um dispositivo
― Por exemplo: temperatura, presença, vento, campos magnéticos, etc.
• Atuadores― Interagem com o mundo físico agindo sobre ele
― Por exemplo: abrir/fechar portas, exibir mensagens, acender/apagar luzes, enviar sinais, etc.
9
Carriots: Dispositivos• No contexto de um projeto de IoT, os
objetos devem ser capazes de se comunicar e interagir pela Internet
― Autossuficientes
o Modem GPRS/3G/4G embutido
― Sensor + Gateway
o Serial (e.g., RS 485) ou rádio (e.g., 868MHz) + gateway de comunicação
― Rede de sensores + Gateway
• Protocolos de Comunicação
― HTTP
― JSON ou XML
― API REST
Gateways
HTTP3G/4G/Ethernet
RS 485 Zigbee
10
Carriots: Dispositivos
• Exemplo: enviando dados de um sensor de presença de veículo estacionado
11
Carriots: Plataforma
• API REST ― Seguindo padrões da Internet, a plataforma implementa uma API
REST sobre HTTPS
― Recebe grande quantidade de dados dos dispositivos
― Plena capacidade de interação entre a plataforma e os painéis de controle personalizados, dashboards, etc.
― Exemplo: Sensores de estacionamento enviando status (ocupada ou livre) de uma vaga. Painel de controle personalizado é utilizado para gerenciamento
12
Carriots: Plataforma
• BD Big Data― Grandes quantidades de dados são armazenadas
em uma arquitetura de big data schemaless― Provê flexibilidade para o gerenciamento de dados
dos mais diversos dispositivos
― Exemplo: temperatura, posicionamento geográfico, etc.
13
Carriots: Plataforma
• Gerenciamento de Projetos e Dispositivos― Projetos podem ser organizados para atender quaisquer
requisitos
― Flexibilidade para atender dos projetos mais simples aos mais complexos
― Capacidade de gerenciamento remoto dos dispositivos
― Exemplo: Ajuste da taxa de amostragem de um sensor de estacionamento
14
Carriots: Plataforma
• Regras de Negócio e Processamento de Eventos
― Plataforma capaz de armazenar e executar toda a lógica de negócio necessária
― Lógica de negócio escrita em Groovy
― Scripts Groovy são executados no motor e isolados através de uma abordagem if-then-else
15
Carriots: Plataforma• Exemplo de uma lógica de negócio em Groovy., que reage quando uma
informação de estacionamento é recebida
16
Carriots: Plataforma
• Segurança― APIkeys para a definição de privilégios e visibilidades
― HTTPS para a criptografia das requisições e respostas à API REST
― Hash HMAC e senha pré-compartilhada para autenticação e verificação de conteúdo
― Permite a utilização de criptografica personalizada e adição de soluções de segurança adicionais
17
Carriots: Plataforma
• Logs & Debug: Mensagens log, acessíveis a partir do painel de controle, e o console de debug são ferramentas para facilitar o desenvolvimento dos projetos hospedados na plataforma
• Painel de Controle :O painel de controle fornece a capacidade de gerenciamento dos projetos a partir de uma interface Web
• Módulo de Comunicação Externa: Envio de e-mails, SMSs, interação com sistemas externos, etc.
19
Carriots: Front End
• Painel de Controle― Primeira ferramenta utilizada para a construção
de um projeto
― Fornece funcionalidades para a configuração do projeto, definição de privilégios de acesso, gerenciamento dos dados, etc.
HTTPSInterface Web
20
Carriots: Front End
• Dashboard & Painel de Controle― Dashboards e paineis de controle construídos sobre a interface
REST são o que os usuários finais realmente vêem
― Exemplos: mapas customizados das vagas de estacionamento disponíveis
• Monitoramento― Pooling da API REST
― Download de dados
― Gráficos personalizados
― Push de dados baseado em eventos
HTTPSInterface Web
HTTPSInterface Web
21
• Sistemas de TI Externos― A Plataforma pode se integrar
com outros sistemas
― Push/Pull de CRMs, ERPs...
― Exemplo: Zoho CRM, ArcGIS ...
• Integrações já fornecidas― Dropbox
― E-mails em massa
― SMSs
― Sockets
HTTPREST
Serviços Web
Carriots: Integração ExternaServiços
Personalizados
OutrasAPIs
HTTPAPI
22
Carriots: Aplicação no Contexto de Cidades Inteligentes
• Recolhimento de lixo inteligente na cidade de Santander, ES
• Sensores sem fio instalados nas lixeiras• Recuperam informações sobre o volume de lixo
nas lixeiras• Enviam esses dados para a Carriots
23
Carriots: Aplicação no Contexto de Cidades Inteligentes• API REST permite receber os dados brutos• Interface Web personalizada permite analisar:
― Volume de lixo
― Estado das baterias dos sensores
― Qualidade do sinal para a transmissão de dados (GPRS)
25
Xively
• Utiliza serviços de nuvem para gerenciar os dados providos pelos dispositivos
• Fornece uma API RESTful para envio dos dados
• Permite a visualização de dados históricos• Provê mecanismos para disparo de eventos
com base nos dados gerados pelos sensores (triggers)
26
Xively: Arquitetura
27
Xively
• Os dados são organizados em:― Feeds
― Datapoints
― Datastreams
• Formas de recuperação de dados:― JSON, EEML (Extended Environments Markup Language) ou CSV
através da API REST
― Através de sockets― Protocolo MQTT
• EEML permite a descrição semântica do dado coletado• Segurança
― Utilização de HTTPS
― Chave para utilização da API
28
EcoDiF• Desenvolvido no contexto do GT-EcoDiF da RNP
• Integra dispositivos heterogêneos e fornece funcionalidades de controle, visualização, processamento e armazenamento de dados em tempo real.
29
EcoDiF: Arquitetura
• Conexão de Dispositivos: facilita a conexão de dispositivos físicos à plataforma e, consequentemente, à Internet
• Fabricantes desenvolvem drivers compatíveis com a API da EcoDiF
• Usuários conectam seus dispositivos, que utilizam os drivers previamente desenvolvidos pelos fabricantes, à plataforma para permitir a comunicação e o envio de dados
Colaboração
Conexão de Dispositivos
Visualização e Gerenciamento
Armazenamento
Aplicações
Manipulação de Dados
Serviços Comuns
(segurança,
transações, etc.)
30
EcoDiF: Arquitetura
• Manipulação de Dados: manipula dos dados coletados dos dispositivos em tempo real
• Permite a criação do conceito de feed― Confere um contexto semântico aos metadados e
aos fluxos de dados
Colaboração
Conexão de Dispositivos
Visualização e Gerenciamento
Armazenamento
Aplicações
Manipulação de Dados
Serviços Comuns
(segurança,
transações, etc.)
31
EcoDiF: Arquitetura
• Visualização e Gerenciamento: Fornece uma interface Web para:
― Gerenciamento dos dispositivos conectados
― Monitoramento das condições e da localização dos dispositivos
― Criação de alertas e notificações (chamados de triggers) relacionados aos ambientes sensoriados
― Visualização de dados históricos
Colaboração
Devices Connection
Visualização e Gerenciamento
Storage
Applications
Data Manipulation
Security, Life Cycle, transactio
ns,etc
32
EcoDiF: Arquitetura
• Colaboração: Facilita a colaboração entre usuários da plataforma
• Busca por dispositivos e feeds a partir de metadados (tipo, usuário, localização...)
• Busca por aplicações (mashup) disponíveis
Colaboração
Conexão de Dispositivos
Visualização e Gerenciamento
Armazenamento
Aplicações
Manipulação de Dados
Serviços Comuns
(segurança,
transações, etc.)
33
EcoDiF: Arquitetura
• Armazenamento: consiste de dois repositórios― SGBD para armazenamento de dados
― Armazenamento dos scripts de construção de aplicações em sistema de arquivos
Colaboração
Conexão de Dispositivos
Visualização e Gerenciamento
Armazenamento
Aplicações
Manipulação de Dados
Serviços Comuns
(segurança,
transações, etc.)
34
EcoDiF: Arquitetura
• Aplicações: provê um modelo e um ambiente de programação e execução para o desenvolvimento de mashups
• Modelo de programação baseado na linguagem EMML (Enterprise Mashup Markup Language)
Colaboração
Conexão de Dispositivos
Visualização e Gerenciamento
Armazenamento
Aplicações
Manipulação de Dados
Serviços Comuns
(segurança,
transações, etc.)
35
EcoDiF: Arquitetura 1 <mashup name="app" 2 xmlns="http://www.openemml.org/2009-04-15/EMMLSchema" 3 xsi:schemaLocation="http://www.openemml.org/2009-04-15/EMMLSchema… " 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:macro="http://www.openemml.org/2009-04-15/EMMLMacro"> 6 7 <output name="result" type="document"/> 8 <variables> 9 <variable name="feed20" type="document" /> 10 <variable name="feed19" type="document" /> 11 </variables> 12 13 <directinvoke endpoint="http://localhost:8080/EcodifAPI/api/feeds/20/datastreams/20"
method="GET" outputvariable="$feed20" /> 14 <directinvoke endpoint="http://localhost:8080/EcodifAPI/api/feeds/19/datastreams/19" method="GET" outputvariable="$feed19" /> 15 16 <merge inputvariables="$feed20, $feed19" outputvariable="$result" /> 17 18 </mashup>
36
EcoDiF: Arquitetura
DriverAndroid
Conexão de Dispositivos
Armazenamento
Visualização e Gerenciamento
Colaboração
Segurança
Software livre
EEML / REST / HTTP
feeds/aplicações
DriverArduino
JAAS
Outros serviços
JTA JMS …
Manipulação de Dados Aplicações
OMA EMMLEngine
Hibernate
Servidor de Aplicações
Banco de dadosrelacional
Sistema de arquivos
RESTEasy
EEML
EEML/REST
consumidoresde feeds
HTTP
aplicações/consumidoresde feeds
JSF
38
Middleware WSO2
• Plataforma modular, corporativa, free e open-source
• Fornece todas as capacidades do lado servidor (server-side)
• Desenvolvido sobre a tecnologia WSO2-Carbon baseada na OSGi (Open Service Gateway Initiative)*
― Módulos compartilham o mesmo kernel
• Módulos trabalham com protocolos de interoperabilidade padrão
― HTTP, MQTT, AMQP**
*OSGi Alliance: http://www.osgi.org/**Protocolo de messageria para pub/sub. http://amqp.org
39
Middleware WSO2
http://wso2.com/products/
40
Mapeamento do Middleware WSO2 para instanciar uma arquitetura IoT
Como podemos nos beneficiar do middleware WSO2 em IoT?
41
Middleware WSO2Mapeamento para IoT
Estudo de Caso: Monitoramento Inteligente de uma Sala de Reuniões
50
Agenda
• Descrição do Cenário• Visão geral
• Arquitetura
• Ambiente de Hardware e Software utilizados• Configuração do ambiente• Implementação• Cenário em execução
51
Descrição do CenárioControle de salas de reuniões• Integração com a agenda corporativa de reuniões• Monitorar salas de reuniões de uma empresa ou
instituição com o objetivo de deixá-las preparadas para o início de uma reunião
• Monitorar temperatura, iluminação• Acionar o sistema de refrigeração X minutos antes
do inicio caso a temperatura do ambiente não esteja satisfatório como também ligar a iluminação
• Notificar participantes do inicio de uma reunião através de SMS
52
Visão geral da aplicação
53
http / json
Rede 802.15.4
C
Sensor LM335temperatura
E
from SensorInputEventStream[type == 'LM335' and data >= 30.0]#window.time(10 min)select correlation_sensorId as sensorId, type as type, environment as environment, "on" as action insert into SensorOutputEventStream;
Notificação
eventos
Eventos
eventos
Evento atuaçãoEvento atuação
NotificaçãoLembrete da reunião
on / off
E
Sala reunião
E
http / json
Rede 802.15.4
Serviço Integração
evento
Agenda
54
Arquitetura de implementação
55
Mapeamento para aplicação IoT
RESTful
Schema
56
Arquitetura de implementação
57
Modelo de dados dos dispositivos
58
Ambiente de Hardware e
Software utilizados
59
Ambiente de Hardware
60
Ambiente - Hardware
• Dispositivos arduinos• 2 Uno R3
• 2 Mega 2560
• Placa Ethernet Shield• Acesso a internet via
cabo
61
Ambiente - Hardware
• Módulos XBee S1― Estabelecer uma rede sem fio
entre os dispositivos
• Placa XBee explorer usb
• Placa XBee pro
62
Ambiente - Hardware
• Cabos USB para arduino
• Cabo USB mini
• Fontes de alimentação ou baterias para os arduinos
• Roteador
63
Ambiente – Componentes Circuito
• Temperatura• Sensor LM335
• Resistor 2.2k Ohm
• Potenciômetro para calibração
• Atuação• Relé para acionamento de
ar condicionado, iluminação, etc.
64
Ambiente de Software
65
Ambiente - Software
• Arduino IDE• Programação dos arduinos
• XCTU IDE• Configuração dos módulos XBee
• Ambiente Java• Java SDK
66
Ambiente - Software
• Eclipse Java EE IDE for Web Developers
• Plataforma WSO2• CEP – Complex Event Processor• MB – Message Broker
• SGBD MYSQL
67
Configuração do ambiente
Circuito, Rede XBee, WSO2
68
Configuração do ambiente
Circuito
69
Montagem do circuito de temperatura
70
Configuração do ambiente
Rede XBee
71
Dispositivo final
Dispositivo final
Dispositivo final
Controlador da rede
Rede XBee
Rede 802.15.4
72
Configuração do Módulo XBee
• CH : Canal• PAN-ID : ID da rede (Personal Area Network)• DH e DL : Endereço do dispositivo destino• MY : Endereço de 16 bits do dispositivo• CE : Habilitar coordenador ou disp. final• NI : Identificação do Nó• AP : Habilitar uso da API
73
Configuração do Controlador
• CH : 0C• PAN-ID : 3332• DH e DL : 0• MY : 1001 • CE : Coordinator [1]• NI : coord_xbee• AP : API enabled w/PPP [2]
74
Configuração do Dispositivo final
• CH : 0C• PAN-ID : 3332• DH e DL : 0• MY : 1002 • CE : End device [2]• NI : end_device_1002• AP : API enabled w/PPP [2]
75
Configuração do Módulo XBee
• Conectar o Módulo XBee no explorer
• Abrir o programa XTCU
• Clicar na opção Discover devices
76
Configuração do Módulo XBee
77
Configuração do Módulo XBee• Janela apresenta uma
lista com os dispositivos encontrados
• Selecionamos os dispositivos e clicamos no botão Add selected devices
78
Configuração do Módulo XBee• Configuração dos
parâmetros do módulo
79
Configuração do Módulo XBee
• Configuração dos parametros do módulo
• Após configurar os parametros, salvar as configurações no módulo usando o menu ao lado
80
WSO2-CEP
81
WSO2 – CEP – O que processar?
• Processar eventos de temperatura de um determinado ambiente coletados através de um sensor do tipo LM335 e transmitidos ao CEP por um determinado dispositivo.
• Os eventos com temperatura serão acumulados a cada 5 minutos para processamento em modo batch e um dispositivo de atuação será selecionado para envio do comando de atuação.
82
WSO2 – CEP – O que processar?
• Caso o total dos eventos de temperaturas acima ou igual a 25 graus seja maior ou igual a 30, uma mensagem de atuação com o comando “ON” será enviado.
• Caso o total dos eventos de temperaturas abaixo de 25 graus seja maior ou igual a 30, uma mensagem de atuação com o comando “OFF” será enviado.
• Notificar participantes sobre o início da reunião
83
WSO2 Criar fluxo de eventos
e plano de execução para o evento de temperatura
84
WSO2 – CEP - Eventos
• Os passos para criar um fluxo de eventos são:1. Receber (I) e transmitir (O) eventos via HTTP
2. Eventos (I-O) estão em formato JSON
3. Transformar eventos
1. JSON -> WSO2Event -> JSON
4. Criar plano de execução
• Os passos de 1 a 3 são genéricos porque a aplicação envia mensagens padronizadas de sensoriamento independente do tipo de sensor utilizado. O passo 4 é dependente da condição de atuação desejada.
85
WSO2 - CEP
• Iniciar o servidor
• Abrir o navegador e entrar no gerenciador
• URL: https://localhost:9443/carbon
• Login/Senha: admin/admin
86
WSO2 - CEP
• Criar os Input/Output adaptors
• Utilizados para receber eventos de uma fonte e publicar eventos para um coletor
• Clicar na pasta Configure e ir na opção Event Processor Configs
87
WSO2 – CEP – Input adaptor
• Criar um Input adaptor
• Clicar na opção Input Event Adaptors
• Clicar na opção Add Input Event Adaptor
88
WSO2 – CEP – Input adaptor
• Fazer a configuração adequada para o tipo de fonte dos eventos.
89
WSO2 – CEP – Output adaptor
• Criar um Output adaptor
• Clicar na opção Output Event Adaptors
• Clicar na opção Add Output Event Adaptor
90
WSO2 – CEP – Output adaptor• Fazer a configuração adequada para o tipo de coletor dos eventos.
91
WSO2 – CEP – Event Streams• 1-Clicar na aba Main• 2-Selecionar Event Streams• 3-Clicar em Add Event Stream
1
2
3
92
WSO2 – CEP – Novo Event Stream
• Etapa 1 de 2 – Dados básicos
• * campos obrigatórios
93
WSO2 – CEP – Novo Event Stream
• Etapa 2 de 2
• Definir a estrutura do evento, configurando o nome dos atributos e seu tipo
• No final clicar em Add Event Stream e será exibido uma janela solicitando a definição de um EventBuilder
94
WSO2 – CEP – Novo Event Stream
• Janela solicitando a definição de um EventBuilder
• Clicar no botão Create Later
• Repetir os passos 1 e 2 para criar todos os Event Stream
95
WSO2 – CEP – definir Event Builder e Formatters
• Definição de um Event Builder para receber eventos externos via http
• Mapeamento do evento de entrada para o formato interno do CEP
• Clicar na opção In-Flows para definir
96
WSO2 – CEP – definir Event Builder
• Definição de um In-Flow
• Clicar em (+) Receive from...
97
WSO2 – CEP – definir Event Builder
• Definição em 2 passos
• Passo 1 de 2 – Definir Event Builder Name, Input, Topic e Mapping type
1
2
3
4
98
WSO2 – CEP – definir Event Builder
• Passo 2 de 2 –clicar no (+) Advanced para configurar o path de mapeamento de cada campo e no final clicar em Add Event Builder.
99
WSO2 – CEP – definir Event Builder
• Após realizar a configuração o CEP exporta uma URL para envio de eventos
• Método: POST
• http://localhost:9763/endpoints/httpInputSensor/SensorBuilder
100
WSO2 – CEP – definir Formatters• Event Formatters é responsável pelo mapeamento de saída
• Converter um evento (WSO2Event) em diferentes formatos (XML, MAP, JSON e Text)
• Clicar na opção Out-Flows para definir
101
WSO2 – CEP – definir Formatters
• Definição de um Out-Flow
• Clicar em (+) Publish to External...
102
WSO2 – CEP – definir Formatters
• Definição em 2 passos
• Passo 1 de 2 – Definir o Formatter Name e Output Adaptor
103
WSO2 – CEP – definir Formatters• Passo 1 de 2 – configuração da URL que receberá o evento
de saída
104
WSO2 – CEP – definir Formatters• Passo 2 de 2 – configuração do evento de saída
• Indicar o tipo de evento, o conteúdo do evento e no final clicar em Add...
105
WSO2 – CEP – definir Data source
• 1 – clicar na aba Configure
• 2 – clicar na opção Data Sources
• 3 – clicar em (+) Add Data Source
• Acesso ao modelo de dados do Gerenciador de Dispositivo para selecionar o dispositivo “atuador”.
1 2
3
106
WSO2 – CEP – definir Data source
• Configurar os campos com *
107
Plano de Execução
108
WSO2 – CEP – Plano de Execução
• Processa os eventos de entrada e gerar eventos de saída
• Programado através de uma linguagem baseada em SQL
• 1 - Clicar na aba Main
• 2 - Selecionar Execution Plans
• 3 - Selecionar (+) Add Execution Plan
1
2
3
109
WSO2 – CEP – Plano de Execução
• Definição em 3 passos
• Passo 1 – Definir o Execution Plan Name
110
WSO2 – CEP – Plano de Execução• Passo 2 – Definir os Streams de Input e Output do SQL
• Definição do Import Stream• 1 - Selecionar o Input Stream definido e indicas um alias (AS)
• 2 - Clicar em Import
1
2
111
WSO2 – CEP – Plano de Execução
• Definição do Export Stream• 1 - Indicar um Value Of
• 2 - Selecionar o Output Stream definido
• 3 - Clicar em Add
1 2 3
112
WSO2 – CEP – Plano de Execução• Passo 3 – Definição do SQL
113
WSO2 – CEP – Plano de Execução• SQL
define table actuator (id int, macAddress string, env string, sensorType string)
from ('datasource.name'='SensorDS', 'table.name'='actuator');
from SensorInputEventStream [si.type == 'LM335' and si.data >= 25.0]#window.timeBatch(5 min) as sijoin actuator as a on (si.type == a.sensorType) and (a.env == si.environment)select a.macAddress as sensorId, si.type as type, si.environment as environment, "on" as action, count(*) as qtdgroup by si.correlation_sensorId, a.macAddresshaving qtd>=30insert into SensorOutputEventStream2;
114
WSO2 – CEP – Fluxo de eventos• Visualização do fluxo do evento
• 1 – Clicar na Aba Monitor
• 2 – Clicar na opção Event Flow
1
2
115
WSO2 – CEP – Fluxo de eventos
• Integração com a Agenda Corporativa• Mesmos passos indicados anteriormente• Pontos de atenção
• O Input adapter será do tipo JMS
• Na criação do EventBuilder (In-Flow) deve-se configurar o topic/queue que a aplicação da agenda esta publicando as mensagens
• O Output adaptor será do tipo SMS
116
WSO2 – CEP• Input Adapter usando JMS
117
WSO2 – CEP• Event Builder
118
ImplementaçãoArduinos e API Rest
119
Arduinos
120
Arduinos
• Linguagem de programação baseada em C
• Dividida em 4 módulos:• Coletor de dados dos sensores
• Coordenador de Recebimento de eventos e envio ao CEP
• Coordenador de atuação• Recebimento de evento do CEP e envio para atuação
• Atuador
121
Arduinos
• Bibliotecas• Arduino JSON• XBee• Ethernet
122
Coletor de dados de sensor
123
Arduinos – Coletor de dados de sensor
• Dispositivo resposável por• Requisitar informações sobre ambiente a
sensoriar
• coletar dados dos sensores
• formatar a mensagem (JSON)
• enviar ao Coordenador
124
Arduinos – Coletor de dados de sensor
void setup() { pinMode(LEDVerde, OUTPUT); pinMode(LEDVermelho, OUTPUT); pinMode(LEDAmarelo, OUTPUT); pinMode(13, OUTPUT);
Serial.begin(9600); xbee.setSerial(Serial); initVars(); tentativas = 0;}
• setup do dispositivo
125
Arduinos – Coletor de dados de sensor
• setup do dispositivo void initVars() { macAddr = getMAC(); type = "LM335"; env = "SL102"; measure = "C"; pin = 0; tpin = "A";}
String getMAC() { uint8_t shCmd[] = {'S', 'H'}; uint8_t slCmd[] = {'S', 'L'}; String mac = getResultRequest(shCmd); delay(50); mac.concat(getResultRequest(slCmd)); mac.toUpperCase(); return mac;}
126
Arduinos – Coletor de dados de sensor
• loop de execução
void loop() { if (tentativas > -1) { initMessage(); // gera msg de config ao coordenador if (tentativas > 10) { tentativas = -1; } return; }[...]}
127
Arduinos – Coletor de dados de sensor
• Solicita configuração
• Mensagem: {“start”: ”0013A2004076DAF9”}
void initMessage() { String cmd = "{\"start\":\""; cmd.concat(macAddr + "\"}"); [...] uint8_t * payload = (uint8_t *) msg; Tx64Request tx = Tx64Request(addr64, payload, msgsize);[....]
// enviar a mensagem p/ coordenador xbee.send(tx);[...]}
128
Arduinos – Coletor de dados de sensor
• Recebe e processa a configuração
void initMessage() {[...] xbee.readPacket(5000); if (xbee.getResponse().isAvailable()) { [...] if (xbee.getResponse().getApiId() == RX_16_RESPONSE) { xbee.getResponse().getRx16Response(rx16); rxData = rx16.getData(); offset = rx16.getDataOffset(); lenData = rx16.getDataLength(); } else { [...]} // se chegou a resposta da mensagem de inicialização interrompe processConfigMessage(); tentativas = -1;} [...]
129
Arduinos – Coletor de dados de sensor
• Processa a mensagem de configuração recebida
• {"id":"0013A2004076DAF9","type":"LM335","env":"SL102","pin":0,"tpin":"A","measure":"C"}
void processConfigMessage() { String json = dataToString(rxData, 0, lenData); int jsonLen = json.length() + 1; char * msg = (char *) malloc( sizeof( int ) * jsonLen); json.toCharArray(msg, jsonLen); DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(msg); type = root["type"]; env = root["env"]; measure = root["measure"]; pin = root["pin"]; tpin = root["tpin"];
free(msg);}
130
Arduinos – Coletor de dados de sensor
• Coleta dados do sensor e formata mensagem para envio
• Exemplo: {"id":"0013A2004076DAF9","type":"LM335","env":"SL102","data":0.0,"measure":"C"}
// envia a mensagem formatadavoid sendMessage() { float data = getTemperature(); char * json = getJson(macAddr, type, env, data, measure); int jsonsize = strlen(json); uint8_t * payload = (uint8_t *) json;
Tx64Request tx = Tx64Request(addr64, payload, jsonsize); // envia a mensagem para o coordenador xbee.send(tx);}
131
Arduinos – Coletor de dados de sensor
• Coleta dados do sensor
float getTemperature() { float setting = 2.5;
float sensorValue = 0; if (tpin == "A") { sensorValue = analogRead(pin); } else { [...] } float kelvin = (((sensorValue / 1023) * 5) * 100); float celsius = kelvin - 273.15 - setting; return celsius; // Retorna A temperatura}
132
Coordenador de recebimento de eventos
133
Arduinos – Coordenador de recebimento de eventos
• Dispositivo resposável por• Receber a mensagem de config do dispositivo,
interagir com o sistema de gerenciamento de dispositivos, via API REST, e devolver configuração
• Receber os eventos coletados dos sensores
• Formatar uma nova mensagem (JSON) no modelo do CEP
• Enviar mensagem ao CEP
134
Arduinos – Coordenador de recebimento de eventos
• Código de setupvoid setup() {[...] Serial.begin(9600); xbee.setSerial(Serial);
digitalWrite(statusLed, HIGH); Serial.println("Obtendo IP via DHCP..."); if (Ethernet.begin(mac) != 1) { flashLed(errorLed, 2, 100); Ethernet.begin(mac, ip); } digitalWrite(statusLed, LOW); Serial.print("IP Client : "); Serial.println(Ethernet.localIP()); IPok = 1; flashLed(greenLed, 3, 100);}
135
Arduinos – Coordenador de recebimento de eventos
• Código de processamento
void loop() { if (IPok == 1) { if (readSensorPacket() == 1) { verifyMessageAndSendMessage(); } delay(50); }}
136
Arduinos – Coordenador de recebimento de eventos• Código de tratamento de mensagens recebidas
void verifyMessageAndSendMessage() { String msg = dataToString(rxData, 0, lenData); Serial.println("Mensagem ->"+msg); String mac = getMacAddressFromStartMessage(msg); // verifica se é mensagem de inicialização do device if (mac.length() > 0) { Serial.println("Recebida mensagem de Config."); sendMessageConfig(mac); } else { Serial.println("Recebida mensagem de sensor."); sendDataCEP(msg); } free(jsonArray);}
137
Arduinos – Coordenador de recebimento de eventos• Código de envio de mensagens de config ao dispositivo
void sendMessageConfig(String mac) { String jsonConfig = getDeviceConfig(mac);if (jsonConfig.length() > 0) { sendMessageDevice(jsonConfig); }}
String getDeviceConfig(String mac) { String body = ""; httpRequest("192.168.1.112", 8080, "/devicemanager/device/sensoring/" + mac); [...] body = parseBody(body); } else { Serial.println("Sem retorno"); } body.trim(); return body;}
138
Arduinos – Coordenador de recebimento de eventos• Buscar config no Gerenciador de Dispositivos
void httpRequest(const char * server, unsigned long port, String url) {if (client.connect(server, port)) { client.println("GET " + url + " HTTP/1.1"); client.println("Host: " + String(server) + ":" + String(port)); client.println("User-Agent: arduino-ethernet"); client.println("Content-Type: application/json"); client.println("Cache-Control: no-cache"); client.println("Connection: close"); client.println(); delay(50); } else { Serial.println("connection failed"); }}
139
Arduinos – Coordenador de recebimento de eventos• Enviar configuração ao dispositivo
void sendMessageDevice(String msg) {// Parse da mensagem JSON recebida do DM [...] msg.toCharArray(msgArray, msgsize); DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(msgArray); [...] const char* env = root["sala"]; const char* sensortype = root["sensortype"]; const int pin = root["pin"]; [...] //formata a msg de resposta a solicitação do device char * json = getJSONConfig(macaddress, sensortype, env, measure, pin, tpin);
uint8_t * payload = (uint8_t *) json; Tx64Request tx = Tx64Request(addr64, payload, strlen(json)); xbee.send(tx); [...]}
140
Arduinos – Coordenador de recebimento de eventos• Código de envio de mensagens para o WSO2-CEP
void sendDataCEP(String msg) { httpRequest("192.168.1.112", 9763, "/endpoints/httpInputSensor/SensorBuilder", getDataToCEP(msg) );}
141
Arduinos – Coordenador de recebimento de eventos
• Código de envio de mensagens para o WSO2-CEP• Formato mapeado no Event Builder:
{"id":"0013A2004076DAF9","type":"LM335","env":"SL102","data":28.00,"measure":"C"}
char * getDataToCEP(String json) {[...] int jsonLen = json.length() + 1; // parser do evento recebido do dispositivo [...] JsonObject& root = jsonBuffer.parseObject(jsonArray); [...] const char* sensorId = root["id"]; const char* type = root["type"]; [...] return getJSON(sensorId, type, date, time, env, data, measurement);}
142
Arduinos – Coordenador de recebimento de eventos• Código de envio de mensagens para o CEP
void httpRequest(const char * server, unsigned long port, char * url, char * data) {[...]if (client.connect(server, port)) { String host = String (server); String sensorData = String (data); // Make a HTTP request: client.println("POST " + (String)url + " HTTP/1.1"); client.println("Host: " + host); client.println("User-Agent: arduino-ethernet"); client.println("Content-type: application/json"); client.println("Connection: close"); client.println("Content-length: " + (String)strlen(data) + "\n"); client.println(sensorData); client.println(); delay(50);} [...]
143
Coordenador de atuação
144
Arduinos – Coordenador de atuação
• Dispositivo resposável por• É iniciado como um servidor WEB e
disponibiliza uma API• Recebe a mensagem de atuação via
HTTP• do servidor CEP ou de qualquer aplicativo
• Identifica o dispositivo de atuação• Envia mensagem de atuação
145
Arduinos – Coordenador de atuação
• Código de setupvoid setup() {[...]
Serial.begin(9600); // iniciar uma conexão Ethernet digitalWrite(statusLed, HIGH); Ethernet.begin(mac, ip); server.begin(); digitalWrite(statusLed, LOW);
Serial.print("Server ON no IP : "); Serial.println(Ethernet.localIP());}
[…]// MAC addressbyte mac[] = { 0x90, 0xA2, 0xDA, 0x03, 0x00, 0xA2};IPAddress ip(192, 168, 1, 163);
// Inicializa o Ethernet server libraryEthernetServer server(80);
[…]
146
Arduinos – Coordenador de atuação• Processamento de mensagens recebidas
void loop() {// escutar as mensagens HTTP vindas dos clientes EthernetClient client = server.available(); String body = ""; if (client) { while (client.connected()) { if (client.available()) { // mensagem HTTP disponível char c = client.read(); body.concat(c); } else { break; } }}...
147
Arduinos – Coordenador de atuação• Processamento de mensagens recebidas
...
digitalWrite(statusLed, HIGH);
// envia mensagem de Ok para o cliente sendAnswer(client); delay(10); digitalWrite(statusLed, LOW);
client.stop();
// envia a mensagem de atuação sendMessage ( parseBody(body) );}
148
Arduinos – Coordenador de atuação• Envia uma resposta ao cliente de mensagem recebida
void sendAnswer(EthernetClient client) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: application/json"); client.println("Connection: close"); client.println(); client.println("{\"status\":\"OK\"}");}
149
Arduinos – Coordenador de atuação• Forma a mensagem e envia ao dispositivo de atuação
void sendMessage(String msg) {[...] int msgsize = msg.length()+1; char * msgArray = (char *) malloc( sizeof( int ) * msgsize); msg.toCharArray(msgArray, msgsize); DynamicJsonBuffer jsonBuffer; JsonObject& root = jsonBuffer.parseObject(msgArray); const char* sensorId = root["sensorId"]; const char* type = root["type"]; const char* environment = root["environment"]; const char* action = root["action"];....
150
Arduinos – Coordenador de atuação• continuação
... char macHigh[9], macLow[9]; strncpy(macHigh, sensorId, 8);macHigh[8]='\0'; strncpy(macLow, sensorId+8, 8);macLow[8]='\0';// uint32_t msb = strtoul(macHigh, 0, 16); uint32_t lsb = strtoul(macLow, 0, 16);//Seta o mac address do dispositivo de atuação addr64.setMsb (msb); addr64.setLsb (lsb);
uint8_t * payload = (uint8_t *) action; Tx64Request tx = Tx64Request(addr64, payload, strlen(action)); xbee.send(tx);
[...] }
151
Atuador
152
Arduinos – Atuador
• Dispositivo resposável por• Receber a mensagem de atuação do
coordenador e ativar o dispositivo associado por exemplo: um ar-condicionado, um luminária, um eletrodomêstico, etc...
153
Arduinos – Atuador
• Código de setup
void setup() { pinMode(statusLed, OUTPUT); pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT);
pinMode(dispositivo, OUTPUT);
// start serial Serial.begin(9600); xbee.setSerial(Serial);
flashLed(statusLed, 3, 50);}
154
Arduinos – Atuador• Código de recebimento de comando de atuação
void loop() { xbee.readPacket(5000); if (xbee.getResponse().isAvailable()) {[...] if (xbee.getResponse().getApiId() == RX_16_RESPONSE) { xbee.getResponse().getRx16Response(rx16); rxData = rx16.getData(); offset = rx16.getDataOffset(); lenData = rx16.getDataLength(); } else {[...] } doActuation();[...]}
155
Arduinos – Atuador• Código de atuação
void doActuation() { String msg = dataToString(rxData, 0, lenData); msg.toUpperCase();
if (msg == "ON") { digitalWrite(dispositivo, HIGH); } else { digitalWrite(dispositivo, LOW); }}
156
API REST Gerenciar dispositivos
157
API REST - Gerenciar dispositivos
@RequestMapping(method = RequestMethod.GET, value = "/device/sensoring/{macAddress}")@ResponseBodypublic Object getDeviceMonitor(@PathVariable String macAddress)
throws Exception {try {
return dmService.getDeviceMonitor(macAddress);} catch (Exception e) {
throw new Exception("Ocorreu um erro ao processar dados! Erro="+e.getMessage());
}}
158
Aplicação na prática
Plataformas para aInternet das Coisas
Paulo F. Pires1, Flavia C. Delicato1, Thais Batista2, Thomaz Barros1, Everton Cavalcante1,3, Marcelo Pitanga1
1DCC/PPGI, Universidade Federal do Rio de Janeiro, Rio de Janeiro, Brasil2DIMAp, Universidade Federal do Rio Grande do Norte, Natal, Brasil
3IRISA-UMR CNRS/Université de Bretagne-Sud, Vannes, França