Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Campinas
Relatorio do projeto:
Central de comunicacoes
e controle
domotico.
IA351-D: Topicos
em Sistemas
Alunos
Conteudo
Resumo
Introduca o
Motivaca o
3
3
4
4
4
.
.
.
.
.
5
5
5
6
7
7
.
.
.
.
.
8
8
8
9
9
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Implementaca o do projeto
8.1 Diagrama da arquitetura do projeto . . . . . . . . . . . . . . . . . .
8.2 Instalaca o do servidor web . . . . . . . . . . . . . . . . . . . . . . . .
8.2.1 Configuraca o de servidor Web Apache . . . . . . . . . . . .
8.2.2 Configuraca o de PHP- Hypertext Preprocessor . . . . . . . .
8.3 Instalaca o e implementaca o do servidor VoIP . . . . . . . . . . . . .
8.3.1 Instalaca o de Asterisk em Raspberry pi com Raspbian . . .
8.3.2 Configuraca o de Asterisk . . . . . . . . . . . . . . . . . . . .
8.3.3 Aplicativos VoIP para smartphone . . . . . . . . . . . . . . .
8.4 Interfaz web-Raspberry-Arduino . . . . . . . . . . . . . . . . . . . .
8.4.1 Diagrama de variaveis para interligaca o entre o entorno
web, Raspberry e Arduino . . . . . . . . . . . . . . . . . . . .
8.4.2 Comunicaca o via porta serial . . . . . . . . . . . . . . . . . .
8.4.3 Comunicaca o via interface Ethernet . . . . . . . . . . . . . .
8.4.4 Programaca o do cliente em Arduino UNO . . . . . . . . . .
8.5 Construca o do site web . . . . . . . . . . . . . . . . . . . . . . . . . .
8.5.1 Entorno de controle domotico
. . . . . . . . . . . . . . . . . .
9
9
11
11
11
11
11
12
12
13
13
15
15
15
16
16
17
8.6
8.7
8.8
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
17
19
20
20
21
21
21
Resumo
Introduca o
que qualquer ser humano deseja. E o que parece inacreditavel esta se tornando
uma necessidade vital a qualquer morador e um excelente fator de economia.
Transformar casas em confortaveis refugios
capazes de oferecer seguranca e eco
nomia de custos e uma das vantagens da automaca o residencial. O que antes
parecia ser um privilegio, comeca a se difundir nos empreendimentos residenciais
de alto nvel. Neste sentido, o assunto sera tratado como uma realidade inevitavel
e que representara uma mudanca incontestavel nos atuais projetos de construca o,
nos profissionais e na forma de utilizaca o do lar realmente como proporcionador
de comodidade e satisfaca o. Neste trabalho se mostra um caso de uso especifico de implementaca o de uma central de comunicaca o e controle domotico
de
baixo custo que permite tanto a comunicaca o de voz sobre IP para comunicaca o
dentro de um predio ou casa e o controle de dispositivos de domotica
desse
sistemas.
Motivaca o
muito pouco flexveis, e que tornam o aumento das suas capacidades inicialmente
projetadas muito difcil e dispendioso. Desde ha alguns anos para ca, com a
constante evoluca o da electronica
no campo dos sensores/atuadores e das redes
de comunicacoes
de dados, e -nos possvel, agora, dispor de uma grande variedade
de equipamentos com precos competitivos e com a capacidade de se integrarem
numa rede de comunicaca o.
Tudo isto, juntamente com a massificaca o dos servicos de Internet de banda
larga e a evoluca o das redes moveis
de alto debito 3G, UMTS e HSDPA respecti
vamente (que disponibilizam acesso a` Internet em qualquer lugar ), abre caminho
a` possibilidade de controlar um edifcio em qualquer lugar e a qualquer hora,
dispondo de um acesso a` Internet e de um Web browser. Deste modo, com um
sistema de controlo baseado na Web, e possibilitada aos utilizadores uma elevada
autonomia no que respeita ao controlar um edifcio a` distancia.
4.1
Hardware
4.2
Software
5
5.1
O Arduino UNO e ideal para iniciar os aprendizados com Arduino por ser mais
barato e, ainda, possuir portas suficientes para a realizaca o de trabalhos com
pouca complexidade. As principais caractersticas do Arduino UNO as vemos na
seguente tabela:
6.1
Sensores
Sensores sao dispositivos que trabalham com medidas de grandezas fsicas, como:
temperatura, pressao, presenca, umidade, intensidade luminosa, entre outros. As
grandezas medidas pelos sensores sao combinadas a fim de obter informacoes
sobre o meio fsico, onde estao presentes. Em geral os sensores atuam transformando partes de uma grandeza fsica normalmente em um sinal eletrico, que por
sua vez pode ser interpretado por certos equipamentos eletronicos.
Em outras pa
lavras, sensores sao componentes eletronicos
que permitem que um equipamento
eletronico
possa interagir com o mundo.
6.1.1
6.1.2
Caractersticas:
Calibrada diretamente em graus Celsius (centgrados).
Lineal + 10,0 mV / C factor de escala.
0,5 C exactitud regulable (a +25 C).
6.2
Atuadores
Servomotor SG90
Especificacoes:
7
7.1
7.1.1
O JavaScript e uma linguagem de programaca o interpretada, desenvolvida, inicialmente, pela Netscape em 1995, e e , na maioria das vezes, usada para o desenvolvimento de aplicacoes
Web que executam do lado do cliente.
O Javascript permite adicionar as paginas Web maior funcionalidade e interaca o
ao HTML. Face a` necessidade de uma nova abordagem para introduzir alguma
dinamica num conteudo
que era estatico ate a` data, surgiu JavaScript. no nosso
caso o Java Script foi usado como intermediario entre o HTML e o Python para
receber as peticoes
do site para ser processadas na Raspberry.
7.1.2
AJAX
PHP
tem uma sintaxe semelhante a` do C/C++ e do JAVA, e pode fazer tudo o que uma
aplicaca o CGI era capaz de fazer ate agora, como recolher dados de formularios
e interagir com bases de dados. Os blocos de codigo
PHP sao embutidos di
retamente no codigo
HTML e sao executados no servidor quando este recebe o
7.2
Tecnologia VoIP
8
8.1
Implementaca o do projeto
Diagrama da arquitetura do projeto
Sensor LM35
ARDUINO
Serial - USB
Telefone IP
ETH
SMARTPHONE
ETH
RASPBERRY
ETH
INTERNET
SWITCH ROTEADOR
ETH
ARDUINO COM
MODULO ETH
ETH
Telefone IP
com cmera
Circuito dimmer
acender uma
lampada
Rele para
acender uma
lampada
8.2
8.2.1
Apache e um popular Web Server que pode ser instalado na Raspberry Pi para
permitir Server paginas web. Apache pode server arquivos HTML sobre HTTP,
e usar modulos
adicionais que podem agregar funcionalidade dinamicas usando
comando no terminal:
sudo apt-get install php5 libapache2-mod-php5 -y
Veja o codigo PHP desenvolvido fornecido do Servidor para os cliente esta
referenciado no Anexo 2.
8.3
8.3.1
8.3.2
Configuraca o de Asterisk
8.3.3
8.4
8.4.1
Interfaz web-Raspberry-Arduino
Diagrama de variaveis para interligaca o entre o entorno web, Raspberry
e Arduino
O seguinte diagrama mostra as variaveis para a interligaca o entre todos os componentes do sistema, detalha-se nesses pontos se as variaveis sao de sada ou entrada
em cada caso. Alem disso, no grafico se mostra a via de comunicaca o entre o Raspberry (phyton) e diferentes componentes, onde ele e um intermediario entre os
entornos web e os componentes implementados nos sitema. Essas variaveis foram implementadas no programas desenvolvidos em python, Html e arduino, o
qual e anexado neste documento.
Circuito rele
Circuito tiristor
(pin 2)
(pin 3)
1..*
LINK VIA ETH
Phyton
Sensor de temperatura DHT11 (GPIO 23)
Porta da garagem
(GPIO 24)
Luz sala
(GPIO 25)
Luz patio
(GPIO 26)
Luz cozinha
(GPIO 27)
Porta principal
(GPIO 22)
Java Script
luz banheiro
luz sala
luz ptio
luz cozinha
sensor temperatura
sensor temp umidade
servo motor
sensores LDR
(IN)
(IN)
(IN)
(IN)
(IN)
(IN)
(IN)
(OUT)
(OUT)
(OUT)
(OUT)
(OUT)
(OUT)
(OUT)
8.4.2
A Comunicaca o com o modulo Arduino com a Raspberry pode ser feita de diferentes jeitos a abordagem para captar as informacoes
dos sensores vindos da placa
de Arduino foi disponibilizada por via serial a pesar que tambem pode ser feita
a traves de Ethernet usando Socket, mas esta abordagem foi feita para a ativaca o
das portas, e focos a traves e vai ser explicada na proxima
seca o. Os dados dos
sensores captadas pelo Arduino sao enviados para o servidor (Raspberry Pi) e sao
processadas constantemente. Para isto se implementou um codigo
em Python
que vai ter um loop que esta recebendo os dados de forma serial e adicionando
as informacoes
Python que processa as
no Html a traves do JavaScript. O codigo
informacoes
esta no Anexo 3.
8.4.3
no servidor
esta no Anexo 4.
8.4.4
8.5
(azul), nessa lampada pode-se controlar o brilho proporcionalmente ao deslocamento do botao azul.
Sala: tem-se dois botoes,
o do meio e para a ligaca o da lampada e o botao
8.5.2
No entorno de monitoramento mostra-se os componentes detalhados anteriormente, neste entorno pode-se observar o estado de cada elemento. Para o caso
das lampadas, tem-se os crculos vermelhos que mudaram de cor para amarelo
se estas estivessem acendidas. Para o caso da porta, esta mudara de cor para vermelho se fosse aberta. Na cozinha, tem-se dois sensores (fumo e gas) que serao
inicialmente substituidas com sensores de luz (LDR), quer dizer que, si tiver um
sinal de luz em qualquer dos pontos, a cor desses componentes serao mudados
para vermelho.
8.6
LM35
Foi conveniente a instalaca o do sensor LM35 sob arduino posto que este tem
varias entradas analogicas
e ja nao precisaremos um conversor analogo-digital.
8.6.2
8.7
8.7.1
8.7.2
8.8
8.8.1
para proposito
sera usado o pin 7 do arduino.
Figura 22: Diagrama para a ligaca o de uma lampada usando um rele com 110 ou
220 V.
220 V.
Anexo 1 - Codigo
HTML
<! doctype html>
<head>
<meta c h a r s e t = u t f 8>
<meta http equiv=XUACompatible c o n t e n t =IE=edge , chrome=1>
<title
<meta
<meta
<meta
. switch shadow + l a b e l : b e f o r e {
r i g h t : 1px ;
backgroundc o l o r : # f 1 f 1 f 1 ;
border r a d i u s : 30px ;
transition : a l l 0.4 s ;
}
. switch shadow + l a b e l : a f t e r {
width : 32px ;
backgroundc o l o r : #FE9A2E ;
border r a d i u s : 100%;
boxshadow : 0 2px 5px rgba ( 0 , 0 , 0 , 0 . 3 ) ;
transition : a l l 0.4 s ;
}
. switch shadow : checked + l a b e l : b e f o r e {
backgroundc o l o r : #8 ce196 ;
}
. switch shadow : checked + l a b e l : a f t e r {
t r a n s f o r m : t r a n s l a t e X ( 3 0 px ) ;
}
{
webkit box s i z i n g : border box ;
mozbox s i z i n g : border box ;
box s i z i n g : border box ;
}
body {
background : #2 b2e31 ;
}
. slider {
width : 200 px ;
margin : 100 px auto ;
f o n t s i z e : 18px ;
f o n t f a m i l y : A r i a l , H e l v e t i c a , sans s e r i f ;
color : #000099;
}
i np ut [ type=range ] {
webkit appearance : none ;
webkit tap h i g h l i g h t c o l o r : rgba ( 2 5 5 , 2 5 5 , 2 5 5 , 0 ) ;
width : 100%;
h e i g h t : 20px ;
margin : 0 ;
border : none ;
i np ut [ type=range ] : : msthumb {
width : 40px ;
h e i g h t : 18px ;
border r a d i u s : 12px ;
border : 0 ;
backgroundimage : l i n e a r g r a d i e n t ( t o bottom , #529 de1 0 , #245 e 8 f 100%)
}
//
body , td , th {
c o l o r : #FFFFFF ;
f o n t s i z e : 24px ;
}
. componentes {
f o n t s i z e : 10px ;
f o n t f a m i l y : A r i a l , H e l v e t i c a , sans s e r i f ;
}
</ s t y l e >
</head>
<body>
<! Google Tag Manager >
<n o s c r i p t ><i f r a m e s r c = / /www. googletagmanager . com / ns . html ? id=GTMPZWSZ2
h e i g h t =0 width =0 s t y l e = d i s p l a y : none ; v i s i b i l i t y : hidden ></ iframe ></
< s c r i p t >( f u n c t i o n (w, d , s , l , i ) {w[ l ]=w[ l ] | | [ ] ; w[ l ] . push ( { gtm . s t a r t :
new Date ( ) . getTime ( ) , event : gtm . j s } ) ; var f=d . getElementsByTagName ( s ) [ 0
j =d . c r e a t e E l e m e n t ( s ) , dl= l ! = dataLayer ? & l =+ l : ; j . async=t r u e ; j . s r c =
/ /www. googletagmanager . com / gtm . j s ? id =+ i +dl ; f . parentNode . i n s e r t B e f o r e (
} ) ( window , document , s c r i p t , dataLayer , GTMPZWSZ2 ) ; < / s c r i p t >
<! End Google Tag Manager >
<header ><strong >Sistema de c o n t r o l e domotico </ strong >
<div c l a s s =pubnub></ div>
</ header >
< t a b l e width =895 h e i g h t =581 border =1 BACKGROUND= p i s o 1 . j p g >
<t r >
<td width =208 h e i g h t =130>< t a b l e border =0>
<t r >
<td width =197 c l a s s = s l i d e r >Banheiro </ td>
</ t r >
<t r >
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
</ t r >
<t r >
<td><c e n t e r ><div c l a s s = s w i t c h c o n t a i n e r >
<in put id = l u z b a n h e i r o c l a s s = switch switch shadow type=checkbox
< l a b e l f o r = l u z b a n h e i r o ></ l a b e l >
</ div><c e n t e r ></ td>
</ t r >
<t r >
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
</ t r >
</ t a b l e ></ td>
<td width =301 rowspan=2>< t a b l e width =301 h e i g h t =190 border =
< t r h e i g h t=33%>
<td width=64>  ; < / td>
<td width =200 c l a s s = s l i d e r >Dormitorio </ td>
<td width=23>  ; < / td>
</ t r >
< t r h e i g h t=33%>
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
<td><c e n t e r >< l a b e l f o r = l u z d o r m i t o r i o c l a s s = b r i g h t n e s s f a >
<input id = l u z d o r m i t o r
</ l a b e l ></ c e n t e r ></ td>
<td>  ; < / td>
</ t r >
< t r h e i g h t=34%>
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
</ t a b l e ></ td>
<td c o l s p a n =2 rowspan=2>< t a b l e width =342 h e i g h t =199 border =
<t r >
<td width =200 c l a s s = s l i d e r > Sala </ td>
<td width=120>  ; < / td>
<td width =117 b g c o l o r =#0000FF>< c e n t e r ><div c l a s s = s w i t c h c o
<in put id = v e n t i l a d o r s a l a c l a s s = switch switch shadow type=checkb
< l a b e l f o r = v e n t i l a d o r s a l a ></ l a b e l >
</ div ></ c e n t e r ></ td>
</ t r >
<t r >
<td>  ; < / td>
<td>  ; < / td>
<td c l a s s =componentes> V e n t i l a d o r </ td>
</ t r >
<t r >
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
<td>  ; < / td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
<td><c e n t e r ><div c l a s s = s w i t c h c o n t a i n e r >
<in put id = l u z s a l a c l a s s = switch switch shadow type=checkbox>
< l a b e l f o r = l u z s a l a ></ l a b e l >
</ div ></ c e n t e r ></ td>
<td>  ; < / td>
</ t r >
<t r >
<td>  ; < / td>
</ div>
<div>
</ div>
</ l a b e l >
<div>
<! f l i c k e r i n g l i g h t >
<div c l a s s = c a p t i o n > F i r e p l a c e <
< l a b e l f o r = l i g h t cave c l a s s =
<input id = f i r e p l a c e ty
</ l a b e l >
</ div>
</ s e c t i o n >
</ s e c t i o n >
</ s e c t i o n >
<f o o t e r >
</ f o o t e r >
< s c r i p t s r c = h t t p : / / cdn . pubnub . com / pubnub 3 . 7 . 1 1 . min . j s ></ s c r i p t >
< s c r i p t s r c = j s / app . j s ></ s c r i p t >
</body>
</ html>
Anexo 2 - Codigo
Java Script
( function ( ) {
var s e t t i n g s = {
channel : pi house ,
p u b l i s h k e y : demo ,
s u b s c r i b e k e y : demo
};
var pubnub = PUBNUB( s e t t i n g s ) ;
var
var
var
var
pubnub . s u b s c r i b e ( {
channel : s e t t i n g s . channel ,
c a l l b a c k : f u n c t i o n (m) {
i f (m. temperature ) {
f i r e p l a c e . a d d E v e n t L i s t e n e r ( change , f u n c t i o n ( e ) {
publishUpdate ( { item : f i r e p l a c e , b r i g h t n e s s : + t h i s . valu
} , false );
})();
Anexo 3 - Codigo
Python
# Using PWM with RPi . GPIO
import RPi . GPIO as GPIO
import time
import sys
from pubnub import Pubnub
import s e r i a l
GPIO . setmode ( GPIO .BCM)
PIN LIVING = 4
PIN PORCH = 17
PIN FIREPLACE = 27
PIN GARAGEM =18
GPIO . setup ( PIN LIVING , GPIO .OUT)
GPIO . setup ( PIN PORCH , GPIO .OUT)
GPIO . setup ( PIN FIREPLACE , GPIO .OUT)
GPIO . setup (PIN GARAGEM, GPIO .OUT)
#PIO . a d d e v e n t d e t e c t ( 2 1 , GPIO . RISING )
#GPIO . a d d e v e n t c a l l b a c k ( 2 1 , c a l l b a c k s e n d o u t )
FREQ = 100 # frequency i n Hz
FIRE FREQ = 30 # f l i c k e r i n g e f f e c t
pwm = GPIO .PWM( 1 8 , 1 0 0 )
pwm. s t a r t ( 5 )
# Duty Cycle ( 0 <= dc <=100)
l i v i n g = GPIO .PWM( PIN LIVING , FREQ)
living . start (0)
porch = GPIO .PWM( PIN PORCH , FREQ)
porch . s t a r t ( 0 )
f i r e = GPIO .PWM( PIN FIREPLACE , FIRE FREQ )
fire . start (0)
# PubNub
pubnub = Pubnub ( p u b l i s h k e y = demo , s u b s c r i b e k e y = demo )
channel = pi house
def c a l l b a c k ( message ) :
# p r i n t temp
#temp =0.05
#hum=0.07 # { 1 : 0 . 1 f } . format ( h )
# message = { temperature : temp , humidity : hum}
#pubnub . p u b l i s h ( channel=channel , message=message , c a l l b a c k =c a l l b
p r i n t ( message )
def c a l l b a c k s e n d o u t ( ) :
# p r i n t temp
l u z p a t i o o u t =0.1
#hum=0.07 # { 1 : 0 . 1 f } . format ( h )
message = { l u z p a t i o o u t : l u z p a t i o o u t }
pubnub . p u b l i s h ( channel=channel , message=message , c a l l b a c k =c a l l b a
p r i n t ( message )
def
c a l l b a c k (m, channel ) :
p r i n t (m)
i f m[ item ] == l i g h t l i v i n g :
dc = m[ b r i g h t n e s s ] 10
l i v i n g . ChangeDutyCycle ( dc )
e l i f m[ item ] == l i g h t porch :
dc = m[ b r i g h t n e s s ] 10
porch . ChangeDutyCycle ( dc )
e l i f m[ item ] == f i r e p l a c e :
dc = m[ b r i g h t n e s s ] 10
f i r e . ChangeDutyCycle ( dc )
e l i f m[ item ] == garageml i v i n g :
gr = m[ b r i g h t n e s s ]
duty = f l o a t ( gr ) / 1 0 . 0 + 2 . 5
p r i n t duty
pwm. ChangeDutyCycle ( duty )
e l i f m[ item ] == door :
p r i n t m[ open ]
def e r r o r (m) :
p r i n t (m)
pubnub . s u b s c r i b e ( c h a n n e l s=channel , c a l l b a c k = c a l l b a c k , e r r o r= e r r o r )
s e r = s e r i a l . S e r i a l ( / dev / ttyUSB0 , 9 6 0 0 )
s = [0 ,1]
try :
while 1 :
# callback send out ( )
# r e a d s e r i a l =s e r . r e a d l i n e ( )
s [0] = s t r ( int ( ser . readline ( ) , 1 6 ) )
print s [0]
temp1= f l o a t ( s [ 0 ] ) / 1 0
p r i n t temp1
# print read s
serial
message = { temperature : temp1 , humidity : 0 . 0 8 }
pubnub . p u b l i s h ( channel=channel , message=message , c a l l b a c k =c a l l b a
pass
e x c e p t KeyboardInterrupt :
GPIO . cleanup ( )
sys . e x i t ( 1 )
Anexo 4 - Codigo
PHP
<?php
$sock = s o c k e t c r e a t e ( AF INET , SOCK STREAM, SOL TCP ) ;
s o c k e t c l o s e ( $sock ) ;
?>
Anexo 5 - Codigo
do Arduino UNO
# i n c l u d e <SPI . h>
# i n c l u d e <E t h e r n e t . h>
byte mac [ ] = {
0xDE , 0xAD, 0xBE , 0xEF , 0xFE , 0xED } ;
IPAddress i p ( 1 9 2 , 1 6 8 , 0 , 1 0 1 ) ;
IPAddress gateway ( 1 9 2 , 1 6 8 , 0 , 1 ) ;
IPAddress subnet ( 2 5 5 , 2 5 5 , 2 5 5 , 0 ) ;
EthernetServer server ( 8 0 ) ;
void setup ( ) {
S e r i a l . begin ( 9 6 0 0 ) ;
void loop ( ) {
EthernetClient c l i e n t = server . available ( ) ;
if ( client ) {
S e r i a l . p r i n t l n ( new c l i e n t ) ;
boolean c u r r e n t L i n e I s B l a n k = t r u e ;
while ( c l i e n t . connected ( ) ) {
i f ( client . available ( ) ) {
char c = c l i e n t . read ( ) ;
S e r i a l . write ( c ) ;
i f ( c == \ n && c u r r e n t L i n e I s B l a n k ) {
c l i e n t . p r i n t l n ( HTTP / 1 . 1 200 OK ) ;
c l i e n t . p r i n t l n ( Content Type : t e x t / html ) ;
c l i e n t . p r i n t l n ( Connection : c l o s e ) ;
c l i e n t . p r i n t l n ( Refresh : 5 ) ;
client . println ( ) ;
c l i e n t . p r i n t l n ( < !DOCTYPE HTML> ) ;
c l i e n t . p r i n t l n ( < html > ) ;