Plataformas para a Internet das Coisas Paulo F. Pires 1, Flavia C. Delicato 1, Thais Batista 2,...

Preview:

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

― Twitter

― 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

Thomaz Avila Barros
Acredito que as referências devam ser excluídas nesse caso
Flávia Delicato
nao, devemos deixar as REFS

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

Recommended