universidade de sÃo paulo - tcc.sc.usp.br · elon musk. resumo considerando o grande crescimento...

84
UNIVERSIDADE DE SÃO PAULO ESCOLA DE ENGENHARIA DE SÃO CARLOS DEPARTAMENTO DE ENGENHARIA ELÉTRICA E DE COMPUTAÇÃO Protótipo de uma central de controle para automação residencial compatível com o projeto IoTivity e controlada por aplicativo Android Autor: Thiago Ghidoni Mantovan Orientador: Prof. Dr. Evandro Luís Linhari Rodrigues São Carlos 2016

Upload: vohanh

Post on 10-Feb-2019

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

UNIVERSIDADE DE SÃO PAULO

ESCOLA DE ENGENHARIA DE SÃO CARLOS

DEPARTAMENTO DE ENGENHARIA ELÉTRICA

E DE COMPUTAÇÃO

Protótipo de uma central de controle para

automação residencial compatível com o projeto

IoTivity e controlada por aplicativo Android

Autor: Thiago Ghidoni Mantovan

Orientador: Prof. Dr. Evandro Luís Linhari Rodrigues

São Carlos

2016

Page 2: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 3: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Thiago Ghidoni Mantovan

Protótipo de uma central de controle

para automação residencial compatível

com o projeto IoTivity e controlada por

aplicativo Android

Trabalho de Conclusão de Curso apresentado

à Escola de Engenharia de São Carlos, da

Universidade de São Paulo

Curso de Engenharia Elétrica - Ênfase em Eletrônica

ORIENTADOR: Prof. Dr. Evandro Luís Linhari Rodrigues

São Carlos

2016

Page 4: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

AUTORIZO A REPRODUÇÃO TOTAL OU PARCIAL DESTE TRABALHO,POR QUALQUER MEIO CONVENCIONAL OU ELETRÔNICO, PARA FINSDE ESTUDO E PESQUISA, DESDE QUE CITADA A FONTE.

Mantovan, Thiago Ghidoni M293p Protótipo de uma central de controle para automação

residencial compatível com o projeto IoTivity econtrolada por aplicativo Android / Thiago GhidoniMantovan; orientador Evandro Luis Linhari Rodrigues.São Carlos, 2016.

Monografia (Graduação em Engenharia Elétrica com ênfase em Eletrônica) -- Escola de Engenharia de SãoCarlos da Universidade de São Paulo, 2016.

1. Automação. 2. IoTivity. 3. Android. 4. Mobile. 5. Internet das Coisas. 6. Internet of things. I.Título.

Page 5: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Título: “Protótipo de uma central de controle para automação

residencial compatível com o projeto IoTivity e controlada por

aplicativo Android”

Page 6: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 7: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Dedicatória

Aos meus pais, Márcio e Selma, ao meu irmão, Matheus, ao meus avós, Marlene, Janitis

e Waldemar e ao meu tio e tias, Dorival, Carla e Márcia, por me apoiarem e incentivarem,

cada um a sua maneira.

Thiago Ghidoni Mantovan.

Page 8: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 9: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Agradecimentos

• À Deus, por tudo que já ocorreu em minha vida.

• Aos meus pais, Márcio e Selma, e ao meu irmão, Matheus, por todo o apoio em minhas

decisões.

• Aos meu outros familiares, que colaboraram na minha formação tanto acadêmica quanto

pessoal.

• Aos meus companheiros de classe, por compartilharem todas as alegrias e angústias.

• Ao Prof. Dr. Evandro Luis Linhari Rodrigues, pela orientação e conselhos dados a

mim.

• À todos os professores que fizeram parte dos diferentes momentos de minha formação.

• Ao CNPq, por ter me proporcionado a experiência de realizar um intercâmbio.

Thiago Ghidoni Mantovan.

Page 10: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 11: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

"Se algo é importante o suficiente, você deve tentar.

Mesmo que o provável resultado seja o fracaso."

Elon Musk

Page 12: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 13: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Resumo

Considerando o grande crescimento tanto das discussões quanto das aplicações envol-

vendo o tópico Internet das Coisas, esse projeto tem o objetivo de criar o protótipo de uma

central de controle para um sistema de automação residencial controlado via comunicação

sem fio por meio de um aplicativo Android. O diferencial desse projeto é a utilização do pro-

jeto IoTivity que é uma iniciativa criada pelo Open Internet Consortium e patrocinada pelas

maiores empresas do ramo de tecnologia e que visa criar uma estrutura que possa proporci-

onar uma fácil integracão de diversas plataformas e sistemas operacionais com as diversas

tecnologias de comunicação sem fio. O projeto apresenta um protótipo que oferece rápida

resposta além de ser compatível com o projeto IoTivity e de fornecer a possibilidade do uso

de outros dispositivos e sensores que ainda não seguem os padrões estabelecido pelo OIC.

Esse protótipo é o primeiro passo para uma nova onda de dispositivos que seguirão os mes-

mos padrões e criarão uma situação na qual todos os dispositivos se comunicarão criando

uma rede com controle descentralizado, aumentando a eficiência energética e promovendo

um ambiente coeso que possa ser controlado por meio de um único aplicativo.

Palavras-Chave: Automação, IoTivity, Android, Mobile, Internet das Coisas

Page 14: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 15: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Abstract

Considering the huge growth in both discussions and applications involving the topic In-

ternet of Things, this project aims to create a prototype of a home automation control center

that is controlled wirelessly by an android app. The differential of this project is the inclusion

of the IoTivity project which is an initiative created by the Open Internet Consortium, OIC,

and sponsored by the major companies in the technology industry and aims to create a fra-

mework that provides an easy integration of different platforms and operational systems with

the various wireless technologies. The project features a prototype that offers quick response

in addition to being compatible with the IoTivity project and provide the possibility of using

other devices and sensors that do not even follow the standards established by the OIC. This

prototype is the first step to a new wave of devices that follow the same standards and create

a situation in which all devices communicate creating a network with decentralized control,

increasing energy efficiency and promoting a cohesive environment that can be controlled

through a single application.

Keywords: Automation, IoTivity, Android, Mobile, Internet of Things.

Page 16: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 17: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Lista de Figuras

1.1 Gráfico Gartner Hype Cycle de 2011. . . . . . . . . . . . . . . . . . . . . . 26

1.2 Gráfico Gartner Hype Cycle de 2014. . . . . . . . . . . . . . . . . . . . . . 27

2.1 Blocos Essenciais da estrutura proporcionada pelo IoTivity [27]. . . . . . . . 39

3.1 Visão geral das possíveis conexões do sistema . . . . . . . . . . . . . . . . . 41

3.2 Placa Intel Galileo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.3 Módulo ESP8266 e NodeMCU DevKit v0.9. . . . . . . . . . . . . . . . . . . 44

3.4 Fluxograma Servidor Galileo . . . . . . . . . . . . . . . . . . . . . . . . . . 49

3.5 Fluxograma ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

4.1 Atraso da conexão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.2 Atraso da mensagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.3 Atraso da conexão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.4 Atraso da mensagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Page 18: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 19: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Lista de Tabelas

4.1 Atrasos do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

Page 20: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 21: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

Siglas

IoT Internet of Things - Internet das Coisas

OIC Open Internet Consortium

OCF Open Connectivity Foundation

npm Node Package Manager

RFID Radio-Frequency Identification - Identificação por Radio Frequência

IP Internet Protocol - Protocolo Internet

HTTP HyperText Transfer Protocol - Protocolo de Transferência de HiperTexto

HTML HyperText Markup Language - Linguagem de Marcação de HiperTexto

CSS Cascade Style Sheets - Folhas de estilo cascateadas

MQTT MQ Telemetry Transport - Transporte de Telemetria MQ

SOC System on chip - Sistema em chip

SOM System on module - Sistema em módulo

SBC Single-board computer - Computador em placa única

RISC Reduction Set Instruction Computer - Computador com conjunto reduzido de instruções

IEEE Instituto de Engenheiros Eletricistas e Eletrônicos

IDE Integrated Development Environment - Ambiente de Desenvolvimento Integrado

API Application Programming Interface - Interface de Programcação de Aplicativos

Page 22: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível
Page 23: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

23

Sumário

1 Introdução 25

1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

1.2 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

1.3 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

1.4 Organização do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2 Embasamento Teórico 31

2.1 Sistemas Embarcados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.2 Protocolos de Comunicação . . . . . . . . . . . . . . . . . . . . . . . . . . 32

2.2.1 Conjunto de Protocolos de Internet . . . . . . . . . . . . . . . . . . . 32

2.3 Yocto Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

2.4 Programação para Node.js (JavaScript) . . . . . . . . . . . . . . . . . . . . 35

2.5 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.5.1 Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

2.6 Open Internet Consortium . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

2.6.1 Projeto Iotivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3 Materiais e Métodos 41

3.1 Materiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.1.1 Intel Galileo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.1.2 ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.2 Métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.2.1 Implementação Servidor Galileo . . . . . . . . . . . . . . . . . . . . 48

3.2.2 Implementação Módulo ESP8266 . . . . . . . . . . . . . . . . . . . 49

3.2.3 Implementação Android . . . . . . . . . . . . . . . . . . . . . . . . 50

3.2.4 Implementação IoTivity . . . . . . . . . . . . . . . . . . . . . . . . 51

Page 24: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

24

4 Resultados e Discussões 53

5 Conclusões 57

5.1 Sequência do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

A Códigos criados para o projeto 65

A.1 Código Galileo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

A.2 Código ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

A.3 Código Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

I Códigos utilizados 71

I.1 Código IoTivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

I.1.1 Código Placa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

I.1.2 Código Computador . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Page 25: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

25

Capítulo 1

Introdução

Muito se tem discutido, recentemente, acerca da Internet of Things ou em português a

Internet das Coisas no entanto, o conceito de dispositivos inteligentes conectados em uma

rede já era aplicado muito antes do termo especifico ser cunhado. O primeiro registro de um

dispositivo conectado é do começo da década de 1980 onde membros do departamento de

Ciências da Computação da Universidade Carnegie-Mellon nos Estados Unidos conectaram

uma máquina de refrigerantes ao computador do departamento e a partir dessa conexão ti-

nham acesso a quantidade de garrafas de refrigerante contidas na máquina e se essas garrafas

estavam geladas ou não [1].

Apesar da máquina de refrigerante ter sido o primeiro dispositivo conectado a uma rede, o

aspecto internet ainda não estava presente uma vez que ainda não havia surgido a World Wide

Web. Todavia, em 1990, John Romkey criou o primeiro dispositivo conectado à internet, uma

torradeira que podia ser ligada e desligada através da internet [1].

Finalmente, em 1999 o termo foi cunhado por Kevin Ashton, diretor executivo do Aito-ID

Center, ao realizar uma apresentação para a Procter e Gamble (P&G) na qual ele fazia uma

ligação entre a ideia de chips RFID na produção da P&G e um dos assuntos que estava em

alta no momento, a Internet. Em paralelo, Neil Gershenfeld do MIT Media Lab estava des-

crevendo algo semelhante em seu livro "When Things Start to Think"onde ele cita: ’Parece

que o rápido crescimento da World Wide Web pode ter sido a faísca que está promovendo a

verdadeira explosão, onde as coisas começam a usar a Internet’ [1].

A discussão e o desenvolvimento nesse tópico foram muito grandes nos últimos 15 anos,

ocorreram desde diversos relatórios, conferencias e publicações a diversas matérias em jor-

nais e revistas de grande circulação. Entre 2008 e 2009, a Internet das Coisas nasceu, uma

vez que existiam mais dispositivos do que pessoas conectadas à internet e em 2010 o número

Page 26: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

26

de dispositivos já era de 12,5 bilhões enquanto a população mundial estava em 6,8 bilhões,

ocorrendo pela primeira vez o fato de mais dispositivos do que pessoas estarem conectados à

internet.

O surgimento de novas plataformas, novas normas, novos hardware e software acelera-

ram o crescimento da Internet das Coisas pois promoveram uma maior acessibilidade para

pequenos desenvolvedores o que aumentou o interesse nesse tópico. Um exemplo dessas ino-

vações que popularizaram o desenvolvimento foi o surgimento de placas de desenvolvimento

de hardware sendo as mais famosas o Arduino e a Raspberry Pi.

Outro componente que não possuía tanta relevância a alguns anos atrás e que será um

diferencial para manter o crescimento nesse tópico é o IPv6, pois esse novo protocolo dis-

ponibilizará uma gama de endereços quase infinita, para ser exato serão 2128 endereços, que

será capaz de absorver todas as inovações que envolverão o acesso à internet, uma vez que o

antigo protocolo, IPv4, atingiu o seu máximo número de endereços e seria um gargalo para o

contínuo desenvolvimento de novas aplicações.

Juntamente com as inovações, diversas conferencias, relatórios e a entrada de grandes

empresas no desenvolvimento e marketing desse tópico fizeram com que ele fosse adicio-

nado em 2011 ao Gartner Hype Cycle, como poder ser observado na figura 1.1, na categoria

technology trigger, que representa tecnologias em seus estágios iniciais com poucos produtos

realmente prontos, com viabilidade comercial não comprovada porem com grande publici-

dade [2].

Figura 1.1: Gráfico Gartner Hype Cycle de 2011.

Page 27: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

27

Em 2014, o tópico atingiu o ponto de peak of inflated expectations, como pode ser obser-

vado na figura 1.2, que representa o ponto de mais alta expectativa em relação ao assunto, o

surgimento da divulgação de alguns primeiros sucessos e de fracassos também e da tomada

de ações por parte de algumas empresas interessadas no assunto [3].

Figura 1.2: Gráfico Gartner Hype Cycle de 2014.

Com base nesse ciclo, a Internet das Coisas atingirá o ultimo nível, plateau of productivity,

que representa o começo da adoção por grande parte da população, a viabilidade por parte

do fornecedor fica mais clara e a grande aplicabilidade e importância da tecnologia oferecem

um retorno mais concreto, entre 5 e 10 anos [3].

Mas qual será o próximo passo? Em um artigo publicado em 1999 na revista de negó-

cios BusinessWeek que trazia ideias para o século XXI, uma delas era de que o planeta seria

envolvido por um tipo de pele eletrônica. Sendo que essa pele seria constituída por milhões

de dispositivos de medição: termostatos, detectores de poluição, câmeras, microfones e di-

versos outros sensores. E esses dispositivos iriam testar e monitorar as cidades, os animais, a

atmosfera, as rodovias, a nossa comunicação e até nossos corpos [4].

Analisando o artigo e observando os avanços obtidos nessa área nos últimos anos podemos

ver que estamos seguindo o caminho citado e que a evolução disso é o fim da necessidade de

uma central que controle os dispositivos pois eles serão capazes de trocar informações entre

eles e realizar ações autônomas com base nas preferencias já observadas dos usuários.

E é baseado nessa visão e no desenvolvimento que está ocorrendo no momento, que esse

projeto tem o intuito de ser um passo inicial para esse novo cenário que está sendo imaginado

Page 28: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

28

e construído.

1.1 Motivação

A motivação deste trabalho se deu após a realização da disciplina SEL0373 - Projeto

de Sistemas Digitais na qual foi desenvolvido um sistema inicial de automação residencial

utilizando a placa Intel Galileo e alguns sensores de modo a simular o funcionamento de

diversos dispositivos em uma residência.

Além da disciplina cursada, outro fator que influenciou nessa decisão é a magnitude que

o assunto internet das coisas tomou nos últimos anos, a diversa gama de aplicações nas quais

ele pode ser usado e uma excelente perspectiva de crescimento desse setor nos próximos anos.

1.2 Objetivo

O objetivo desse trabalho é criar um protótipo de uma central de controle para automação

residencial que esteja em conformidade com os padrões definidos para a Internet das Coisas

pelo Open Internet Consortium, que esteja preparado para integrar dispositivos que utilizem

o projeto IoTivity, além de oferecer a possibilidade do uso de dispositivos independentes

produzidos especialmente para esse sistema.

Para mensurar se o objetivo foi alcançado, será realizado um teste de latência do sistema

e um teste com exemplos fornecidos pelo projeto IoTivity para confirmar a integração das

funcionalidades oferecidas por essa iniciativa.

1.3 Justificativa

A justificativa deste trabalho é criar uma aplicação utilizando o que há de mais avançado

no tópico Internet of Things, que esteja dentro das especificações que estão sendo criadas

pelo OIC e que gere conhecimento para trabalho futuros próprios ou de terceiros.

1.4 Organização do Trabalho

Este trabalho está distribuído em sete capítulos, incluindo esta introdução, dispostos con-

forme a descrição que segue:

Capítulo 2: Descreve os conceitos e ferramentas utilizados para a produção deste trabalho

Page 29: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

29

Capítulo 3: Discorre sobre os materiais e métodos utilizados durante o desenvolvimento

deste projeto

Capítulo 4: Apresenta os resultados obtidos e discute o grau de satisfação atingido além

da relevância do projeto

Capítulo 5: Conclui sobre o trabalho ponderando os avanços alcançados e os obstáculos

encontrados além de apresentar possíveis modificações ou evoluções para trabalhos futuros

Page 30: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

30

Page 31: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

31

Capítulo 2

Embasamento Teórico

O projeto se baseia em três pilares: sistemas embarcados, protocolos de comunicação e o

projeto Iotivity. Uma visão geral sobre esses tópicos é providenciada a seguir.

2.1 Sistemas Embarcados

Um sistema embarcado é um sistema baseado em um microprocessador que é construído

para realizar uma ou diversas tarefas e que não é projetado para que o usuário final possa

programá-lo. Geralmente, o uso de sistemas embarcados tem como objetivo tanto de fornecer

dados quanto de realizar tarefas previamente programadas instantaneamente visto que foram

projetados para realizar tais tarefas mais eficientemente que outros sistemas de uso mais

generalizado [5].

Uma evolução dos sistemas embarcados mais convencionais são os single-board compu-

ters, ou SBCs, que significam computadores de placa única, que possuem além do micropro-

cessador, a memória, entradas e saídas e outras características requeridas para um computa-

dor funcional, tudo em um única placa. Alguns exemplos de SBC são a Raspberry Pi [6], a

BeagleBone Black [7], os Arduinos [8], a Intel Galileo [9].

Com a melhora na processo de fabricação de chips integrados que proporcionou aumentar

muita a densidade de componentes presentes em um chip, surgiram os systems on a module,

SOMs e os systems on chip, SOCs, que significam respectivamente sistemas em um módulo e

sistema em um chip. Esses sistemas oferecem desde conexões Wi-Fi e Bluetooth a até entrada

e saídas digitais e analógicas. Exemplos desses sistemas são o Intel Edison [10], ESP8266

[11], as placas Colibri da Toradex [12].

Os sistema embarcados variam desde dispositivos portáteis como relógios digitais e toca-

Page 32: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

32

dores de MP3, a até grandes instalações como semáforos, controladores de fábricas e outros

muito complexos como veículos, aparelho de ressonância magnética e outros. A comple-

xidade pode variar desde um único microcontrolador a até unidades que necessitem de de

vários microcontroladores.

A comunicação com o mundo físico é feita por meio de periféricos como interfaces de

comunicação serial, como RS-232, interface de comunicação síncrona, como SPI e I2C, USB,

placas de rede, entradas e saída digitais ou analógicas e outros.

2.2 Protocolos de Comunicação

No âmbito de telecomunicações, um protocolo de comunicação é um conjunto de regras

que permite que dois ou mais dispositivos de um sistema de comunicação transmitam infor-

mação por meio de uma variação de uma quantidade física. Essas são as regras ou padrões

que definem a sintaxe, a semântica e a sincronização da comunicação além de possíveis méto-

dos de recuperação de erros. Os protocolos podem ser implementados em hardware, software

ou ambos [13].

Sistemas de comunicação usam formatos(protocolos) bem definidos para a troca de men-

sagens. Esses protocolos devem ser acordados previamente pelas partes envolvidas. Para

alcançar esse acordo, os protocolos podem se tornar padrões técnicos.

Os protocolos devem especificar as regras de uma transmissão de mensagens entre siste-

mas de comunicação e por isso os seguintes tópicos devem ser definidos: formato de dados,

formato de endereço, mapeamento de endereço, roteamento, detecção de erros, perda de in-

formação, controle de sequência, direcão do fluxo de dados e fluxo de dados.

2.2.1 Conjunto de Protocolos de Internet

O conjunto de protocolos de internet é o modelo de conexões e conjunto de protocolos

utilizados para a internet e redes semelhantes. Geralmente conhecido como TCP/IP, porque os

o protocolo de controle de transmissão, TCP, e o protocolo de internet, IP, foram os primeiros

a serem definidos durante o desenvolvimento [14].

O TCP/IP proporciona comunicação ponta a ponta especificando como os dados devem

sem empacotados, endereçados, transmitidos, roteados e recebidos. Essa funcionalidade é or-

ganizada em quatro camadas abstratas que são utilizadas para classificar os outros protocolos.

De baixo para cima, tem-se a camada de ligação, contendo os métodos de comunicação para

Page 33: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

33

dados que se mantenham dentro de um segmento da rede, a camada de internet, conectando

as redes independentes, a camada de transporte, que gerencia a comunicação entre hosts e a

camada de aplicação, que proporciona troca de dados entre processos para as aplicaçãoes.

Protocolo de Transferência de Hipertexto - HTTP

O protocolo de transferência de hipertexto, ou HTTP, é um protocolo de aplicação para

sistemas de informação de hipermídia colaborativos e distribuídos [15]. O HTTP é a base da

comunicação de dados da World Wide Web.

Hipertexto é um texto estruturado que usa ligações lógicas (hyperlinks) entre nós contendo

textp. O HTTP é o protocolo que troca ou transfere hipertexto. Ele funciona como um

protocolo de pedido-resposta no modelo cliente-servidor de computação. O cliente submete

uma mensagem de pedido HTTP para um servidor. O servidor que providencia os recursos,

como arquivos HTML e outros, retorna uma mensagem resposta para o cliente. A respostas

contém a informação do estado do pedido e também pode retornar um conteúdo no corpo da

mensagem.

Em sua definição, é presumido o uso de um protocolo da camada de transporte confiável e

o TCP é geralmente utilizado. Entretanto, o HTTP pode ser adaptado para o uso de protocolos

não tão confiáveis como o User Datagram Protocol, ou UDP.

Constrained Application Protocol - CoAP

O constrained application protocol, ou CoAP, é um protocolo de software criado para ser

utilizado em dispositivos eletrônicos bem simples, permitindo a eles comunicação interativa

pela internet [16]. É direcionado a pequenos sensore de baixa potência, válvulas e outros que

precisam ser controlados ou supervisionados remotamente.

O CoAP é um protocolo da camada de aplicação direcionado a dispositivos com poucos

recursos. Foi desenhado para ser de fácil tradução para o HTTP para uma simples integração

com a web além de possuir recursos especializados como suporte a multicast, baixo gasto

com processamento em excesso e alta eficiência. E esses são fatores determinantes para

configurá-lo de extrema importância para a IoT e dispositivos com comunicação máquina a

máquina.

O CoAP usa dois tipos de mensagens, pedidos e respostas, usando um cabeçalho simples

de formato binário. Ele é por padrãoligado ao UDP mas pode alternativamente fazer uso

de outro protocolo para uma maior segurança. Além disso, oferece suporte para diversas

Page 34: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

34

linguagens como Java, Python, C, Ruby e várias outras.

Message Queue Telemetry Transport - MQTT

O message queue telemetry transport, ou MQTT, é um protocolo de mensagens leves

para sensores e pequenos dispositivos móveis otimizado para redes TCP/IP não confiáveis

e de alta latência, que necessitem de rastro de código pequeno ou possuem banda limitada

[17]. O sistema de troca de mensagens é fundamentado no modelo publicador-subscritor e

requer um intermediário. Esse intermediário é o responsável por distribuir as mensagens aos

clientes interessados baseado no tópico da mensagem.

O MQTT define métodos para indicar a ação desejada a ser realizada. Esses métodos

são: Connect, espera uma conexão ser estabelecida com o servidor, Disconnect, espera que o

cliente termine todo o trablaho e depois finaliza a sessão, Subscribe, se cadastra para receber

atualizações dos valores dos tópicos desejados e Publish, publica um valor para o tópico

especificado.

2.3 Yocto Project

O Yocto Project é um projeto colaborativo de código aberto que providencia modelos,

ferramentas e métodos para auxiliar a criação de sistemas embarcados baseados em Linux não

importando a arquitetura do hardware. O projeto tem como objetivo facilitar o trabalho dos

desenvolvedores de sistemas customizados de Linux suportando as arquiteturas ARM, MIPS,

PowerPC e x86. Uma parte essencial disso é o sistema de construção, baseado na arquitetura

OpenEmbedded, que possibilita aos desenvolvedores criarem suas próprias distribuições de

Linux especificas para o seu ambiente de trabalho. Essa implementação da OpenEmbedded

é chamada de Poky [18].

Construir a correta distribuição de Linux para os dispositivos conectados pode ser de-

vagar e cara, além de que juntar todas as peças necessárias para cada dispositivo causa aos

desenvolvedores problemas de escalabilidade e incompatibilidade. O Yocto Project consegue

minimizar esses problemas pois oferece customização das características de uma distribuição

por meio do uso de uma arquitetura com camadas com pacotes pré-moldados, chamados de

receitas, que fornecem as instruções de construção para os pacotes de rede, gráficos e muitos

outros. É por isso que o Yocto Project é considerado fundamental para o avanço e crescimento

da Internet of Things.

Page 35: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

35

Um dos diferenciais do Yocto Project é a grande rede de parceiros de hardware que for-

necem camadas atualizadas e bem gerenciadas oferecendo suporte as principais arquiteturas

e isso fornece uma base para dispositivos bem diferentes poderem ter acesso ao mesmo soft-

ware e bibliotecas. Outro diferencial é a comunicação pois são necessários diversos padrões

de comunicação e protocolos para que os dispositivos possam se comunicar e o Yocto Project

oferece camadas que são capazes de realizar a transferência de dados utilizando as diferentes

especificações de cada protocolo.

2.4 Programação para Node.js (JavaScript)

JavaScript é uma linguagem de programação interpretada de alto nível que segue as espe-

cificações do padrão ECMAScript. Juntamente com HTML e CSS, é uma das três tecnologias

fundamentais da produção de conteúdo para internet e a maioria dos sites a emprega e é supor-

tada por todos os navegadores modernos sem a necessidade de uso de plug-ins [19]. Apesar

de compartilhar a nomenclatura, a sintaxe e algumas bibliotecas padrão, as linguagens JavaS-

cript e Java não são relacionadas e possuem diferentes semânticas. A sintaxe da JavaScript é

derivada da linguagem C.

A linguagem JavaScript possui três principais interpretadores sendo eles: SpiderMonkey,

Chakra e, o que vai ser apresentado a seguir, o V8. O V8 é o interpretador de código aberto e

alta performance da Google. Ele compila e executa os códigos fonte em JavaScript, gerencia

a alocação de memória para objetos e coleta os objetos que não são mais necessários.

JavaScript é comumente utilizado para a programação da parte do cliente em um nave-

gador, sendo utilizado para manipular os objetos DOM, sendo que esses são fornecidos pelo

navegador enquanto o V8 fornece as funções, tipos de dados e operadores. E esse interpreta-

dor é a engrenagem por trás da ferramenta Node.js que é utilizada para o desenvolvimento da

parte do servidor de aplicações Web.

O Node.js é um ambiente de execução multi-plataforma de código aberto para o desenvol-

vimento dos servidores para aplicações na web. Apesar de não ser estruturado em JavaScript,

muitos dos pacotes básicos do Node.js são escritos em JavaScript além dos novos módulos

que podem ser criados utilizando essa linguagem. A sua arquitetura é baseada em eventos e

é capaz de controlar entradas e saídas assíncronas. Essas escolhas de construção têm como

objetivo otimizar o fluxo de dados e a escalabilidade de aplicações Web que necessitam de

muitas operações de entrada e saída ou aplicações em tempo real [20].

Page 36: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

36

O Node.js permite a criação de servidores Web e ferramentas de rede utilizando JavaScript

e os módulos que estão a disposição para download e fornecem diversas novas funcionalida-

des, como o Socket.io que é explorado a seguir.

O Socket.io é uma biblioteca de rede para JavaScript que disponibiliza comunicação bi-

direcional, instantânea e baseada em eventos entre servidor e cliente. Ela utiliza o protocolo

WebSocket porém, oferece mais recursos como broadcast e multicast, armazenamento de

dados associados a cada cliente e entrada e saída assíncronas. Essa biblioteca oferece a habi-

lidade de implementar analise de padrões em dados em tempo real, transmissão de imagens,

áudio e vídeo, mensagens instantâneas e colaboração em documentos. Serviços que utilizam

essa ferramenta são Microsoft Office, Yammer e Zendesk [21].

Outro pacote do Node.js que tem papel fundamental nesse projeto é a biblioteca MQTT

(MQ Telemetry Transport) que implementa o protocolo MQTT e com isso abre um canal de

comunicação com o Mosquitto que é um programa intermediário que traduz as mensagens

recebidas para o padrão aceito pelo receptor. O MQTT é um protocolo de conectividade

máquina a máquina e foi desenvolvido como um assinante e publicador muito leve de men-

sagens. Ele é útil para conexões com locais remotos pois não necessita de muita banda para o

recebimento e transmissão. Porém, ele necessita de um programa que distribui as mensagens

para os clientes dependendo do tópico especificado na mensagem [22].

2.5 Linux

O Linux é um sistema operacional criado a partir do modelo de distribuição e desenvol-

vimento de código aberto. O componente mais importante é o Linux kernel desenvolvido

em 1991 por Linus Torvald. O kernel é o programa que constitui o centro do sistema ope-

racional pois possui controle sobre tudo que acontece no sistema, por exemplo, é o primeiro

programa a ser inicializado ao se ligar o sistema, gerencia as saídas e entradas requisitadas

pelo software e gerencia memória.

O sistema foi inicialmente desenvolvido como um sistema operacional gratuito para com-

putadores pessoais baseados na arquitetura x86 da Intel, porém já foi portado para outras

plataformas mais do que qualquer outro sistema operacional. Em sua forma original, ele

também é o líder em uso em servidores e em supercomputadores. Além disso, ele também

roda em sistemas embarcados onde o sistema é colocado no firmware.

Normalmente, o Linux é oferecido em distribuições que englobam o kernel Linux, biblio-

Page 37: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

37

tecas e ferramentas para diversas operações e um gerenciador de pacotes que tem a função de

automatizar o processo de instalação, atualização e desinstalação dos programas para o sis-

tema operacional. As distribuições mais conhecidas são: Debian [23], Ubuntu [24], Fedora

[25], etc.

2.5.1 Android

O Android é um sistema operacional para mobiles desenvolvido pela Google, baseado

no kernel Linux e projetado primeiramente para dispositivos móveis com telas sensíveis ao

toque como smartphones e tablets. A interface é baseada em sua maior parte na manipulação

direta, usando gestos e toques que correspondem a ações do mundo real, como deslizar e

tocar para manipular os objetos na tela juntamente com um teclado virtual para a inserção de

texto.

Além dos dispositivos com telas sensíveis ao toque, a Google tem desenvolvido o sistema

para televisões, carros, relógios e outras versões do sistema também são utilizadas em note-

books, vídeo games, câmeras digitais e outros aparelhos eletrônicos. Desde 2013, o Android

é o sistema operacional mobile mais vendido além de possuir mais de 1,4 bilhão de usuários

mensais ativos.

Apesar do código fonte ser liberado pela Google sujeitos as licenças de código livre, o

sistema é distribuído juntamente com software proprietário para funcionamento das principais

funções oferecidas pela empresa. A natureza de código livre ajudou a criar uma grande

comunidade que tenta criar novas funcionalidades ou aprimorar a experiência oferecida pelo

sistema.

A empresa oferece um IDE, o Android Studio, para que desenvolvedores possam criar

seus próprios aplicativos e também proporciona uma plataforma, a Play Store, para que esses

desenvolvedores coloquem seus aplicativos à disposição dos usuários e que também pode

gerar receita quando os aplicativos não forem gratuitos.

2.6 Open Internet Consortium

O Open Internet Consortium foi fundado pelas empresas que lideram o setor de tecno-

logia, como Cisco, Intel, General Electric e Samsung, com o intuito de definir os requisitos

de conectividade e garantir a interoperabilidade dos bilhões de dispositivos que constituirão

a IoT. Isso está sendo realizado por meio de certificações e especificações para oferecer uma

Page 38: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

38

estrutura de conectividade que minimiza a complexidade do processo. Além disso, esse pa-

drão será uma especificação aberta de modo que qualquer pessoa possa implementar e que

seja simples para desenvolvedores utilizarem.

2.6.1 Projeto Iotivity

Todas as características citadas acima serão oferecidas para diversas plataformas por meio

do projeto Iotivity que é patrocinado pelo OIC e visa uma implementação referência com

código livre que criará uma arquitetura robusta e extensa que possa ser utilizada para os

diversos dispositivos inteligentes e assim facilitar a conectividade entre eles e com a internet

[26].

A arquitetura proporcionará uma espécie de mapa a ser seguido pelos fabricantes e pro-

vedores de serviço e incluirá:

• Solução comum: definir soluções de comunicação e interoperabilidade entre produtos

de múltiplos mercados através de diversos sistemas operacionais e plataformas.

• Protocolos Estabelecidos: criar novos protocolos em comum e utilizar os já existentes

para a descoberta e conectividade através de diversos meios.

• Abordagens universais: aplicar abordagens universais para a segurança e identidade.

• Semelhanças definidas: definir perfis comuns, modelos de objetos e interfaces de pro-

gramação de aplicações (APIs).

• Interoperabilidade: promover interoperabilidade entre dispositivos e aplicações de di-

versos mercados e de diferentes cenários de uso.

• Oportunidades de inovação: proporcionar oportunidades para inovação e disponibilizar

diferenciação.

• Conectividade necessária: conectar tudo desde o menor dispositivo vestível ao maior

carro inteligente.

Page 39: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

39

Figura 2.1: Blocos Essenciais da estrutura proporcionada pelo IoTivity [27].

As APIs de estrutura do IoTivity proporcionam acesso a estrutura aos desenvolvedores e

estão disponíveis em diversas linguagens de programação e para múltiplos sistemas operaci-

onais. A estrutura funciona como um intermediador entre os vários sistemas operacionais e

as diversas plataformas de conectividade e possui quatro blocos essenciais:

• Descoberta: Suporte a diversos mecanismos de descoberta para dispositivos e recursos

em proximidade e remotamente.

• Transmissão de Dados: Suporte ao controle e a troca de informações baseado em um

modelo de mensagens e streaming.

• Gestão de Dados: Suporte à coleta, armazenamento e análise de dados de diversas

fontes.

• Gestão de Dispositivos: Suporte à configuração, provisionamento e diagnóstico de dis-

positivos.

Page 40: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

40

Page 41: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

41

Capítulo 3

Materiais e Métodos

Neste capítulo são listados os materiais e métodos utilizados nesse projeto para a criação

do sistema proposto representado pela figura 3.1.

Figura 3.1: Visão geral das possíveis conexões do sistema

Page 42: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

42

3.1 Materiais

Neste projeto foram utilizados os seguintes materiais:

• Computador com sistema operacional Ubuntu

• Intel Galileo

• NodeMCU Devkit v0.9

• Protoboard

• Conectores

• LEDs

• Cartão micro SD

• Adaptador USB Wi-Fi TP-Link WN725N

• Cabo USB para Serial TTL

• Android Studio

A escolha pelo Ubuntu como sistema operacional se deve pelo fato de o projeto IoTivity

oferecer compatibilidade com esse sistema e por ele também oferecer todas as ferramentas

necessárias para o controle das placas.

A escolha pela Intel Galileo se deu pelo fato de ser a placa que o aluno possuía no mo-

mento do desenvolvimento do projeto e que decidiu utilizá-la para testar seus limites frente

a aplicação deste trabalho uma vez que a Intel, fabricante da placa, é uma das empresas

fundadoras do OIC e do projeto IoTivity.

A escolha da placa NodeMCU DevKit se deu pelo fato de oferecer um ambiente mais

completo e integrado quando comparado ao módulo ESP8266, visto que ela possui uma porta

USB que serve como porta serial além de oferecer mais entradas e saídas.

O adaptador Wi-Fi foi escolhido para poder oferecer mobilidade e facilidade de instalação

da placa Galileo.

A escolha pelo Android Studio para o desenvolvimento do aplicativo foi realizada para

testar um novo IDE para a confecção de aplicativos Android uma vez que na disciplina de

Projeto de Sistemas Digitais cursada anteriormente foi utilizado o Intel XDK para essa ativi-

dade e os resultados não foram satisfatórios.

Page 43: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

43

3.1.1 Intel Galileo

A placa de desenvolvimento Intel Galileo é a primeira placa microcontrolada que possui

um processador Intel Quark e hardware e software com compatibilidade de pinos com os

shields produzidos para Arduino. Essa plataforma oferece suporte aos sistemas operacionais

mais utilizados no mundo além de oferecer compatibilidade ao ambiente de desenvolvimento

do Arduino. Na parte de hardware, a placa possui um processador Quark X1000 de 32 bits

com clock de 400 MHz, 256 MB de memória RAM e 8 MB de memória flash além de

oferecer diversos outros recursos, como por exemplo, 20 entradas e saídas digitais, 6 entradas

analógicas, 6 saídas PWM, comunicação serial, porta Ethernet, adaptador para cartão SD,

JTAG para debug [9].

Na parte de software, além de oferecer compatibilidade com o ambiente de desenvolvi-

mento do Arduino, o recurso mais importante para este trabalho é a possibilidade de rodar um

sistema operacional baseado em Linux especialmente projetado para essa placa utilizando o

Yocto Project. Com isso, temos acesso a inúmeras funções presentes no Linux, como SSH,

criação de servidores HTTP e também acesso a diversos avanços que estão sendo feitos na

área de IoT e que não estão disponíveis para outros sistemas operacionais.

Figura 3.2: Placa Intel Galileo.

3.1.2 ESP8266

O módulo ESP8266 é um SoC, sistema em um chip, com Wi-Fi embutido que possui

diversas variantes nas quais cada uma oferece recursos diferentes como mais portas de entrada

e saída, entradas analógicas entre outros. Esse módulo é capaz de hospedar uma aplicação ou

se tornar responsável por todas as funções de rede de outro processador, como por exemplo

substituir o shield ethernet para um Arduino [11].

O módulo possui um processador de 32 bits com arquitetura RISC produzido pela Tensi-

lica operando a 80 MHz, 64 KB de memória ROM para o boot além de 64 KB de RAM para

Page 44: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

44

instruções e 96 KB de RAM para dados. O módulo oferece suporte ao padrão IEEE 802.11

b/g/n de Wi-Fi e dependendo do modelo pode oferecer até 16 pinos de entrada e saída.

Ele também oferece uma grande possibilidade de desenvolvimento de aplicações na área

de IoT uma vez que ele possui poder de processamento e espaço de armazenamento suficien-

tes e que pode ser facilmente integrado a diversos sensores.

Devido as funcionalidades oferecidas, foram criadas diversas placas de desenvolvimento

que utilizam o ESP8266 como seu processador central e adicionam outros recursos a ele.

No caso desse trabalho, será utilizada uma placa de desenvolvimento chamada NodeMCU

DevKit v0.9 que acrescenta ao módulo em sua variante ESP-12, uma porta USB-TTL Serial

que permite a programação do módulo utilizando somente um cabo USB, além de deixá-lo

compatível com o layout da protoboard.

Essa placa oferece diferentes métodos de programação, sendo eles utilizando o NodeMCU

e a linguagem LUA, utilizando o Arduino IDE e a linguagem C ou via comandos AT.

Figura 3.3: Módulo ESP8266 e NodeMCU DevKit v0.9.

3.2 Métodos

O primeiro passo para realizar esse projeto foi a preparação do computador rodando o

Ubuntu para que ele pudesse ser capaz de compilar a imagem personalizada baseada no Linux

utilizando o Yocto Project. Utilizando o gerenciador de pacotes do Ubuntu, apt-get, instalou-

se os seguintes pacotes: debootstrap, build-essential, git, p7zip-full, chrpath, diffstat, gawk,

wget, git-core, diffstat, unzip, texinfo, gcc-multilib, socat, libsdl1.2-dev, xterm e parted. A

maioria desses pacotes somente foi utilizada para a compilação da imagem.

Page 45: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

45

Após essas instalações, fez-se necessário obter a versão daisy do poky, que é a distribuição

base do projeto Yocto, e também as diversas outras camadas que personalizarão a imagem

fazendo-a assim compatível com a placa Intel Galileo que foi utilizada. As seguintes camadas

foram necessárias para habilitar todas as funcionalidades da placa: meta-intel-quark, meta-

intel-iot-middleware, meta-intel-galileo, meta-openembedded e meta-intel-iot-devkit. A última

camada que foi adicionada ofereceu as funcionalidades do projeto IoTivity e pôde ser encon-

trada pela identificação meta-oic. Todas essas camadas podem ser obtidas via comandos git a

partir do endereço git.yoctoproject.org [28].

Após o download de todas as camadas fez-se necessário carregar o ambiente de traba-

lho utilizando o comando source seguido do argumento oe-init-build-env. Em seguida, foi

necessário editar o arquivo bblayers.conf contido na pasta conf e adicionar os caminhos para

as camadas que foram utilizadas. No mesmo diretório, foi preciso alterar a versão da distri-

buição no campo DISTRO para ’iot-devkit-multilibc’, alterar a classes dos pacotes no campo

’PACKAGE-CLASSES’ para ’package-ipk’ e alterar a dispositivo alvo no campo "MACHINE"

para ’quark’ no arquivo ’auto.conf’. Finalmente, para obter-se as funcionalidades proporcio-

nadas pelo projeto IoTivity, foi necessário adicionar as seguintes linhas no mesmo arquivo:

IMAGE-INSTALL-append += "iotivity-resource-samples iotivity-service-samples"

IMAGE-INSTALL-append = "iotivity-dev"

Após terminar a edição do arquivo auto.conf foi iniciada a compilação da imagem. Para

começar, foi necessário executar o seguinte comando: bitbake iot-devkit-image. O processo

pode levar algumas horas para finalizar e é indispensável ter uma conexão com a internet

visto que o processo requer o download de alguns arquivos.

Terminado o processo de compilação da imagem, foi utilizado um aplicativo, que acom-

panha a camada meta-intel-iot-devkit, que criou a imagem final que foi colocada no cartão

micro SD e utilizada pela placa. O comando que foi utilizado é o seguinte:

"/meta-intel-iot-devkit/scripts/wic_monkey create -e iot-devkit-image

/meta-intel-iot-devkit/scripts/lib/image/canned-wks/iot-devkit.wks". Após o termino do pro-

cesso, um caminho foi mostrado na tela e indicou o diretório onde a imagem a ser colocada

no cartão SD se encontrava.

Vale ressaltar que alguns exemplos e todos os recursos do projeto IoTivity já estão embuti-

dos na imagem criada uma vez que a camada meta-oic foi adicionada ao processo de criação

da imagem e estão disponíveis para uso e consulta nos seguintes caminhos: /opt/iotivity e

/usr/include/iotivity.

Page 46: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

46

O próximo passo foi inserir o cartão micro SD contendo a imagem na placa, conectar o

cabo serial e energizar a placa. Após isso, foi necessário o uso de algum programa que acesse

a placa via Serial, nesse caso foi utilizado o aplicativo PuTTy mas existem outras alternativas.

Antes de qualquer outro comando, deve-se alterar a data do sistema para que não haja pro-

blemas de compatibilidade, por isso usa-se o seguinte comando: ’date mmddHHMMYYYY’.

De modo a não necessitar do uso de um cabo Ethernet para ter acesso a internet, deve-se

configurar o adaptador USB Wireless. Para isso, mudou-se o diretório para /usr/src/kernel

e utilizou-se o seguinte comando: ’make scripts’. Após esse processo terminar, é necessá-

rio fazer o download do driver para o adaptador no computador utilizando o comando ’git

clone’ seguido desse endereço: ’https://github.com/lwfinger/rtl8188eu’. Depois do download,

foi preciso transferir os arquivos obtidos para a placa, mudar o diretório para a pasta criada

e executar os comandos em sequência: ’make all’ e ’make install’. Após a finalização desse

processo, bastou conectar o dongle na porta USB da placa, executar o comando ’connmanctl’

para iniciar o ambiente de conexão para a wifi. O primeiro passo foi executar o comando

’scan wifi’ e em seguida o comando ’services’ para obter as redes disponíveis na área e exe-

cutar ’connect’ seguido do id da rede desejada. Se a conexão necessitar de uma senha, basta

executar o comando ’agent on’ antes do comando ’connect’ [29].

Após a conexão na rede, fez-se necessário a instalação de alguns pacotes que foram uti-

lizados no código do servidor que é executado via Node.js além de fazer a instalação do

Mosquitto que é o programa intermediário que gerencia as mensagens no formato do padrão

MQTT. Para a instalação dos pacotes, primeiro deve-se atualizar o ’npm’ que é a ferramenta

de controle e instalação dos pacotes do Node.js com o comando ’npm update’, após isso deve-

se executar o seguinte comando para a instalação dos pacotes: ’npm install -g mqtt socket.io’,

esse comando instala globalmente, ou seja, qualquer aplicação pode utilizá-los, os pacotes

MQTT e Socket.io que já foram discutidos anteriormente.

A instalação do Mosquitto difere da instalação dos pacotes, primeiro deve-ser executar o

seguinte comando para fazer o download do arquivo compactado: ’wget http://mosquitto.org/

files/source/mosquitto_1.4.8.tar.gz’. Após o download é necessário descompactar o arquivo

utilizando o seguinte comando: ’tar xzvf mosquitto_1.4.8.tar.gz’. Deve-se mudar o diretório

para a pasta contendo o resultado da descompactação usando o comando ’cd mosquitto_1.4.8’

e executar o comando ’make’ para realizar a instalação do Mosquitto [30]. Com isso a placa

está preparada para executar o código que será descrito mais a frente.

O próximo passo foi preparar a placa de desenvolvimento contendo o ESP8266 para re-

Page 47: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

47

ceber o código que controla sensores/atuadores. Para a configuração da placa foi neces-

sário a instalação do Arduino IDE, após a instalação, deve-se entrar na opção preferên-

cias e adicionar a seguinte URL no campo de Additional Boards Manager e clicar OK:

’http://arduino.esp8266.com/stable/package_esp8266com_index.json’. Após isso, entrar no

menu Tools e no subitem boards selecionar o Boards Manager, onde aparecerá um pacote

contendo as configurações para a programação dos módulos ESP8266, deve-se instalar esse

pacote e novamente no menu Tools e no subitem Boards agora deve-se selecionar a placa alvo

da programação, nesse caso a NodeMCU 0.9. Com isso, concluiu-se a configuração do IDE

e o próximo passo foi inserir o código e compilá-lo para ser mandado para a placa.

É necessário também preparar o computador no qual será executado os exemplos que fo-

ram criados ao se gerar a imagem contendo os arquivos do projeto IoTivity. Após a geração

da imagem, também é possível criar um SDK específico para que possa ser realizado o de-

senvolvimento de novas aplicações para a placa, porém existe um modo mais prático para

compilar os novos programas escritos para a placa e para os outros dispositivos que se inte-

grarão ao ambiente proporcionado pelo IoTivity. Basta baixar a última versão disponível para

download no site ’iotivity.org’ e utilizar a ferramenta Scons para compilar os programas feitos

para o ambiente IoTivity tanto para os sistemas baseados em Linux quanto para Arduino,

Android e Tizen, que é um sistema operacional baseado no kernel do Linux e muito utilizado

em aplicações da Samsung [31].

O procedimento para a criação de novos programas não é muito simples pois além de

criar um código que esteja em conformidade com os padrões estabelecidos para uma total

integração no projeto IoTivity, também se fez necessário editar um arquivo chamado SCons-

cript especificando o nome do novo programa, o seu arquivo fonte e adicioná-lo a uma lista

onde ele será importado no ambiente de construção para ser compilado e especificar todos

os caminhos para as bibliotecas necessárias. Sendo uma ferramenta de compilação cruzada,

o SCons é capaz de criar programas compatíveis com diversos sistemas, como Linux, Ar-

duino e Android, além de oferecer opções para a escolha do transporte de informações, por

exemplo, via IP ou via Bluetooth, e também a possibilidade da compilação para diferentes

arquiteturas [26].

O último passo antes da criação do códigos foi preparar o computador que recebeu o

software Android Studio no qual foi confeccionado o aplicativo para o controle do sistema.

O software pode ser encontrado no site para desenvolvedores Android e sua instalação é

muito simples visto que ao selecionar o SDK compatível com a última versão do sistema

Page 48: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

48

operacional, todas as funcionalidades das versões anteriores estão presentes. O software

oferece um editor de layout com o recurso de arrastar e soltar para facilitar a criação do

aplicativo. Para finalizar a preparação do software foi necessário editar o arquivo ’build.gradle’

que estava na árvore de arquivos embaixo do item Gradle Scripts e adicionar a seguinte

linha no campo ’dependencies’: ’compile (’io.socket:socket.io-client:0.7.0’)’. Com essa linha,

o aplicativo é capaz de usar as propriedades oferecidas pela biblioteca Socket.io que fornece

um meio mais simples e rápido de comunicação via sockets [21].

Após a preparação das plataformas, o próximo passo foi a confecção e implantação dos

códigos para cada dispositivo que serão discutidos a seguir.

3.2.1 Implementação Servidor Galileo

O código do servidor da galileo pode ser dividido em duas partes: a primeira é respon-

sável pela comunicação com o aplicativo e a segunda é responsável pela comunicação com

os outros dispositivos. A comunicação com o aplicativo é feita com o uso da biblioteca Soc-

ket.io e o modo como é feita é pela criação de um servidor http e adição dos recursos dessa

biblioteca ao servidor. Após isso, o servidor fica esperando uma conexão e ao receber essa

conexão, uma função é chamada para a recepção e emissão de mensagens para o aplicativo.

Por exemplo, ao apertar o botão do aplicativo, uma mensagem específica será enviada para o

servidor que estará aguardando essa mensagem para executar outra função.

A segunda parte realiza a conexão, utilizando a biblioteca MQTT, com o servidor Mos-

quitto rodando na placa e é responsável pela publicação e assinatura das mensagens no proto-

colo MQTT. Ou seja, essa parte é responsável por enviar e receber as mensagens no formato

do protocolo para os outros dispositivos ligados ao sistema.

O fluxograma abaixo ilustra o funcionamento do servidor implementado.

Page 49: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

49

Figura 3.4: Fluxograma Servidor Galileo

3.2.2 Implementação Módulo ESP8266

O código da placa de desenvolvimento que contém o módulo ESP8266 também é dividido

em duas partes: a configuração da conexão à rede local sem fio e a assinatura e transmissão

de mensagens no protocolo MQTT.

Para a primeira parte é utilizada uma biblioteca especificamente criada para o módulo

ESP8266, onde é definido o nome da rede e a senha no código e existe uma tentativa de

conexão. Todo esse processo pode ser observado por um monitorador serial pois foram pro-

gramadas mensagens a serem enviadas via serial para observar o andamento dessa atividade.

Para a segunda parte também é utilizada uma biblioteca especialmente criada para lidar

Page 50: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

50

com as especificações do protocolo MQTT. É definido no código o endereço do servidor Mos-

quitto, nesse caso o IP da placa Galileo, e uma conexão é estabelecida e a seguir, o programa

fica esperando uma mensagem vinda da placa galileo para ativar ou desativar um atuador.

Após realizar a ação, uma mensagem é enviada para a placa galileo a fim de confirmar a

atividade realizada.

O fluxograma abaixo ilustra o funcionamento do módulo ESP8266.

Figura 3.5: Fluxograma ESP8266

3.2.3 Implementação Android

O código para o aplicativo android é o menos complexo pois somente é criada uma função

para a conexão com a placa Galileo, novamente utilizando a biblioteca Socket.io, e após isso,

são criadas funções de escuta, ou seja, elas ficam esperando a ação do seu determinado botão

para enviarem uma mensagem para a placa. Outro detalhe, para cada ação realizada no botão,

Page 51: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

51

um mensagem pop-up aparecerá indicando a ação.

A parte gráfica do aplicativo foi desenvolvida com ajuda da ferramenta arraste e solte do

Android Studio. O design escolhido é básico contando com uma tela de login que precede a

página principal onde os dispositivos a serem controlados são mostrados em forma de cartão

contendo seu nome e o botão para realizar a ação.

3.2.4 Implementação IoTivity

O código utilizado para implementar o projeto IoTivity foi baseado nos exemplos que são

obtidos ao criar a imagem do Linux com a camada OIC. O primeiro par de códigos tem como

função encontrar o dispositivo conectado e informá-lo sobre as informações da plataforma

a qual ele se conectou. No servidor, que está rodando na placa Galileo, são informadas as

características da plataforma, importadas as funcionalidades do IoTivity e o servidor emite a

informação de que está esperando uma conexão e ao receber uma conexão, as características

são enviadas para o cliente. No código do cliente, que foi implementado no dispositivo, uma

conexão foi tentada e ao realizá-la, as informações da plataforma foram recebidas.

O segundo par de códigos teve a implantação invertida, ou seja, o servidor está no dispo-

sitivo e o cliente está na placa Galileo. Os dois códigos seguem o mesmo padrão de conexão

dos outros, onde um recurso disponibilizado pelo IoTivity permite que os dispositivos se

declarem disponíveis como ocorre ao se ligar o Bluetooth de um aparelho. O código do ser-

vidor simula uma lâmpada que cuja potência subirá em 10 unidades a cada vez que o cliente

se conectar para fazer uma observação do recurso. O código do cliente, ao se conectar, busca

as informações do servidor e observa os recursos iniciados no servidor e assim receberá as

informações sobre a lâmpada.

Page 52: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

52

Page 53: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

53

Capítulo 4

Resultados e Discussões

Os resultados atingiram totalmente o que foi projetado e era esperado. Todas as etapas

propostas foram concluídas e apresentaram os resultados esperados.

A confecção da imagem personalizada do Linux baseado do Yocto Project funcionou per-

feitamente apesar de terem sido necessárias várias tentativas até que o processo fosse aper-

feiçoado e que a imagem final contivesse todas as funcionalidades desejadas. O único ponto

que deixou espaço para melhora foi o tamanho da imagem final, que teoricamente deveria ter

sido reduzido, porém com a adição do projeto IoTivity e a não remoção de algumas funci-

onalidades que pudessem ser importantes no futuro, teve um aumento de aproximadamente

300 MB quando comparada com a imagem criada sem o projeto IoTivity. Isso pode impactar

futuramente no funcionamento do sistema, porém pode ser facilmente contornado com o uso

de um cartão de memória de maior capacidade.

A criação do aplicativo para a plataforma Android oferecia uma grande dificuldade visto

que a experiência em programação nas linguagens XML e Java, que são as necessárias para

o desenvolvimento do aplicativo, era quase nula. No entanto, isso foi contornado com o

uso do editor de layout presente no Android Studio que minimizou a programação em XML

enquanto que para a parte com programação em Java foi necessário um empenho maior para

o entendimento e aprendizagem da linguagem. Devido a esses fatos, o aplicativo ficou com

um design básico, porém funcional.

Apesar da dificuldade encontrada para o desenvolvimento profundo do projeto IoTivity

devido a complexidade da documentação e dos poucos exemplos que podem ser encontrados,

foi possível observar as funcionalidades que essa implementação pode oferecer, como não

precisar informar o IP de cada dispositivo e a conexão ser feita automaticamente, por meio

dos exemplos fornecidos porém, a complexidade do projeto precisa ser diminuída se o intuito

Page 54: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

54

é popularizar essa tecnologia entre os desenvolvedores.

A escolha pelo método de compilação pela ferramenta SCons, ao invés do uso do SDK

criado no processo de construção da imagem personalizada, provou-se somente adequado

visto que uma das funcionalidades esperadas era a possibilidade de compilação dos códigos

direto na placa, porém devido à falta de memória RAM e pouco poder de processamento esse

processo se mostrou impossível de ser realizado. Outro fato que pesou contra o uso do SCons

foi a necessidade de alterar um arquivo que contém todos os códigos a serem compilados,

apesar de ser uma tarefa simples, até a descoberta de que esse processo, que não estava

especificado na documentação fornecida, era necessário foi gasto muito tempo que poderia

ter sido dedicado a outra atividade.

Foram realizados dois testes, um para obter o desempenho do sistema e outro, para confir-

mar a presença das novas funcionalidades acrescentadas pelo projeto IoTivity. Vale ressaltar

previamente que esses testes foram realizados em um ambiente que possuía boa cobertura de

sinal de WiFi além de todos os dispositivos estarem conectados à mesma rede local.

O primeiro teste realizado foi o de latência, que mediu a demora de comunicação entre

os dispositivos. Foram realizadas as medidas dos atrasos da conexão e do envio de uma

mensagem a partir do aplicativo Android para a placa Galileo utilizando um função no código

que marcava o início da ação e ao final dela mostrava na tela quanto tempo havia se passado

desde a maração inicial. Os resultados são apresentados na tabela 4.1 e nas figuras 4.1 e 4.2 .

Figura 4.1: Atraso da conexão

Figura 4.2: Atraso da mensagem

Tipo de Atraso Tempo de atraso médio (ms)

Conexão 3

Mensagem Websocket 3

Total 6

Tabela 4.1: Atrasos do sistema

Page 55: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

55

Observando esses valores podemos ver que o atraso acumulado é pequeno quando consi-

deramos que o mínimo de atraso que o olho humano pode perceber, segundo diversos estudos,

é de 14 ms. Por causa disso, tem-se a impressão de que a ação ocorre instantaneamente.

O outro teste realizado teve como objetivo comprovar que a placa Galileo possuía as

novas funcionalidades adicionadas pelo projeto IoTivity. Para isso, foram inicializados os

códigos na Galileo e no computador com a distribuição Ubuntu do Linux e observado as

informações que apareciam na sessão da placa Galileo. As figuras 4.3 e 4.4 servem como

evidência para comprovar que a placa Galileo está preparada para executar exemplos que

utilizam os recursos do projeto IoTivity.

Figura 4.3: Atraso da conexão

Page 56: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

56

Figura 4.4: Atraso da mensagem

Page 57: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

57

Capítulo 5

Conclusões

Considerando o objetivo definido no início do projeto, o trabalho realizado e os resultados

obtidos, pode-se concluir que esse projeto além de conseguir deixar um protótipo funcional e

preparado para novas funcionalidades também deixou uma sólida base para futuros trabalhos

utilizando essa tecnologia.

O ponto mais importante do trabalho foi o sucesso na integração do projeto IoTivity à

placa de desenvolvimento escolhida e também o fato de conseguir produzir um protótipo que

além de oferecer compatibilidade com o IoTivity, também é capaz de gerenciar, de maneira

ágil, diversos dispositivos e sensores que podem ser incorporados futuramente ao projeto.

Alguns pontos no qual o trabalho produziu o resultado projetado são a criação da ima-

gem personalizada que já continha a estrutura, as funcionalidades e os padrões definidos pelo

Open Internet Consortium, uma vez que ofereceu um recurso muito importante para futuros

projetos que seria maximizar a eficiência e minimizar o espaço gasto ao se retirar funcio-

nalidades não desejadas, a integração de diferentes plataformas, variando desde o módulo

ESP8266 até o Android, e a criação de um sistema que oferece um tempo de resposta que

cria a impressão de ser instantâneo para o usuário.

Um dos pontos mais importante desse trabalho foi agregar novos conhecimento ao aluno

visto que apesar de possuir experiência prévia com as linguagens JavaScript e C e a placa Ga-

lileo, foi necessário desenvolver novas habilidade para a programação do aplicativo Android

que foi realizada em XML e Java, duas linguagens onde o conhecimento prévio era quase

inexistente. Além do aprendizado de novas linguagens, o projeto também proporcionou a

oportunidade de explorar uma nova plataforma que possui uma grande gama de aplicações

para a internet das coisas e que possui uma otina perspectiva de futuro quando considerado

os avanços recentes na área de hardware.

Page 58: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

58

Apesar de não ter sido possível alcançar um nível de desenvolvimento superior ao pro-

posto e projetado, a experiência com o projeto IoTivity foi de grande valia uma vez que os

exemplos fornecidos funcionaram perfeitamente além de que a indústria deve seguir os re-

quisitos e padrões estabelecidos pelo OIC criando assim dispositivos compatíveis com os da

concorrência para que se possa gerar em ambiente onde não seja preciso utilizar diversos

aplicativos ou adaptadores e tudo poderá ser controlado por um único aplicativo. As causas

para o fato de não superar o que foi proposto foram a complexidade apresentada pelo projeto,

o pouco desenvolvimento tanto para a Galileo quanto para outros sistemas e a documentação

imprecisa ou confusa. Um bom exemplo dessa situação é que a cada atualização do projeto

era necessário gerar novamente a imagem personalizada e realizar todo o processo de confi-

guração da placa Galileo novamente, além disso mesmo se a atualização não fosse realizada

para não despender tempo com essa atividade, ainda havia o risco de que alguma ferramenta

tenha sido descontinuada ou uma nova seja adicionada deixando assim a placa defasada em

relação aos avanços.

Algumas dificuldades já eram esperadas visto que é o início do projeto, poucas platafor-

mas são suportadas, há muitas especificações a serem seguidas e acima de tudo, o desenvol-

vimento está sendo feito em conjunto com a comunidade, o que por um lado é extremamente

importante já que as pessoas envolvidas diretamente com o uso dessa tecnologia podem su-

gerir mudanças, no entanto por outro lado, se não houver uma grande adoção por parte da

comunidade, o projeto pode se tornar obsoleto ou conter funcionalidades que não serão utili-

zadas.

Todos esses problemas devem ser resolvidos quando houver um consenso de que esse

será o novo padrão a ser seguido pela indústria e o primeiro passo para isso já foi dado

com o anúncio da Open Connectivity Foundation, OCF, que integrou Microsoft, Qualcomm

e Electrolux ao integrantes do OIC. A OCF possui o mesmo objetivo do OIC que é definir

especificações e certificações com o intuito de oferecer interoperabilidade confiável, ou seja,

uma plataforma de conectividade que reduz a complexidade porém, engloba mais parceiros

com grande representatividade tanto no mercado de dispositivos móveis quanto no cenário

geral de tecnologia, o que pode ser um grande diferencial quando comparado ao OIC.

Page 59: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

59

5.1 Sequência do Trabalho

Os próximos passos do projeto consistem em integrar novos dispositivos ao sistema, novas

funcionalidades, testar diferentes placas de desenvolvimento visto que a fabricante da Galileo

não está mais tão dedicada a seu desenvolvimento além de existirem alternativas melhores e

mais baratas e o que seria o cenário considerado ideal para o futuro, a extinção da central

de comando, fazendo com que os dispositivos comunicassem entre si e diretamente com o

aplicativo criado para smartphones.

Além disso, a aplicação do projeto IoTivity em outras plataformas é um passo seguinte,

visto que o projeto oferece compatibilidade com outras plataformas como Arduino e Android

e oferece diversas funcionalidades que serão de extrema importância no desenvolvimento

futuro da Internet das Coisas.

Page 60: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

60

Page 61: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

61

Referências Bibliográficas

[1] History of the internet of things. http://http://postscapes.com/internet-of-

things-history, Acesso em: 09 de outubro de 2015.

[2] Gartner’s 2011 hype cycle special report evaluates the maturity of 1,900 technologies.

http://www.gartner.com/newsroom/id/1763814, Acesso em: 13 de novembro de

2015.

[3] Gartner’s 2014 hype cycle for emerging technologies maps the journey to digital busi-

ness. http://www.gartner.com/newsroom/id/2819918, Acesso em: 14 de novem-

bro de 2015.

[4] Neil Gross. The earth will don an electronic skin. http://www.businessweek.com/

1999/99_35/b3644024.htm, Acesso em: 14 de novembro de 2015.

[5] S. Heath. Embedded systems design, 2002.

[6] Raspberry pi. https://www.raspberrypi.org/, Acesso em: 20 de maio de 2016.

[7] Beaglebone black. https://beagleboard.org/black, Acesso em: 20 de maio de

2016.

[8] Arduino. https://www.arduino.cc/, Acesso em: 20 de maio de 2016.

[9] Placa de desenvolvimento intel galileo. http://www.intel.com.br/content/www/

br/pt/do-it-yourself/galileo-maker-quark-board.html, Acesso em: 17 de

junho de 2015.

[10] Toradex colibri. https://www.toradex.com/pt_br/computer-on-modules/

colibri-arm-family, Acesso em: 20 de maio de 2016.

[11] Wifi module - esp8266. https://www.sparkfun.com/products/13678, Acesso em:

10 de setembro de 2015.

Page 62: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

62

[12] Intel edison. https://software.intel.com/pt-br/iot/hardware/edison,

Acesso em: 20 de maio de 2016.

[13] L. J. Rodríguez-Aragón. Tema 4: Internet y teleinformática. http://www.uclm.

es/profesorado/licesio/Docencia/IB/IBTema4.pdf, Acesso em: 10 de abril de

2016.

[14] Tcp/ip. http://www.itprc.com/tcpipfaq/, Acesso em: 20 de maio de 2016.

[15] Http. https://tools.ietf.org/html/rfc2616, Acesso em: 20 de maio de 2016.

[16] Coap. http://hinrg.cs.jhu.edu/joomla/images/stories/IPSN_2011_koliti.

pdf, Acesso em: 20 de maio de 2016.

[17] Mqtt. http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html,

Acesso em: 20 de maio de 2016.

[18] About | yocto project. https://www.yoctoproject.org/about, Acesso em: 17 de

junho de 2015.

[19] D. Flanagan. Javascript: The definitive guide, 2011.

[20] About | node.js. https://nodejs.org/en/about/, Acesso em: 22 de agosto de 2015.

[21] Socket.io. http://socket.io/, Acesso em: 20 de junho de 2015.

[22] Mqtt. http://mqtt.org/, Acesso em: 15 de dezembro de 2015.

[23] Debian. https://www.debian.org/index.pt.html, Acesso em: 20 de maio de

2016.

[24] Ubuntu. http://www.ubuntu.com/, Acesso em: 20 de maio de 2016.

[25] Fedora. https://getfedora.org/pt_BR/, Acesso em: 20 de maio de 2016.

[26] Documentation | iotivity. https://www.iotivity.org/documentation, Acesso em:

05 de julho de 2015.

[27] Architecture overview | iotivity. https://www.iotivity.org/documentation/

architecture-overview, Acesso em: 05 de julho de 2015.

Page 63: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

63

[28] Iot- creating a yocto image for the intel galileo using split layers. https:

//software.intel.com/en-us/blogs/2015/03/04/creating-a-yocto-image-

for-the-intel-galileo-board-using-split-layers, Acesso em: 28 de julho de

2015.

[29] Criar imagem yocto para galileo. http://cear.ufpb.br/~isaac/site/tutoriais/

intel-galileo/yocto-galileo, Acesso em: 04 de fevereiro de 2016.

[30] Building and running mosquitto on intel edison. https://software.intel.com/en-

us/blogs/2015/02/20/building-and-running-mosquitto-mqtt-on-intel-

edison, Acesso em: 10 de janeiro de 2016.

[31] About | tizen. https://www.tizen.org/about, Acesso em: 20 de maio de 2016.

Page 64: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

64

Page 65: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

65

Apêndice A

Códigos criados para o projeto

A.1 Código Galileo

v a r h t t p = r e q u i r e ( ’ h t t p ’ ) ;

v a r s e r v e r = h t t p . c r e a t e S e r v e r ( ) ;

v a r i o = r e q u i r e ( ’ s o c k e t . io ’ ) . l i s t e n ( s e r v e r ) ;

v a r mqt t = r e q u i r e ( ’ mqtt ’ ) ;

v a r clientMQTT = mqt t . c o n n e c t ( ’ mqt t : / / l o c a l h o s t ’ ) ;

i o . on ( ’ c o n n e c t i o n ’ , f u n c t i o n ( s o c k e t ) {

v a r s t a r t 1 = new Date ( ) ;

c o n s o l e . l o g ( ’ u s e r connec t ed ’ ) ;

ClientMQTT . on ( ’ connec t ’ , f u n c t i o n ( ) {

clientMQTT . s u b s c r i b e ( ’ lamp1 ’ ) ;

clientMQTT . s u b s c r i b e ( ’ lamp2 ’ ) ;

} ) ;

v a r end1 = new Date ( ) − s t a r t 1 ;

c o n s o l e . i n f o ( " Tempo g a s t o na conexao : %dms " , end1 ) ;

s o c k e t . on ( ’ lamp1 ’ , f u n c t i o n ( s t a t e ) {

i f ( s t a t e == t r u e ) {

clientMQTT . p u b l i s h ( ’ lamp1 ’ , " on " ) ;

c o n s o l e . l o g ( " lamp1 on ! " ) ;

v a r end2 = new Date ( ) − s t a r t 2 ;

c o n s o l e . i n f o ( " Tempo g a s t o na mensagem : %dms " , end2 ) ;

} e l s e { clientMQTT . p u b l i s h ( ’ lamp1 ’ , " o f f " ) ;

c o n s o l e . l o g ( " lamp1 o f f ! " ) ; } } ) ;

s o c k e t . on ( ’ lamp2 ’ , f u n c t i o n ( s t a t e ) {

i f ( s t a t e == t r u e ) {

clientMQTT . p u b l i s h ( ’ lamp2 ’ , " on " ) ;

} e l s e { clientMQTT . p u b l i s h ( ’ lamp2 ’ , " o f f " ) ;

Page 66: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

66

c o n s o l e . l o g ( " lamp2 o f f ! " ) ; }

} ) ; } ) ;

s e r v e r . l i s t e n ( 3 0 0 0 ) ;

c o n s o l e . l o g ( ’ S e r v e r O n l in e ! ’ ) ;

A.2 Código ESP8266

# i n c l u d e <ESP8266WiFi . h>

# i n c l u d e < P u b S u b C l i e n t . h>

/ / Update t h e s e wi th v a l u e s s u i t a b l e f o r your ne twork .

c o n s t c h a r ∗ s s i d = " TripMate−F32A " ;

c o n s t c h a r ∗ password = " t h i 3 0 1 0 9 1 " ;

c o n s t c h a r ∗ m q t t _ s e r v e r = " 1 0 . 1 0 . 1 0 . 2 7 " ;

W i F i C l i e n t e s p C l i e n t ;

P u b S u b C l i e n t c l i e n t ( e s p C l i e n t ) ;

c h a r msg [ 5 0 ] ;

i n t v a l u e = 0 ;

vo id s e t u p _ w i f i ( ) {

d e l a y ( 1 0 ) ;

/ / We s t a r t by c o n n e c t i n g t o a WiFi ne twork

S e r i a l . p r i n t l n ( ) ;

S e r i a l . p r i n t ( " C o n n e c t i n g t o " ) ;

S e r i a l . p r i n t l n ( s s i d ) ;

WiFi . b e g i n ( s s i d , password ) ;

w h i l e ( WiFi . s t a t u s ( ) != WL_CONNECTED) {

d e l a y ( 5 0 0 ) ;

S e r i a l . p r i n t ( " . " ) ;

}

S e r i a l . p r i n t l n ( " " ) ;

S e r i a l . p r i n t l n ( " WiFi c o n n e c t e d " ) ;

S e r i a l . p r i n t l n ( " IP a d d r e s s : " ) ;

S e r i a l . p r i n t l n ( WiFi . l o c a l I P ( ) ) ;

}

Page 67: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

67

vo id c a l l b a c k ( c h a r ∗ t o p i c , b y t e ∗ pay load , u n s i g n e d i n t l e n g t h ) {

S e r i a l . p r i n t ( " Message a r r i v e d [ " ) ;

S e r i a l . p r i n t ( t o p i c ) ;

c h a r ∗ t o p i c o = t o p i c ;

S e r i a l . p r i n t ( " ] " ) ;

f o r ( i n t i = 0 ; i < l e n g t h ; i ++) {

S e r i a l . p r i n t ( ( c h a r ) p a y l o a d [ i ] ) ;

}

S e r i a l . p r i n t l n ( ) ;

/ / Swi tch on t h e LED i f an 1 was r e c e i v e d as f i r s t c h a r a c t e r

i f ( ( c h a r ) t o p i c [ 4 ] = = ’ 1 ’ ) {

i f ( ( c h a r ) p a y l o a d [ 0 ] == ’ 1 ’ ) {

S e r i a l . p r i n t ( " lamp 1 a c e s a " ) ;

d i g i t a l W r i t e ( 1 2 , HIGH ) ; / / Turn t h e LED on ( Note t h a t LOW i s t h e v o l t a g e l e v e l

/ / b u t a c t u a l l y t h e LED i s on ; t h i s i s b e c a u s e

/ / i t i s a c i v e low on t h e ESP−01)

} e l s e {

S e r i a l . p r i n t ( " lamp1 d e s l i g a d a " ) ;

d i g i t a l W r i t e ( 1 2 , LOW) ; / / Turn t h e LED o f f by making t h e v o l t a g e HIGH

}

} e l s e i f ( ( c h a r ) t o p i c [ 4 ] = = ’ 2 ’ ) {

i f ( ( c h a r ) p a y l o a d [ 0 ] == ’ 1 ’ ) {

S e r i a l . p r i n t ( " lamp2 a c e s a " ) ;

d i g i t a l W r i t e ( 1 3 , HIGH ) ; / / Turn t h e LED on ( Note t h a t LOW i s t h e v o l t a g e l e v e l

/ / b u t a c t u a l l y t h e LED i s on ; t h i s i s b e c a u s e

/ / i t i s a c i v e low on t h e ESP−01)

} e l s e {

S e r i a l . p r i n t ( " lamp 2 d e s l i g a d a " ) ;

d i g i t a l W r i t e ( 1 3 , LOW) ; / / Turn t h e LED o f f by making t h e v o l t a g e HIGH

}

}

}

vo id r e c o n n e c t ( ) {

/ / Loop u n t i l we ’ r e r e c o n n e c t e d

w h i l e ( ! c l i e n t . c o n n e c t e d ( ) ) {

S e r i a l . p r i n t ( " A t t e m p t i n g MQTT c o n n e c t i o n . . . " ) ;

/ / At tempt t o c o n n e c t

i f ( c l i e n t . c o n n e c t ( " ESP8266Cl ien t " ) ) {

Page 68: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

68

S e r i a l . p r i n t l n ( " c o n n e c t e d " ) ;

/ / Once connec t ed , p u b l i s h an announcement . . .

/ / c l i e n t . p u b l i s h ( " p r e s e n c e " , " on " ) ;

/ / . . . and r e s u b s c r i b e

c l i e n t . s u b s c r i b e ( " lamp1 " ) ;

c l i e n t . s u b s c r i b e ( " lamp2 " ) ;

} e l s e {

S e r i a l . p r i n t ( " f a i l e d , r c = " ) ;

S e r i a l . p r i n t ( c l i e n t . s t a t e ( ) ) ;

S e r i a l . p r i n t l n ( " t r y a g a i n i n 5 s e c o n d s " ) ;

/ / Wait 5 s e c o n d s b e f o r e r e t r y i n g

d e l a y ( 5 0 0 0 ) ;

}

}

}

vo id s e t u p ( ) {

pinMode ( 1 2 , OUTPUT ) ;

pinMode ( 1 3 , OUTPUT ) ; / / I n i t i a l i z e t h e BUILTIN_LED p i n as an o u t p u t

S e r i a l . b e g i n ( 1 1 5 2 0 0 ) ;

s e t u p _ w i f i ( ) ;

c l i e n t . s e t S e r v e r ( m q t t _ s e r v e r , 1 8 8 3 ) ;

c l i e n t . s e t C a l l b a c k ( c a l l b a c k ) ;

}

vo id loop ( ) {

i f ( ! c l i e n t . c o n n e c t e d ( ) ) {

r e c o n n e c t ( ) ;

}

c l i e n t . l oop ( ) ;

}

A.3 Código Android

p r i v a t e So cke t mSocket ;

{ t r y {

mSocket = IO . s o c k e t ( " h t t p : / / 1 9 2 . 1 6 8 . 0 . 1 0 1 : 3 0 0 0 " ) ;

} c a t c h ( URISyn taxExcep t ion e ){} }

Page 69: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

69

p r o t e c t e d vo id o n C r e a t e ( Bundle s a v e d I n s t a n c e S t a t e ) {

s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;

s e t C o n t e n t V i e w (R . l a y o u t . a c t i v i t y _ m a i n _ l a y o u t ) ;

mSocket . c o n n e c t ( ) ;

mSocket . on ( " c o n n e c t e d " , onNewMessage ) ;

Swi tch b1 = ( Swi tch ) f indViewById (R . i d . s w i t c h 1 ) ;

i f ( b1 != n u l l ) {

b1 . s e t O n C h e c k e d C h a n g e L i s t e n e r ( t h i s ) ;

}

Swi tch b2 = ( Swi tch ) f indViewById (R . i d . s w i t c h 2 ) ;

i f ( b2 != n u l l ) {

b2 . s e t O n C h e c k e d C h a n g e L i s t e n e r ( t h i s ) ;

}}

p u b l i c vo id c o n n e c t i o n ( ) {

Log . d ( " t a g " , " e x e c u t a n d o a f u nc ao " ) ;

/ / T o a s t . makeText ( MainLayout . t h i s , " Conec tado " , T o a s t . LENGTH_SHORT ) . show ( ) ; }

p u b l i c vo id o n C l i c k ( View b u t t o n ) {

PopupMenu popup = new PopupMenu ( t h i s , b u t t o n ) ;

popup . g e t M e n u I n f l a t e r ( ) . i n f l a t e (R . menu . pop_menu , popup . getMenu ( ) ) ;

popup . s e t O n M e n u I t e m C l i c k L i s t e n e r ( new PopupMenu . OnMenuI t emCl i ckL i s t ene r ( ) {

p u b l i c b o o l e a n onMenuItemClick ( MenuItem i t em ) {

T o a s t . makeText ( MainLayout . t h i s , " C l i c k e d popup menu i t em "+ i t em . g e t T i t l e ( ) ,

T o a s t . LENGTH_SHORT ) . show ( ) ;

r e t u r n t r u e ;

} } ) ;

popup . show ( ) ; }

@Override

p u b l i c vo id onCheckedChanged ( CompoundButton but tonView , b o o l e a n i sChecked ) {

T o a s t . makeText ( t h i s , " Lampada " + but tonView . g e t T e x t ( ) +

( i sChecked ? " Ligada " : " D e s l i g a d a " ) ,

T o a s t . LENGTH_SHORT ) . show ( ) ;

mSocket . emi t ( " t e s t e 1 " ) ; }

p r i v a t e E m i t t e r . L i s t e n e r onNewMessage = new E m i t t e r . L i s t e n e r ( ) {

@Override

p u b l i c vo id c a l l ( O b j e c t . . . a r g s ) {

Log . d ( " t a g " , " e n t r o u no l i s t e n e r " ) ;

/ / T o a s t . makeText ( MainLayout . t h i s , " Conec tado " , T o a s t . LENGTH_SHORT ) . show ( ) ;

c o n n e c t i o n ( ) ; } } ; }

Page 70: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

70

Page 71: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

71

Anexo I

Códigos utilizados

I.1 Código IoTivity

I.1.1 Código Placa

# i n c l u d e < f u n c t i o n a l >

# i n c l u d e < p t h r e a d . h>

# i n c l u d e <mutex >

# i n c l u d e < c o n d i t i o n _ v a r i a b l e >

# i n c l u d e " OCPlatform . h "

# i n c l u d e "OCApi . h "

u s i n g namespace OC;

u s i n g namespace s t d ;

namespace PH = s t d : : p l a c e h o l d e r s ;

i n t g O b s e r v a t i o n = 0 ;

vo id ∗ C h a n g e L i g h t R e p r e s e n t a t i o n ( vo id ∗param ) ;

vo id ∗ hand leS lowResponse ( vo id ∗param , s t d : : s h a r e d _ p t r <OCResourceRequest > pReques t ) ;

/ / S p e c i f i e s where t o n o t i f y a l l o b s e r v e r s o r l i s t o f o b s e r v e r s

/ / f a l s e : n o t i f i e s a l l o b s e r v e r s

/ / t r u e : n o t i f i e s l i s t o f o b s e r v e r s

boo l i s L i s t O f O b s e r v e r s = f a l s e ;

/ / S p e c i f i e s s e c u r e o r non−s e c u r e

/ / f a l s e : non−s e c u r e r e s o u r c e

/ / t r u e : s e c u r e r e s o u r c e

boo l i s S e c u r e = f a l s e ;

/ / / S p e c i f i e s whe the r E n t i t y h a n d l e r i s go ing t o do slow r e s p o n s e o r n o t

boo l i sS lowResponse = f a l s e ;

/ / Forward d e c l a r i n g t h e e n t i t y H a n d l e r

/ / / Th i s c l a s s r e p r e s e n t s a s i n g l e r e s o u r c e named ’ l i g h t R e s o u r c e ’ . Th i s r e s o u r c e has

/ / / two s i m p l e p r o p e r t i e s named ’ s t a t e ’ and ’ power ’

c l a s s L i g h t R e s o u r c e {

p u b l i c :

/ / / Access t h i s p r o p e r t y from a TB c l i e n t

s t d : : s t r i n g m_name ;

Page 72: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

72

boo l m _ s t a t e ;

i n t m_power ;

s t d : : s t r i n g m _ l i g h t U r i ;

OCResourceHandle m_resourceHand le ;

O C R e p r e s e n t a t i o n m_l igh tRep ;

O b s e r v a t i o n I d s m _ i n t e r e s t e d O b s e r v e r s ;

p u b l i c :

/ / / C o n s t r u c t o r

L i g h t R e s o u r c e ( )

: m_name ( " Thiago ’ s l i g h t " ) , m _ s t a t e ( f a l s e ) , m_power ( 0 ) , m _ l i g h t U r i ( " / a / l i g h t " ) ,

m_resourceHand le ( n u l l p t r ) {

/ / I n i t i a l i z e r e p r e s e n t a t i o n

m_l igh tRep . s e t U r i ( m _ l i g h t U r i ) ;

m_l igh tRep . s e t V a l u e ( " s t a t e " , m _ s t a t e ) ;

m_l igh tRep . s e t V a l u e ( " power " , m_power ) ;

m_l igh tRep . s e t V a l u e ( " name " , m_name ) ; }

/∗ Note t h a t t h i s does n o t need t o be a member f u n c t i o n : f o r c l a s s e s you do n o t have

a c c e s s to , you can a c c o m p l i s h t h i s w i th a f r e e f u n c t i o n : ∗ /

/ / / Th i s f u n c t i o n i n t e r n a l l y c a l l s r e g i s t e r R e s o u r c e API .

vo id c r e a t e R e s o u r c e ( ) {

/ / URI of t h e r e s o u r c e

s t d : : s t r i n g re sou rceURI = m _ l i g h t U r i ;

/ / r e s o u r c e t y p e name . In t h i s case , i t i s l i g h t

s t d : : s t r i n g resourceTypeName = " c o r e . l i g h t " ;

/ / r e s o u r c e i n t e r f a c e .

s t d : : s t r i n g r e s o u r c e I n t e r f a c e = DEFAULT_INTERFACE ;

/ / OCResourceProper ty i s d e f i n e d o c s t a c k . h

u i n t 8 _ t r e s o u r c e P r o p e r t y ;

i f ( i s S e c u r e ) {

r e s o u r c e P r o p e r t y = OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE ;

} e l s e {

r e s o u r c e P r o p e r t y = OC_DISCOVERABLE | OC_OBSERVABLE; }

E n t i t y H a n d l e r cb = s t d : : b ind (& L i g h t R e s o u r c e : : e n t i t y H a n d l e r , t h i s , PH : : _1 ) ;

/ / Th i s w i l l i n t e r n a l l y c r e a t e and r e g i s t e r t h e r e s o u r c e .

OCStackResu l t r e s u l t = OCPlatform : : r e g i s t e r R e s o u r c e (

m_resourceHandle , resourceURI , resourceTypeName ,

r e s o u r c e I n t e r f a c e , cb , r e s o u r c e P r o p e r t y ) ;

i f (OC_STACK_OK != r e s u l t ) {

c o u t << " Resource c r e a t i o n was u n s u c c e s s f u l \ n " ; } }

OCStackResu l t c r e a t e R e s o u r c e 1 ( )

{ / / URI o f t h e r e s o u r c e

s t d : : s t r i n g re sou rceURI = " / a / l i g h t 1 " ;

/ / r e s o u r c e t y p e name . In t h i s case , i t i s l i g h t

s t d : : s t r i n g resourceTypeName = " c o r e . l i g h t " ;

/ / r e s o u r c e i n t e r f a c e .

s t d : : s t r i n g r e s o u r c e I n t e r f a c e = DEFAULT_INTERFACE ;

/ / OCResourceProper ty i s d e f i n e d o c s t a c k . h

u i n t 8 _ t r e s o u r c e P r o p e r t y ;

Page 73: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

73

i f ( i s S e c u r e ) {

r e s o u r c e P r o p e r t y = OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE ;

} e l s e {

r e s o u r c e P r o p e r t y = OC_DISCOVERABLE | OC_OBSERVABLE; }

E n t i t y H a n d l e r cb = s t d : : b ind (& L i g h t R e s o u r c e : : e n t i t y H a n d l e r , t h i s , PH : : _1 ) ;

OCResourceHandle r e s H a n d l e ;

/ / Th i s w i l l i n t e r n a l l y c r e a t e and r e g i s t e r t h e r e s o u r c e .

OCStackResu l t r e s u l t = OCPlatform : : r e g i s t e r R e s o u r c e (

r e sHand le , resourceURI , resourceTypeName ,

r e s o u r c e I n t e r f a c e , cb , r e s o u r c e P r o p e r t y ) ;

i f (OC_STACK_OK != r e s u l t )

{ c o u t << " Resource c r e a t i o n was u n s u c c e s s f u l \ n " ; }

r e t u r n r e s u l t ; }

OCResourceHandle g e t H a n d l e ( ) }

r e t u r n m_resourceHand le ; }

/ / P u t s r e p r e s e n t a t i o n .

/ / Ge ts v a l u e s from t h e r e p r e s e n t a t i o n and

/ / u p d a t e s t h e i n t e r n a l s t a t e

vo id p u t ( O C R e p r e s e n t a t i o n& r e p )

{ t r y {

i f ( r e p . g e t V a l u e ( " s t a t e " , m _ s t a t e ) )

{ c o u t << " \ t \ t \ t \ t " << " s t a t e : " << m _ s t a t e << e n d l ;

} e l s e {

c o u t << " \ t \ t \ t \ t " << " s t a t e n o t found i n t h e r e p r e s e n t a t i o n " << e n d l ;

} i f ( r e p . g e t V a l u e ( " power " , m_power ) )

{ c o u t << " \ t \ t \ t \ t " << " power : " << m_power << e n d l ;

} e l s e {

c o u t << " \ t \ t \ t \ t " << " power n o t found i n t h e r e p r e s e n t a t i o n " << e n d l ;

}} c a t c h ( e x c e p t i o n& e )

{ c o u t << e . what ( ) << e n d l ; } }

/ / P o s t r e p r e s e n t a t i o n .

/ / P o s t can c r e a t e new r e s o u r c e o r s im p ly a c t l i k e p u t .

/ / Ge ts v a l u e s from t h e r e p r e s e n t a t i o n and

/ / u p d a t e s t h e i n t e r n a l s t a t e

O C R e p r e s e n t a t i o n p o s t ( O C R e p r e s e n t a t i o n& r e p )

{ s t a t i c i n t f i r s t = 1 ;

/ / f o r t h e f i r s t t ime i t t r i e s t o c r e a t e a r e s o u r c e

i f ( f i r s t )

{ f i r s t = 0 ;

i f (OC_STACK_OK == c r e a t e R e s o u r c e 1 ( ) )

{ O C R e p r e s e n t a t i o n rep1 ;

r ep1 . s e t V a l u e ( " c r e a t e d u r i " , s t d : : s t r i n g ( " / a / l i g h t 1 " ) ) ;

r e t u r n rep1 ; } }

/ / from second t ime onwards i t j u s t p u t s

p u t ( r e p ) ; r e t u r n g e t ( ) ; }

/ / g e t s t h e u p d a t e d r e p r e s e n t a t i o n .

/ / Upda tes t h e r e p r e s e n t a t i o n wi th l a t e s t i n t e r n a l s t a t e b e f o r e

/ / s e n d i n g o u t .

Page 74: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

74

O C R e p r e s e n t a t i o n g e t ( ) {

m_l igh tRep . s e t V a l u e ( " s t a t e " , m _ s t a t e ) ;

m_l igh tRep . s e t V a l u e ( " power " , m_power ) ;

r e t u r n m_l igh tRep ; }

vo id addType ( c o n s t s t d : : s t r i n g& t y p e ) c o n s t

{ OCStackResu l t r e s u l t = OCPlatform : : b indTypeToResource ( m_resourceHandle , t y p e ) ;

i f (OC_STACK_OK != r e s u l t ) {

c o u t << " Bind ing TypeName t o Resource was u n s u c c e s s f u l \ n " ; } }

vo id a d d I n t e r f a c e ( c o n s t s t d : : s t r i n g& i n t e r f a c e ) c o n s t

{ OCStackResu l t r e s u l t = OCPlatform : : b i n d I n t e r f a c e T o R e s o u r c e ( m_resourceHandle , i n t e r f a c e ) ;

i f (OC_STACK_OK != r e s u l t ) {

c o u t << " Bind ing TypeName t o Resource was u n s u c c e s s f u l \ n " ; } }

p r i v a t e :

/ / Th i s i s j u s t a sample i m p l e m e n t a t i o n o f e n t i t y h a n d l e r .

/ / E n t i t y h a n d l e r can be implemented i n s e v e r a l ways by t h e m a n u f a c t u r e r

O C E n t i t y H a n d l e r R e s u l t e n t i t y H a n d l e r ( s t d : : s h a r e d _ p t r <OCResourceRequest > r e q u e s t )

{ c o u t << " \ t I n S e r v e r CPP e n t i t y h a n d l e r : \ n " ;

O C E n t i t y H a n d l e r R e s u l t e h R e s u l t = OC_EH_ERROR;

i f ( r e q u e s t ) {

/ / Get t h e r e q u e s t t y p e and r e q u e s t f l a g

s t d : : s t r i n g r e q u e s t T y p e = r e q u e s t −>g e t R e q u e s t T y p e ( ) ;

i n t r e q u e s t F l a g = r e q u e s t −>g e t R e q u e s t H a n d l e r F l a g ( ) ;

i f ( r e q u e s t F l a g & R e q u e s t H a n d l e r F l a g : : R e q u e s t F l a g )

{ c o u t << " \ t \ t r e q u e s t F l a g : Reques t \ n " ;

a u t o pResponse = s t d : : make_shared <OC : : OCResourceResponse > ( ) ;

pResponse−>s e t R e q u e s t H a n d l e ( r e q u e s t −>g e t R e q u e s t H a n d l e ( ) ) ;

pResponse−>s e t R e s o u r c e H a n d l e ( r e q u e s t −>g e t R e s o u r c e H a n d l e ( ) ) ;

/ / Check f o r que ry params ( i f any )

QueryParamsMap q u e r i e s = r e q u e s t −>g e t Q u e r y P a r a m e t e r s ( ) ;

i f ( ! q u e r i e s . empty ( ) )

{ s t d : : c o u t << " \ nQuery p r o c e s s i n g up to e n t i t y H a n d l e r " << s t d : : e n d l ;

} f o r ( a u t o i t : q u e r i e s ) {

s t d : : c o u t << " Query key : " << i t . f i r s t << " v a l u e : " << i t . second

<< s t d : : e n d l ; }

/ / I f t h e r e q u e s t t y p e i s GET

i f ( r e q u e s t T y p e == "GET" )

{ c o u t << " \ t \ t \ t r e q u e s t T y p e : GET\ n " ;

i f ( i sS lowResponse ) / / Slow r e s p o n s e c a s e

{ s t a t i c i n t s t a r t e d T h r e a d = 0 ;

i f ( ! s t a r t e d T h r e a d ) {

s t d : : t h r e a d t ( handleSlowResponse , ( vo id ∗ ) t h i s , r e q u e s t ) ;

s t a r t e d T h r e a d = 1 ; t . d e t a c h ( ) ; }

e h R e s u l t = OC_EH_SLOW; }

e l s e / / normal r e s p o n s e c a s e . {

pResponse−>s e t E r r o r C o d e ( 2 0 0 ) ;

pResponse−>s e t R e s p o n s e R e s u l t (OC_EH_OK ) ;

pResponse−>s e t R e s o u r c e R e p r e s e n t a t i o n ( g e t ( ) ) ;

i f (OC_STACK_OK == OCPlatform : : sendResponse ( pResponse ) )

Page 75: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

75

{ e h R e s u l t = OC_EH_OK; } } }

e l s e i f ( r e q u e s t T y p e == "PUT" ) {

c o u t << " \ t \ t \ t r e q u e s t T y p e : PUT \ n " ;

O C R e p r e s e n t a t i o n r e p = r e q u e s t −>g e t R e s o u r c e R e p r e s e n t a t i o n ( ) ;

/ / Do r e l a t e d o p e r a t i o n s r e l a t e d t o PUT r e q u e s t

/ / Update t h e l i g h t R e s o u r c e

p u t ( r e p ) ;

pResponse−>s e t E r r o r C o d e ( 2 0 0 ) ;

pResponse−>s e t R e s p o n s e R e s u l t (OC_EH_OK ) ;

pResponse−>s e t R e s o u r c e R e p r e s e n t a t i o n ( g e t ( ) ) ;

i f (OC_STACK_OK == OCPlatform : : sendResponse ( pResponse ) )

{ e h R e s u l t = OC_EH_OK; }

e l s e i f ( r e q u e s t T y p e == "POST " ) {

c o u t << " \ t \ t \ t r e q u e s t T y p e : POST \ n " ;

O C R e p r e s e n t a t i o n r e p = r e q u e s t −>g e t R e s o u r c e R e p r e s e n t a t i o n ( ) ;

/ / Do r e l a t e d o p e r a t i o n s r e l a t e d t o POST r e q u e s t

O C R e p r e s e n t a t i o n r e p _ p o s t = p o s t ( r e p ) ;

pResponse−>s e t R e s o u r c e R e p r e s e n t a t i o n ( r e p _ p o s t ) ;

pResponse−>s e t E r r o r C o d e ( 2 0 0 ) ;

i f ( r e p _ p o s t . h a s A t t r i b u t e ( " c r e a t e d u r i " ) ) {

pResponse−>s e t R e s p o n s e R e s u l t (OC_EH_RESOURCE_CREATED ) ;

pResponse−>se tNewResourceUr i ( r e p _ p o s t . ge tVa lue < s t d : : s t r i n g >(" c r e a t e d u r i " ) ) ; }

e l s e {

pResponse−>s e t R e s p o n s e R e s u l t (OC_EH_OK ) ;

}

i f (OC_STACK_OK == OCPlatform : : sendResponse ( pResponse ) )

{ e h R e s u l t = OC_EH_OK; } }

e l s e i f ( r e q u e s t T y p e == "DELETE " )

{ c o u t << " D e l e t e r e q u e s t r e c e i v e d " << e n d l ; } }

i f ( r e q u e s t F l a g & R e q u e s t H a n d l e r F l a g : : O b s e r v e r F l a g )

{ O b s e r v a t i o n I n f o o b s e r v a t i o n I n f o = r e q u e s t −>g e t O b s e r v a t i o n I n f o ( ) ;

i f ( Obse rveAc t ion : : O b s e r v e R e g i s t e r == o b s e r v a t i o n I n f o . a c t i o n )

{ m _ i n t e r e s t e d O b s e r v e r s . push_back ( o b s e r v a t i o n I n f o . o b s I d ) ; }

e l s e i f ( Obse rveAc t ion : : O b s e r v e U n r e g i s t e r == o b s e r v a t i o n I n f o . a c t i o n )

{ m _ i n t e r e s t e d O b s e r v e r s . e r a s e ( s t d : : remove (

m _ i n t e r e s t e d O b s e r v e r s . b e g i n ( ) ,

m _ i n t e r e s t e d O b s e r v e r s . end ( ) ,

o b s e r v a t i o n I n f o . o b s I d ) ,

m _ i n t e r e s t e d O b s e r v e r s . end ( ) ) ; }

p t h r e a d _ t t h r e a d I d ;

c o u t << " \ t \ t r e q u e s t F l a g : O b s e r v e r \ n " ;

g O b s e r v a t i o n = 1 ;

s t a t i c i n t s t a r t e d T h r e a d = 0 ;

/ / O b s e r v a t i o n happens on a d i f f e r e n t t h r e a d i n C h a n g e L i g h t R e p r e s e n t a t i o n f u n c t i o n .

/ / I f we have n o t c r e a t e d t h e t h r e a d a l r e a d y , we w i l l c r e a t e one h e r e .

i f ( ! s t a r t e d T h r e a d )

{ p t h r e a d _ c r e a t e (& t h r e a d I d , NULL, C h a n g e L i g h t R e p r e s e n t a t i o n , ( vo id ∗ ) t h i s ) ;

s t a r t e d T h r e a d = 1 ; } e h R e s u l t = OC_EH_OK; } }

Page 76: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

76

e l s e { s t d : : c o u t << " Reques t i n v a l i d " << s t d : : e n d l ;

} r e t u r n e h R e s u l t ; } } ;

/ / C h a n g e L i g h t R e p r e s e n t a i o n i s an o b s e r v a t i o n f u n c t i o n ,

/ / which n o t i f i e s any changes t o t h e r e s o u r c e t o s t a c k

/ / v i a n o t i f y O b s e r v e r s

vo id ∗ C h a n g e L i g h t R e p r e s e n t a t i o n ( vo id ∗param )

{ L i g h t R e s o u r c e ∗ l i g h t P t r = ( L i g h t R e s o u r c e ∗ ) param ;

/ / Th i s f u n c t i o n c o n t i n u o u s l y m o n i t o r s f o r t h e changes

w h i l e ( 1 ) { s l e e p ( 3 ) ;

i f ( g O b s e r v a t i o n ) {

/ / I f unde r o b s e r v a t i o n i f t h e r e a r e any changes t o t h e l i g h t r e s o u r c e

/ / we c a l l n o t i f y O b s e r v o r s

/ / For d e m o s t r a t i o n we a r e c h a n g i n g t h e power v a l u e and n o t i f y i n g .

l i g h t P t r −>m_power += 1 0 ;

c o u t << " \ nPower u p d a t e d t o : " << l i g h t P t r −>m_power << e n d l ;

c o u t << " N o t i f y i n g o b s e r v e r s wi th r e s o u r c e h a n d l e : " << l i g h t P t r −>g e t H a n d l e ( ) << e n d l ;

OCStackResu l t r e s u l t = OC_STACK_OK;

i f ( i s L i s t O f O b s e r v e r s ) {

s t d : : s h a r e d _ p t r <OCResourceResponse > r e s o u r c e R e s p o n s e =

{ s t d : : make_shared <OCResourceResponse > ( ) } ;

r e s o u r c e R e s p o n s e −>s e t E r r o r C o d e ( 2 0 0 ) ;

r e s o u r c e R e s p o n s e −>s e t R e s o u r c e R e p r e s e n t a t i o n ( l i g h t P t r −>g e t ( ) , DEFAULT_INTERFACE ) ;

r e s u l t = OCPlatform : : n o t i f y L i s t O f O b s e r v e r s ( l i g h t P t r −>g e t H a n d l e ( ) ,

l i g h t P t r −>m _ i n t e r e s t e d O b s e r v e r s ,

r e s o u r c e R e s p o n s e ) ; }

e l s e {

r e s u l t = OCPlatform : : n o t i f y A l l O b s e r v e r s ( l i g h t P t r −>g e t H a n d l e ( ) ) ;

}

i f (OC_STACK_NO_OBSERVERS == r e s u l t ) {

c o u t << "No More o b s e r v e r s , s t o p p i n g n o t i f i c a t i o n s " << e n d l ;

g O b s e r v a t i o n = 0 ; } } }

r e t u r n NULL; }

vo id ∗ hand leS lowResponse ( vo id ∗param , s t d : : s h a r e d _ p t r <OCResourceRequest > pReques t ) {

/ / Th i s f u n c t i o n h a n d l e s s low r e s p o n s e c a s e

L i g h t R e s o u r c e ∗ l i g h t P t r = ( L i g h t R e s o u r c e ∗ ) param ;

/ / I nd uc e a c a s e f o r s low r e s p o n s e by u s i n g s l e e p

s t d : : c o u t << "SLOW r e s p o n s e " << s t d : : e n d l ;

s l e e p ( 1 0 ) ;

a u t o pResponse = s t d : : make_shared <OC : : OCResourceResponse > ( ) ;

pResponse−>s e t R e q u e s t H a n d l e ( pReques t−>g e t R e q u e s t H a n d l e ( ) ) ;

pResponse−>s e t R e s o u r c e H a n d l e ( pReques t−>g e t R e s o u r c e H a n d l e ( ) ) ;

pResponse−>s e t R e s o u r c e R e p r e s e n t a t i o n ( l i g h t P t r −>g e t ( ) ) ;

pResponse−>s e t E r r o r C o d e ( 2 0 0 ) ;

pResponse−>s e t R e s p o n s e R e s u l t (OC_EH_OK ) ;

/ / S e t t h e slow r e s p o n s e f l a g back t o f a l s e

i sS lowResponse = f a l s e ;

OCPlatform : : sendResponse ( pResponse ) ;

r e t u r n NULL; }

Page 77: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

77

vo id P r i n t U s a g e ( )

{ s t d : : c o u t << s t d : : e n d l ;

s t d : : c o u t << " Usage : s i m p l e s e r v e r < va lue > \ n " ;

s t d : : c o u t << " D e f a u l t − Non−s e c u r e r e s o u r c e and n o t i f y a l l o b s e r v e r s \ n " ;

s t d : : c o u t << " 1 − Non−s e c u r e r e s o u r c e and n o t i f y l i s t o f o b s e r v e r s \ n \ n " ;

s t d : : c o u t << " 2 − S ec u r e r e s o u r c e and n o t i f y a l l o b s e r v e r s \ n " ;

s t d : : c o u t << " 3 − S ec u r e r e s o u r c e and n o t i f y l i s t o f o b s e r v e r s \ n \ n " ;

s t d : : c o u t << " 4 − Non−s e c u r e r e s o u r c e , GET slow r e s p o n s e , n o t i f y a l l o b s e r v e r s \ n " ;

}

s t a t i c FILE∗ c l i e n t _ o p e n ( c o n s t c h a r ∗ /∗ p a t h ∗ / , c o n s t c h a r ∗mode )

{ r e t u r n fopen ( " . / o i c _ s v r _ d b _ s e r v e r . j s o n " , mode ) ; }

i n t main ( i n t a rgc , c h a r ∗ a rgv [ ] )

{ P r i n t U s a g e ( ) ;

O C P e r s i s t e n t S t o r a g e ps { c l i e n t _ o p e n , f r e a d , f w r i t e , f c l o s e , u n l i n k } ;

i f ( a r g c == 1)

{ i s L i s t O f O b s e r v e r s = f a l s e ;

i s S e c u r e = f a l s e ; }

e l s e i f ( a r g c == 2)

{ i n t v a l u e = a t o i ( a rgv [ 1 ] ) ;

s w i t c h ( v a l u e ) {

c a s e 1 :

i s L i s t O f O b s e r v e r s = t r u e ;

i s S e c u r e = f a l s e ;

b r e a k ;

c a s e 2 :

i s L i s t O f O b s e r v e r s = f a l s e ;

i s S e c u r e = t r u e ;

b r e a k ;

c a s e 3 :

i s L i s t O f O b s e r v e r s = t r u e ;

i s S e c u r e = t r u e ;

b r e a k ;

c a s e 4 :

i sS lowResponse = t r u e ;

b r e a k ;

d e f a u l t :

b r e a k ; } } e l s e {

r e t u r n −1;}

/ / C r e a t e P l a t f o r m C o n f i g o b j e c t

P l a t f o r m C o n f i g c f g {

OC : : S e r v i c e T y p e : : InProc ,

OC : : ModeType : : Se rve r ,

" 0 . 0 . 0 . 0 " , / / By s e t t i n g t o " 0 . 0 . 0 . 0 " , i t b i n d s t o a l l a v a i l a b l e i n t e r f a c e s

0 , / / Uses randomly a v a i l a b l e p o r t

OC : : Q u a l i t y O f S e r v i c e : : LowQos ,

&ps } ;

OCPlatform : : C o n f i g u r e ( c f g ) ;

t r y {

Page 78: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

78

/ / C r e a t e t h e i n s t a n c e o f t h e r e s o u r c e c l a s s

/ / ( i n t h i s c a s e i n s t a n c e o f c l a s s ’ L i g h t R e s o u r c e ’ ) .

L i g h t R e s o u r c e myLight ;

/ / Invoke c r e a t e R e s o u r c e f u n c t i o n o f c l a s s l i g h t .

myLight . c r e a t e R e s o u r c e ( ) ;

s t d : : c o u t << " C r e a t e d r e s o u r c e . " << s t d : : e n d l ;

myLight . addType ( s t d : : s t r i n g ( " c o r e . b r i g h t l i g h t " ) ) ;

myLight . a d d I n t e r f a c e ( s t d : : s t r i n g ( LINK_INTERFACE ) ) ;

s t d : : c o u t << " Added I n t e r f a c e and Type " << s t d : : e n d l ;

/ / A c o n d i t i o n v a r i a b l e w i l l f r e e t h e mutex i t i s g iven , t h e n do a non−

/ / i n t e n s i v e b l o c k u n t i l ’ n o t i f y ’ i s c a l l e d on i t . I n t h i s case , s i n c e we

/ / don ’ t e v e r c a l l cv . n o t i f y , t h i s s h o u l d be a non−p r o c e s s o r i n t e n s i v e v e r s i o n

/ / o f w h i l e ( t r u e ) ;

s t d : : mutex b l o c k e r ;

s t d : : c o n d i t i o n _ v a r i a b l e cv ;

s t d : : u n i q u e _ l o c k < s t d : : mutex > l o c k ( b l o c k e r ) ;

s t d : : c o u t <<" Wai t ing " << s t d : : e n d l ;

cv . w a i t ( lock , [ ] { r e t u r n f a l s e ; } ) ;

} c a t c h ( OCException &e ) {

s t d : : c o u t << " OCException i n main : " << e . what ( ) << e n d l ;

} / / No e x p l i c i t c a l l t o s t o p t h e p l a t f o r m .

/ / When OCPlatform : : d e s t r u c t o r i s invoked , i n t e r n a l l y we do p l a t f o r m c l e a n u p

r e t u r n 0 ; }

I.1.2 Código Computador

# i n c l u d e < s t r i n g >

# i n c l u d e <map>

# i n c l u d e < c s t d l i b >

# i n c l u d e < p t h r e a d . h>

# i n c l u d e <mutex >

# i n c l u d e < c o n d i t i o n _ v a r i a b l e >

# i n c l u d e " OCPlatform . h "

# i n c l u d e "OCApi . h "

u s i n g namespace OC;

t y p e d e f s t d : : map< O C R e s o u r c e I d e n t i f i e r , s t d : : s h a r e d _ p t r <OCResource >> DiscoveredResourceMap ;

DiscoveredResourceMap d i s c o v e r e d R e s o u r c e s ;

s t d : : s h a r e d _ p t r <OCResource > c u r R e s o u r c e ;

s t a t i c ObserveType OBSERVE_TYPE_TO_USE = ObserveType : : Observe ;

s t d : : mutex cu rResourceLock ;

c l a s s L i g h t

{ p u b l i c :

boo l m _ s t a t e ;

i n t m_power ;

s t d : : s t r i n g m_name ;

L i g h t ( ) : m _ s t a t e ( f a l s e ) , m_power ( 0 ) , m_name ( " " )

{ } } ;

L i g h t m y l i g h t ;

i n t o b s e r v e _ c o u n t ( )

Page 79: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

79

{ s t a t i c i n t oc = 0 ;

r e t u r n ++oc ; }

vo id onObserve ( c o n s t Heade rOp t ions /∗ h e a d e r O p t i o n s ∗ / , c o n s t O C R e p r e s e n t a t i o n& rep ,

c o n s t i n t& eCode , c o n s t i n t& sequenceNumber )

{ t r y {

i f ( eCode == OC_STACK_OK && sequenceNumber != OC_OBSERVE_NO_OPTION)

{ i f ( sequenceNumber == OC_OBSERVE_REGISTER)

{ s t d : : c o u t << " Observe r e g i s t r a t i o n a c t i o n i s s u c c e s s f u l " << s t d : : e n d l ; }

e l s e i f ( sequenceNumber == OC_OBSERVE_DEREGISTER) {

s t d : : c o u t << " Observe De− r e g i s t r a t i o n a c t i o n i s s u c c e s s f u l " << s t d : : e n d l ; }

s t d : : c o u t << "OBSERVE RESULT:" < < s t d : : e n d l ;

s t d : : c o u t << " \ tSequenceNumber : "<< sequenceNumber << s t d : : e n d l ;

r e p . g e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . g e t V a l u e ( " power " , m y l i g h t . m_power ) ;

r e p . g e t V a l u e ( " name " , m y l i g h t . m_name ) ;

s t d : : c o u t << " \ t s t a t e : " << m y l i g h t . m _ s t a t e << s t d : : e n d l ;

s t d : : c o u t << " \ tpower : " << m y l i g h t . m_power << s t d : : e n d l ;

s t d : : c o u t << " \ tname : " << m y l i g h t . m_name << s t d : : e n d l ;

i f ( o b s e r v e _ c o u n t ( ) == 11)

{ s t d : : cou t <<" C a n c e l l i n g Observe . . . " < < s t d : : e n d l ;

OCStackResu l t r e s u l t = cu rResou rce −>c a n c e l O b s e r v e ( ) ;

s t d : : c o u t << " Cance l r e s u l t : "<< r e s u l t << s t d : : e n d l ;

s l e e p ( 1 0 ) ;

s t d : : c o u t << "DONE"<< s t d : : e n d l ;

s t d : : e x i t ( 0 ) ; } }

e l s e {

i f ( sequenceNumber == OC_OBSERVE_NO_OPTION)

{ s t d : : c o u t << " Observe r e g i s t r a t i o n o r de− r e g i s t r a t i o n a c t i o n i s f a i l e d " << s t d : : e n d l ; }

e l s e {

s t d : : c o u t << " onObserve Response e r r o r : " << eCode << s t d : : e n d l ;

s t d : : e x i t ( −1) ;}}}

c a t c h ( s t d : : e x c e p t i o n& e )

{ s t d : : c o u t << " E x c e p t i o n : " << e . what ( ) << " i n onObserve " << s t d : : e n d l ; } }

vo id onPos t2 ( c o n s t Heade rOp t ions& /∗ h e a d e r O p t i o n s ∗ / ,

c o n s t O C R e p r e s e n t a t i o n& rep , c o n s t i n t eCode )

{ t r y {

i f ( eCode == OC_STACK_OK | | eCode == OC_STACK_RESOURCE_CREATED)

{

s t d : : c o u t << "POST r e q u e s t was s u c c e s s f u l " << s t d : : e n d l ;

i f ( r e p . h a s A t t r i b u t e ( " c r e a t e d u r i " ) ) {

s t d : : c o u t << " \ t U r i o f t h e c r e a t e d r e s o u r c e : "

<< r e p . ge tVa lue < s t d : : s t r i n g >(" c r e a t e d u r i " ) << s t d : : e n d l ;

} e l s e {

r e p . g e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . g e t V a l u e ( " power " , m y l i g h t . m_power ) ;

r e p . g e t V a l u e ( " name " , m y l i g h t . m_name ) ;

s t d : : c o u t << " \ t s t a t e : " << m y l i g h t . m _ s t a t e << s t d : : e n d l ;

s t d : : c o u t << " \ tpower : " << m y l i g h t . m_power << s t d : : e n d l ;

Page 80: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

80

s t d : : c o u t << " \ tname : " << m y l i g h t . m_name << s t d : : e n d l ;

}

i f (OBSERVE_TYPE_TO_USE == ObserveType : : Observe )

s t d : : c o u t << s t d : : e n d l << " Observe i s used . " << s t d : : e n d l << s t d : : e n d l ;

e l s e i f (OBSERVE_TYPE_TO_USE == ObserveType : : O b s e r v e A l l )

s t d : : c o u t << s t d : : e n d l << " O b s e r v e A l l i s used . " << s t d : : e n d l << s t d : : e n d l ;

cu rResou rce −>o b s e r v e (OBSERVE_TYPE_TO_USE , QueryParamsMap ( ) , &onObserve ) ; }

e l s e {

s t d : : c o u t << " onPos t2 Response e r r o r : " << eCode << s t d : : e n d l ;

s t d : : e x i t ( −1) ;}}

c a t c h ( s t d : : e x c e p t i o n& e )

{

s t d : : c o u t << " E x c e p t i o n : " << e . what ( ) << " i n onPos t2 " << s t d : : e n d l ;

}}

vo id onP os t ( c o n s t Heade rOp t ions& /∗ h e a d e r O p t i o n s ∗ / ,

c o n s t O C R e p r e s e n t a t i o n& rep , c o n s t i n t eCode )

{ t r y {

i f ( eCode == OC_STACK_OK | | eCode == OC_STACK_RESOURCE_CREATED)

{ s t d : : c o u t << "POST r e q u e s t was s u c c e s s f u l " << s t d : : e n d l ;

i f ( r e p . h a s A t t r i b u t e ( " c r e a t e d u r i " ) )

{ s t d : : c o u t << " \ t U r i o f t h e c r e a t e d r e s o u r c e : "

<< r e p . ge tVa lue < s t d : : s t r i n g >(" c r e a t e d u r i " ) << s t d : : e n d l ;

} e l s e {

r e p . g e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . g e t V a l u e ( " power " , m y l i g h t . m_power ) ;

r e p . g e t V a l u e ( " name " , m y l i g h t . m_name ) ;

s t d : : c o u t << " \ t s t a t e : " << m y l i g h t . m _ s t a t e << s t d : : e n d l ;

s t d : : c o u t << " \ tpower : " << m y l i g h t . m_power << s t d : : e n d l ;

s t d : : c o u t << " \ tname : " << m y l i g h t . m_name << s t d : : e n d l ;

}

O C R e p r e s e n t a t i o n rep2 ;

s t d : : c o u t << " P o s t i n g l i g h t r e p r e s e n t a t i o n . . . " < < s t d : : e n d l ;

m y l i g h t . m _ s t a t e = t r u e ;

m y l i g h t . m_power = 5 5 ;

r ep2 . s e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r ep2 . s e t V a l u e ( " power " , m y l i g h t . m_power ) ;

cu rResou rce −>p o s t ( rep2 , QueryParamsMap ( ) , &onPos t2 ) ;

} e l s e {

s t d : : c o u t << " on Pos t Response e r r o r : " << eCode << s t d : : e n d l ;

s t d : : e x i t ( −1) ;}}

c a t c h ( s t d : : e x c e p t i o n& e ) {

s t d : : c o u t << " E x c e p t i o n : " << e . what ( ) << " i n o nPos t " << s t d : : e n d l ;

}}

/ / Loca l f u n c t i o n t o p u t a d i f f e r e n t s t a t e f o r t h i s r e s o u r c e

vo id p o s t L i g h t R e p r e s e n t a t i o n ( s t d : : s h a r e d _ p t r <OCResource > r e s o u r c e )

{ i f ( r e s o u r c e ) {

O C R e p r e s e n t a t i o n r e p ;

s t d : : c o u t << " P o s t i n g l i g h t r e p r e s e n t a t i o n . . . " < < s t d : : e n d l ;

Page 81: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

81

m y l i g h t . m _ s t a t e = f a l s e ;

m y l i g h t . m_power = 105 ;

r e p . s e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . s e t V a l u e ( " power " , m y l i g h t . m_power ) ;

/ / Invoke r e s o u r c e ’ s p o s t API wi th rep , que ry map and t h e c a l l b a c k p a r a m e t e r

r e s o u r c e −>p o s t ( rep , QueryParamsMap ( ) , &o nPos t ) ; } }

/ / c a l l b a c k h a n d l e r on PUT r e q u e s t

vo id onPut ( c o n s t Heade rOp t ions& /∗ h e a d e r O p t i o n s ∗ / , c o n s t O C R e p r e s e n t a t i o n& rep , c o n s t i n t eCode )

{ t r y {

i f ( eCode == OC_STACK_OK)

{ s t d : : c o u t << "PUT r e q u e s t was s u c c e s s f u l " << s t d : : e n d l ;

r e p . g e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . g e t V a l u e ( " power " , m y l i g h t . m_power ) ;

r e p . g e t V a l u e ( " name " , m y l i g h t . m_name ) ;

s t d : : c o u t << " \ t s t a t e : " << m y l i g h t . m _ s t a t e << s t d : : e n d l ;

s t d : : c o u t << " \ tpower : " << m y l i g h t . m_power << s t d : : e n d l ;

s t d : : c o u t << " \ tname : " << m y l i g h t . m_name << s t d : : e n d l ;

p o s t L i g h t R e p r e s e n t a t i o n ( c u r R e s o u r c e ) ; }

e l s e {

s t d : : c o u t << " onPut Response e r r o r : " << eCode << s t d : : e n d l ;

s t d : : e x i t ( −1) ;}}

c a t c h ( s t d : : e x c e p t i o n& e ) {

s t d : : c o u t << " E x c e p t i o n : " << e . what ( ) << " i n onPut " << s t d : : e n d l ;

}}

/ / Loca l f u n c t i o n t o p u t a d i f f e r e n t s t a t e f o r t h i s r e s o u r c e

vo id p u t L i g h t R e p r e s e n t a t i o n ( s t d : : s h a r e d _ p t r <OCResource > r e s o u r c e )

{ i f ( r e s o u r c e ) {

O C R e p r e s e n t a t i o n r e p ;

s t d : : c o u t << " P u t t i n g l i g h t r e p r e s e n t a t i o n . . . " < < s t d : : e n d l ;

m y l i g h t . m _ s t a t e = t r u e ;

m y l i g h t . m_power = 1 5 ;

r e p . s e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . s e t V a l u e ( " power " , m y l i g h t . m_power ) ;

/ / Invoke r e s o u r c e ’ s p u t API wi th rep , que ry map and t h e c a l l b a c k p a r a m e t e r

r e s o u r c e −>p u t ( rep , QueryParamsMap ( ) , &onPut ) ; } }

/ / C a l l b a c k h a n d l e r on GET r e q u e s t

vo id onGet ( c o n s t Heade rOp t ions& /∗ h e a d e r O p t i o n s ∗ / , c o n s t O C R e p r e s e n t a t i o n& rep , c o n s t i n t eCode )

{ t r y {

i f ( eCode == OC_STACK_OK)

{ s t d : : c o u t << "GET r e q u e s t was s u c c e s s f u l " << s t d : : e n d l ;

s t d : : c o u t << " Resource URI : " << r e p . g e t U r i ( ) << s t d : : e n d l ;

r e p . g e t V a l u e ( " s t a t e " , m y l i g h t . m _ s t a t e ) ;

r e p . g e t V a l u e ( " power " , m y l i g h t . m_power ) ;

r e p . g e t V a l u e ( " name " , m y l i g h t . m_name ) ;

s t d : : c o u t << " \ t s t a t e : " << m y l i g h t . m _ s t a t e << s t d : : e n d l ;

s t d : : c o u t << " \ tpower : " << m y l i g h t . m_power << s t d : : e n d l ;

s t d : : c o u t << " \ tname : " << m y l i g h t . m_name << s t d : : e n d l ;

p u t L i g h t R e p r e s e n t a t i o n ( c u r R e s o u r c e ) ;

Page 82: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

82

} e l s e {

s t d : : c o u t << "onGET Response e r r o r : " << eCode << s t d : : e n d l ;

s t d : : e x i t ( −1) ;}}

c a t c h ( s t d : : e x c e p t i o n& e ) {

s t d : : c o u t << " E x c e p t i o n : " << e . what ( ) << " i n onGet " << s t d : : e n d l ;

}}

/ / Loca l f u n c t i o n t o g e t r e p r e s e n t a t i o n o f l i g h t r e s o u r c e

vo id g e t L i g h t R e p r e s e n t a t i o n ( s t d : : s h a r e d _ p t r <OCResource > r e s o u r c e )

{ i f ( r e s o u r c e ) {

s t d : : c o u t << " G e t t i n g L i g h t R e p r e s e n t a t i o n . . . " < < s t d : : e n d l ;

/ / Invoke r e s o u r c e ’ s g e t API wi th t h e c a l l b a c k p a r a m e t e r

QueryParamsMap t e s t ;

r e s o u r c e −>g e t ( t e s t , &onGet ) ; } }

/ / C a l l b a c k t o found r e s o u r c e s

vo id foundResou rce ( s t d : : s h a r e d _ p t r <OCResource > r e s o u r c e )

{ s t d : : c o u t << " In foundResou rce \ n " ;

s t d : : s t r i n g re sou rceURI ;

s t d : : s t r i n g h o s t A d d r e s s ;

t r y {{

s t d : : l ock_gua rd < s t d : : mutex > l o c k ( cu rResourceLock ) ;

i f ( d i s c o v e r e d R e s o u r c e s . f i n d ( r e s o u r c e −> u n i q u e I d e n t i f i e r ( ) ) == d i s c o v e r e d R e s o u r c e s . end ( ) ) {

s t d : : c o u t << " Found r e s o u r c e " << r e s o u r c e −> u n i q u e I d e n t i f i e r ( ) <<

" f o r t h e f i r s t t ime on s e r v e r wi th ID : "<< r e s o u r c e −>s i d () < < s t d : : e n d l ;

d i s c o v e r e d R e s o u r c e s [ r e s o u r c e −> u n i q u e I d e n t i f i e r ( ) ] = r e s o u r c e ;

} e l s e {

s t d : : cou t <<" Found r e s o u r c e "<< r e s o u r c e −> u n i q u e I d e n t i f i e r ( ) << " a g a i n !" < < s t d : : e n d l ; }

i f ( c u r R e s o u r c e ) {

s t d : : c o u t << " Found a n o t h e r r e s o u r c e , i g n o r i n g "<< s t d : : e n d l ;

r e t u r n ; } }

/ / Do some o p e r a t i o n s wi th r e s o u r c e o b j e c t .

i f ( r e s o u r c e ) {

s t d : : cou t <<"DISCOVERED Resource :" < < s t d : : e n d l ;

/ / Get t h e r e s o u r c e URI

re sou rceURI = r e s o u r c e −> u r i ( ) ;

s t d : : c o u t << " \ tURI o f t h e r e s o u r c e : " << re sou rceURI << s t d : : e n d l ;

/ / Get t h e r e s o u r c e h o s t a d d r e s s

h o s t A d d r e s s = r e s o u r c e −>h o s t ( ) ;

s t d : : c o u t << " \ t H o s t a d d r e s s o f t h e r e s o u r c e : " << h o s t A d d r e s s << s t d : : e n d l ;

/ / Get t h e r e s o u r c e t y p e s

s t d : : c o u t << " \ t L i s t o f r e s o u r c e t y p e s : " << s t d : : e n d l ;

f o r ( a u t o &r e s o u r c e T y p e s : r e s o u r c e −>g e t R e s o u r c e T y p e s ( ) )

{ s t d : : c o u t << " \ t \ t " << r e s o u r c e T y p e s << s t d : : e n d l ; }

/ / Get t h e r e s o u r c e i n t e r f a c e s

s t d : : c o u t << " \ t L i s t o f r e s o u r c e i n t e r f a c e s : " << s t d : : e n d l ;

f o r ( a u t o &r e s o u r c e I n t e r f a c e s : r e s o u r c e −> g e t R e s o u r c e I n t e r f a c e s ( ) )

{ s t d : : c o u t << " \ t \ t " << r e s o u r c e I n t e r f a c e s << s t d : : e n d l ;

} i f ( r e sou rceURI == " / a / l i g h t " ) {

c u r R e s o u r c e = r e s o u r c e ;

Page 83: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

83

/ / C a l l a l o c a l f u n c t i o n which w i l l i n t e r n a l l y i nvo ke g e t API on t h e r e s o u r c e p o i n t e r

g e t L i g h t R e p r e s e n t a t i o n ( r e s o u r c e ) ; } }

e l s e {

/ / Resource i s i n v a l i d

s t d : : c o u t << " Resource i s i n v a l i d " << s t d : : e n d l ; }

} c a t c h ( s t d : : e x c e p t i o n& e ) {

s t d : : c e r r << " E x c e p t i o n i n foundResou rce : "<< e . what ( ) << s t d : : e n d l ;

}}

vo id p r i n t U s a g e ( ) {

s t d : : c o u t << s t d : : e n d l ;

s t d : : c o u t << "−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n " ;

s t d : : c o u t << " Usage : s i m p l e c l i e n t <ObserveType >" << s t d : : e n d l ;

s t d : : c o u t << " ObserveType : 1 − Observe " << s t d : : e n d l ;

s t d : : c o u t << " ObserveType : 2 − O b s e r v e A l l " << s t d : : e n d l ;

s t d : : c o u t << "−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n \ n " ;

}

vo id c h e c k O b s e r v e r V a l u e ( i n t v a l u e )

{ i f ( v a l u e == 1){

OBSERVE_TYPE_TO_USE = ObserveType : : Observe ;

s t d : : c o u t << "<=== S e t t i n g ObserveType t o Observe === >\n \ n " ;

} e l s e i f ( v a l u e == 2){

OBSERVE_TYPE_TO_USE = ObserveType : : O b s e r v e A l l ;

s t d : : c o u t << "<=== S e t t i n g ObserveType t o O b s e r v e A l l === >\n \ n " ;

} e l s e {

s t d : : c o u t << "<=== I n v a l i d ObserveType s e l e c t e d . "

<<" S e t t i n g ObserveType t o Observe === >\n \ n " ; } }

s t a t i c FILE∗ c l i e n t _ o p e n ( c o n s t c h a r ∗ /∗ p a t h ∗ / , c o n s t c h a r ∗mode )

{ r e t u r n fopen ( " . / o i c _ s v r _ d b _ c l i e n t . j s o n " , mode ) ; }

i n t main ( i n t a rgc , c h a r ∗ a rgv [ ] ) {

s t d : : o s t r i n g s t r e a m r e q u e s t U R I ;

O C P e r s i s t e n t S t o r a g e ps { c l i e n t _ o p e n , f r e a d , f w r i t e , f c l o s e , u n l i n k } ;

t r y {

p r i n t U s a g e ( ) ;

i f ( a r g c == 1)

{ s t d : : c o u t << "<=== S e t t i n g ObserveType t o Observe and C o n n e c t i v i t y T y p e t o IP === >\n \ n " ;

} e l s e i f ( a r g c == 2){

c h e c k O b s e r v e r V a l u e ( s t d : : s t o i ( a rgv [ 1 ] ) ) ; }

e l s e {

s t d : : c o u t << "<=== I n v a l i d number o f command l i n e a rgumen t s === >\n \ n " ;

r e t u r n −1;}}

c a t c h ( s t d : : e x c e p t i o n& ) {

s t d : : c o u t << "<=== I n v a l i d i n p u t a rgumen t s === >\n \ n " ;

r e t u r n −1;}

/ / C r e a t e P l a t f o r m C o n f i g o b j e c t

P l a t f o r m C o n f i g c f g {

OC : : S e r v i c e T y p e : : InProc ,

OC : : ModeType : : Both ,

" 0 . 0 . 0 . 0 " ,

Page 84: UNIVERSIDADE DE SÃO PAULO - tcc.sc.usp.br · Elon Musk. Resumo Considerando o grande crescimento tanto das discussões quanto das aplicações envol- ... resposta além de ser compatível

84

0 ,

OC : : Q u a l i t y O f S e r v i c e : : LowQos ,

&ps

} ;

OCPlatform : : C o n f i g u r e ( c f g ) ;

t r y {

/ / makes i t so t h a t a l l b o o l e a n v a l u e s a r e p r i n t e d as ’ t r u e / f a l s e ’ i n t h i s s t r e a m

s t d : : c o u t . s e t f ( s t d : : i o s : : b o o l a l p h a ) ;

/ / F ind a l l r e s o u r c e s

r e q u e s t U R I << OC_RSRVD_WELL_KNOWN_URI ; / / << "? r t = c o r e . l i g h t " ;

OCPlatform : : f i n d R e s o u r c e ( " " , r e q u e s t U R I . s t r ( ) ,

CT_DEFAULT, &foundResou rce ) ;

s t d : : cou t << " F i n d i n g Resource . . . " << s t d : : e n d l ;

/ / F ind r e s o u r c e i s done t w i c e so t h a t we d i s c o v e r t h e o r i g i n a l r e s o u r c e s a second t ime .

/ / These r e s o u r c e s w i l l have t h e same u n i q u e i d e n t i f i e r ( y e t be d i f f e r e n t o b j e c t s ) , so t h a t

/ / we can v e r i f y / show t h e d u p l i c a t e −c h e c k i n g code i n foundResou rce ( above ) ;

OCPlatform : : f i n d R e s o u r c e ( " " , r e q u e s t U R I . s t r ( ) ,

CT_DEFAULT, &foundResou rce ) ;

s t d : : cou t << " F i n d i n g Resource f o r second t ime . . . " << s t d : : e n d l ;

/ / A c o n d i t i o n v a r i a b l e w i l l f r e e t h e mutex i t i s g iven , t h e n do a non−

/ / i n t e n s i v e b l o c k u n t i l ’ n o t i f y ’ i s c a l l e d on i t . I n t h i s case , s i n c e we

/ / don ’ t e v e r c a l l cv . n o t i f y , t h i s s h o u l d be a non−p r o c e s s o r i n t e n s i v e v e r s i o n

/ / o f w h i l e ( t r u e ) ;

s t d : : mutex b l o c k e r ;

s t d : : c o n d i t i o n _ v a r i a b l e cv ;

s t d : : u n i q u e _ l o c k < s t d : : mutex > l o c k ( b l o c k e r ) ;

cv . w a i t ( l o c k ) ;

} c a t c h ( OCException& e ) {

o c l o g ( ) << " E x c e p t i o n i n main : "<<e . what ( ) ; }

r e t u r n 0 ; }