Escolar Documentos
Profissional Documentos
Cultura Documentos
Revista - .Net Magazine n.110
Revista - .Net Magazine n.110
Corpo Editorial
Atendimento ao Leitor
A DevMedia conta com um departamento exclusivo para
o atendimento ao leitor. Se voc tiver algum problema
no recebimento do seu exemplar ou precisar de algum
contato com:
www.devmedia.com.br/central
(21) 3382-5038
Editor Geral
Joel Rodrigues (joelrlneto@gmail.com)
Jornalista Responsvel
Kaline Dolabella - JP24185
Capa e Diagramao
Romulo Araujo
Na Web
ww.devmedia.com.br/dotnet
Publicidade
Joel Rodrigues
Distribuio
FC Comercial e Distribuidora S.A
Rua Teodoro da Silva, 907 | Graja - RJ - 206563-900
Cristiany Queiroz
publicidade@devmedia.com.br
Sumrio
D
s
Feedback
eu
edio
ta
sobre e
s
Notificaes Push no
Windows Phone 8
Enviando e recebendo notificaes a partir de um
servio externo
Resumo DevMan
Porque esse artigo til::
Este artigo ser til para os desenvolvedores que desejam utilizar
novas formas de comunicao e interao com suas Apps por parte
dos usurios, por exemplo, notificar sobre novas notcias, exibir
novas imagens nos Tiles, a partir de um mecanismo que funciona
mesmo com a App fechada, e que consome pouco recurso do telefone, como bateria.
Push Notifications
Podemos descrever as notificaes Push como mensagens que contm informaes e podem ser recebidas
pelas Apps, mesmo quando esta no se encontra em
execuo, dependendo do tipo de notificao enviada.
O servio Microsft Push Notification para o Windows
Phone oferece aos desenvolvedores um canal para envio
de dados a uma App do Windows Phone, de forma assncrona, a partir de um servio web ou na nuvem que
resulte em baixo consumo de energia pelo telefone.
Conforme a Figura 1, podemos entender como funciona o servio.
1. A App solicita ao cliente Push do telefone uma URI
para notificao.
2. O cliente Push negocia com o Microsoft Push Notification Service (MPNS), e o MPNS retorna uma URI nica
de notificao ao cliente Push do telefone.
3. O cliente Push retorna a URI de notificao para a
App.
4. A App pode enviar a URI recebida a um servio web
ou na nuvem para que esse servio web possa enviar
mensagens App quando necessrio.
5. Quando o servio web tem alguma mensagem para
ser enviada App, este ir enviar uma requisio
Figura 1. Diagrama sobre como funciona o envio das notificaes. Fonte: MSDN
utilizando a URI de notificao recebida anteriormente para
o MPNS.
6. O MPNS encaminha a notificao Push para o telefone.
Nesse processo de envio, o MPNS responder com um cdigo
de resposta ao solicitante do Push, indicando se o mesmo foi
encaminhado ou ser encaminhado na prxima possibilidade
ao telefone. Tambm, o MPNS pode retornar indicando que o
Push no ser entregue e com isso, dependendo da situao,
o Push pode ser reenviado ou no. Apesar disso, o MPNS no
oferece uma confirmao de ponta a ponta de que o Push foi
realmente entregue.
de outro publicador tenha esse mesmo trecho de cdigo para recuperar o identificador do telefone, o identificador retornado ser
diferente entre uma App e outra. Contudo, para que seja possvel
obter esse identificador necessrio adicionar ao arquivo de Manifesto a identificao ID_CAP_IDENTITY_DEVICE;
A quantidade de aplicativos com notificaes Push por aparelho
limitada em 15 no Windows Phone 7 pr Mango (7.5), 30 para Windows Phone 7.5 e ilimitada para Windows Phone 8. Caso o limite
seja atingido, ao abrir o canal com cliente MPNS ser lanada uma
exceo e no ser possvel habilitar a notificao para o aparelho
at que o usurio remova as notificaes de outra App.
Erro
Descrio
PushErrorTypeChannelOpenFailed
O canal no existe, portanto no pode ser aberto. A App deve tentar abrir novamente.
PushErrorTypeMessageBadContent
PushErrorTypeNotificationRateTooHigh A taxa de notificaes recebidas est muito alta. Diminuir a taxa de notificaes recebidas para evitar mensagens descartadas.
PushErrorTypePayloadFormatInvalid
O XML da mensagem est mal formatado ou com erros, ou o tipo de notificao no foi definido no cabealho da requisio, ou no se enquadra no tipo da requisio efetuada, com isso, o canal ser fechado. Portanto, devemos verificar o XML
da requisio e reabrir o canal para obter uma nova URI de notificao.
PushErrorTypeUnknown
pode ser feito de modo autenticado ou no. No modo no autenticado, o nmero e frequncia das
notificaes enviadas ao MPNS so controlados, no caso, o limite
atual de 500 por canal (telefone), por dia. Para utilizar o modo
autenticado, o qual no apresenta restries, o desenvolvedor
primeiro precisa registrar um certificado com o servio de notificaes Push atravs da loja do Windows Phone. O certificado
precisa ser expedido por uma unidade certificadora confivel
por parte da Microsoft, e ento esse certificado usado para
estabelecer uma conexo segura atravs de SSL entre o servio
web e o servio de notificaes push.
Aps a explicao sobre o que e como funciona o envio de
notificaes push, iremos falar dos trs tipos de notificaes, que
so Tile, Toast e Raw.
Tile Notification
Como o prprio nome diz, a notificao para Tile deve ser utilizada para atualizar o contedo de um Tile, seja ele o principal
ou no. Caso seja o principal, no existe a possibilidade de trocar
seu template para o outro sem submeter outra verso da App, j
para o secundrio possvel cri-lo e alter-lo em tempo de execuo. Esse tipo de notificao funciona mesmo quando a App
no est aberta.
O Windows Phone 7.8 (atravs de reflection, documentao disponibilizada na seo Links) e Windows Phone 8 suportam trs
tipos de templates para Tiles: Flip, Iconic e Cycle. A escolha do
template ir depender da finalidade da App, j que cada um tem
uma caracterstica prpria. Os Tiles tm os tamanhos descritos
na Tabela 2. No caso de telas WVGA, para os tamanhos 720p e
1080p (a partir do Update 3 do Windows Phone 8) as imagens so
automaticamente ajustadas.
Flip e Cycle
Iconic
Pequeno
Mdio
Largo
N/A
Figura 4. Imagem demonstrando o funcionamento para um Tile no padro Iconic - Fonte: MSDN
O padro Cycle exibe uma serie de at nove imagens em sequncia, conforme Figura 5. O uso desse template recomendado
para exibio de imagens.
Toast Notification
A notificao por Toast exibe uma mensagem por cerca de dez
segundos. Se o usurio clicar sobre o Toast, a App ser aberta na
pgina inicial ou, caso seja definido no parmetro Param do
Toast, a pgina especificada.
Em telefones com Windows Phone 8 sem o Update 3, as notificaes Toast no so exibidas se a App estiver em execuo em
primeiro plano, j nos aparelhos com essa atualizao os Toasts
so exibidos, mas ficam obscuros por outra atividade como uma
chamada telefnica ou a tela de bloqueio. Outra funcionalidade
que tambm ser possvel com a atualizao customizar o som
da notificao quando o Toast for exibido.
Em um Toast, exibida uma verso miniatuarizada do cone da
App, um ttulo e uma mensagem, conforme Figura 6. No caso do
ttulo e da mensagem, ambos so truncados, caso o tamanho do
texto seja maior que o espao disponvel para exibio.
Raw Notification
Esse tipo de notificao no oferece nenhuma interao direta
com o usurio, ele utilizado principalmente para recebimento
O projeto
A fim de exemplificar como funcionam os tipos de notificao
j explicados, criaremos um projeto Web que far as requisies
ao MPNS enviando um XML de acordo com o template de cada
tipo de notificao especificado pela Microsoft. Nesse caso, o
projeto tem o objetivo de mostrar como funciona a comunicao
entre o servidor Web e o MPNS, e entre o Windows Phone e o
cliente Push. Portanto, em um ambiente real teramos outra comunicao, entre o servidor Web e Windows Phone, para que os
telefones pudessem enviar os canais de Push ao servidor atravs
de um servio ou API.
Windows Phone 8
Para os projetos, estaremos utilizando o Visual Studio 2012.
Dessa forma, abriremos esse IDE em modo administrador e criaremos o primeiro projeto, Windows Phone 8.
Aproveitando a prpria pgina MainPage.xaml que criada
por padro na soluo, alteraremos o grid LayoutRoot conforme
a Listagem 3. No caso, criaremos um elemento do tipo LongListSelector, que ir listar os lances do jogo de futebol e um TextBlock
que dever informar quais so os times que esto se enfrentando.
Tambm ser necessrio adicionar algumas imagens que sero
utilizadas no Tile do tipo Cycle, o qual no permite o uso de
imagens externas ao telefone, conforme a Figura 7.
Listagem 3. Contedo do grid que mostrar as informaes ao usurio
Figura 5. Imagem demonstrando o funcionamento para um Tile no padro Cycle - Fonte: MSDN
Aps definido o layout da tela e seus elementos, implementaremos a lgica para abertura do canal de comunicao das
notificaes push e o mecanismo de exibio das informaes
recebidas nas notificaes para a tela do usurio, como tambm
as configuraes dos Tiles. Para isso, criaremos uma varivel na
Figura 7. Adicione imagens configurando para serem copiadas quando compilar o projeto
Depois disso, adicionamos os bindings das propriedades InformacoesJogo e TituloJogo, que atualizaro os elementos da pgina
da App, conforme a Listagem 5.
Listagem 5. Propriedades, mtodo e evento utilizado no binding
01 private string _tituloJogo;
02 public string TituloJogo
03 {
04 get
05 {
06
return _tituloJogo;
07 }
08 set
09 {
10
if (value != _tituloJogo)
11
{
12
_tituloJogo = value;
13
NotifyPropertyChanged(TituloJogo);
14
}
15 }
16 }
17
18 private ObservableCollection<string> _informacoesJogo;
19 public ObservableCollection<string> InformacoesJogo
20 {
21 get
22 {
23
if (_informacoesJogo == null)
24
_informacoesJogo = new ObservableCollection<string>();
25
26
return _informacoesJogo;
27 }
28 set
29 {
30
if (value != _informacoesJogo)
31
{
32
_informacoesJogo = value;
33
NotifyPropertyChanged(InformacoesJogo);
34
}
35 }
36 }
37 // Evento para notificao de atualizao dos elementos da
38 // pagina que esto atrelados s propriedades
39 public event PropertyChangedEventHandler PropertyChanged;
40 private void NotifyPropertyChanged(String propertyName)
41 {
42 PropertyChangedEventHandler handler = PropertyChanged;
43 if (null != handler)
44 {
45
handler(this, new PropertyChangedEventArgs(propertyName));
46 }
47 }
Pelo fato da App ser um exemplo para todos os tipos de notificao hoje existentes, ao abrir a App pela primeira vez esta ir criar
trs Tiles secundrios, um de cada tipo, que sero atualizados
pelas notificaes. Para isso, adicionamos no evento de abertura
da pgina, OnNavigatedTo, a criao de todos eles. Tambm nesse
evento onde atualizamos os times que esto se enfrentando.
Quando esses times forem enviados por um parmetro na URL,
esse parmetro ser utilizado nas notificaes Tile e Toast, assim,
quando o usurio clicar sobre Tile ou Toast, ele ser redirecionado
para essa pgina com os seus devidos parmetros, conforme a
Listagem 6.
Alm das criaes dos Tiles, se executarem o projeto em modo Debug, na aba
output do Visual Studio deve ser exibida a
URI do canal criado com o servio de Push,
o que ilustrado na Figura 8. Essa URI ser
utilizada na requisio das notificaes.
Por fim, criaremos os mtodos que iro
se registrar junto ao cliente Push do telefone todas as notificaes para a App.
Alguns passos so comuns para todos os
tipos de notificao, como a verificao
da existncia do canal antes de abri-lo, o
registro no evento ChannelUriUpdated,
que ir informar quando houver alterao
no endereo do canal. Nesse momento, em
um cenrio real, precisaramos enviar essa
nova URI ao servio Web. Outro evento
comum o ErrorOccurred, que deve informar a ocorrncia de algum dos erros
da Tabela 1.
Iniciando pela notificao do tipo Tile,
podemos dizer que essa notificao funciona mesmo quando a App no est em
execuo, e pode ser usado para baixar
recursos, como imagens externas ao
telefone. Para isso, precisamos informar
todas as URIs absolutas confiveis no
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 }
}
tile = ShellTile.ActiveTiles.Where
(t => t.NavigationUri.OriginalString.Contains(Tile=flip)).FirstOrDefault();
if (tile == null)
{
FlipTileData flipTile = new FlipTileData();
flipTile.Title = Flip;
ShellTile.Create(new Uri(/MainPage.xaml?TituloJogo=BRA x ESP&Tile=flip,
UriKind.Relative), flipTile, true);
return;
}
tile = ShellTile.ActiveTiles.Where
(t => t.NavigationUri.OriginalString.Contains(Tile=cycle))
.FirstOrDefault();
if (tile == null)
{
CycleTileData cycleTile = new CycleTileData();
cycleTile.Title = Cycle;
ShellTile.Create(new Uri(/MainPage.xaml?TituloJogo=BRA x ESP&Tile=cycle,
UriKind.Relative), cycleTile, true);
return;
}
A notificao do tipo Toast tambm funciona com a App fechada, a diferena que
ao receber a notificao, pode existir uma
interao direta com o usurio temporariamente. Caso o mesmo clique sobre a rea
do Toast, a App ir se abrir em uma URI
determinada no XML da notificao, caso
contrrio, a notificao desaparece aps
alguns segundos. Essa situao ocorrer
quando a App no estiver em execuo
em primeiro plano, seno, ser preciso
registrar-se no evento ShellToastNotificationReceived para que a App possa
identificar que uma notificao Toast foi
recebida. Nesse caso, a deciso sobre o que
Projeto Web
O projeto Web consiste em demonstrar parte da funcionalidade
que um servio web faria em um ambiente real para enviar as
notificaes ao MPNS. Desse modo, montaremos uma pgina
que servir para parametrizar o XML a ser enviado na requisio
ao MPNS. Neste exemplo, esse projeto est configurado para ser
executado no IIS Express, na porta 2704, conforme Figura 9.
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 }
66 }
67 void PushChannel_ErrorOccurred(object sender, NotificationChannelError
EventArgs e)
68 {
69 // Passivel para tratamento de erro por parte da aplicao.
70 Dispatcher.BeginInvoke(() =>
71
MessageBox.Show(String.Format(Um erro de notificao
{0} ocorreu. {1} ({2}) {3},
72
e.ErrorType, e.Message, e.ErrorCode, e.ErrorAdditionalData))
73
);
74 }
75
76 void PushChannel_ChannelUriUpdated(object sender, NotificationChannelUri
EventArgs e)
77 {
78 Dispatcher.BeginInvoke(() =>
79 {
80
// Exibe a nova URI, apenas para exemplo. Em um ambiente real,
// a nova URI dever ser enviada ao servidor Web.
81
System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
82
MessageBox.Show(String.Format(A nova Uri {0},
83
e.ChannelUri.ToString()));
84
85 });
86 }
Sendo assim, temos que liberar o acesso do emulador do Windows Phone, o qual roda em um ambiente virtualizado, atravs
da execuo da linha de comando exibida na Figura 10. Apenas
substitua pela porta especificada no projeto, caso seja diferente,
em um prompt de comando (cmd.exe) em modo administrador
para liberar o acesso atravs do firewall do Windows Vista, 7 e 8.
Caso voc tenha outro programa de firewall, provavelmente
precisar liberar acesso a essa porta tambm.
Ento, por ltimo, temos que configurar o acesso ao site do IIS
Express ao endereo IP em que o emulador do Windows Phone
est trabalhando. Para isso, podemos utilizar esse mesmo prompt
de comando e executar ipconfig, e assim localizar o endereo
IP do adaptador cujo nome aparece Windows Phone Emulator
Internal Switch, como se v na Figura 11.
(PushChannel_ShellToastNotificationReceived);
36
37
38
39
if (pushChannel.ChannelUri != null)
{
// Exibe a nova URI, apenas para exemplo. Em um ambiente real,
// a nova URI dever ser enviada ao servidor Web.
System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString());
MessageBox.Show(String.Format(A Uri do canal {0},
pushChannel.ChannelUri.ToString()));
}
40
41
42
43
44
45 }
46
47 }
48
49 private void PushChannel_ShellToastNotificationReceived
(object sender, NotificationEventArgs e)
50 {
51 StringBuilder message = new StringBuilder();
52 string relativeUri = string.Empty;
53
54 // Criao de mensagem apenas para demontrar o recebimento
// do toast enquanto o App est aberto
55 message.AppendFormat(Toast recebido {0}:\n, DateTime.Now.ToShortTime
String());
56
57 // Recupera todas as informaes que esto na mensagem.
58 foreach (string key in e.Collection.Keys)
59 {
60
message.AppendFormat({0}: {1}\n, key, e.Collection[key]);
61
62
if (string.Compare(
63
key,
64
wp:Param,
65
System.Globalization.CultureInfo.InvariantCulture,
66
System.Globalization.CompareOptions.IgnoreCase) == 0)
67
{
68
relativeUri = e.Collection[key];
69
}
70 }
71
72 // Exibe todos os campos da mensagem do toast
73 Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));
74
75 //Navega para a pgina recebida no toast
76 Dispatcher.BeginInvoke(() => NavigationService.Navigate
(new Uri(e.Collection[wp:Param], UriKind.Relative)));
77 }
11
Figura 10. Linha de comando para adicionar uma exceo ao firewall do Windows
27
28
29
30
31
32 }
33 }
34
35 private void PushChannel_HttpNotificationReceived
(object sender, HttpNotificationEventArgs e)
36 {
37 string message;
38
39 //L o conteudo do corpo da notificao
40 using (System.IO.StreamReader reader = new System.IO.StreamReader
(e.Notification.Body))
41 {
42
message = reader.ReadToEnd();
43 }
44
45 // Uso de Linq to XML para recuperar o valor dos elementos do XML
46 XDocument doc = XDocument.Parse(message);
47 Dispatcher.BeginInvoke(() =>
48
{
49
TituloJogo = doc.Descendants().Where
(n => n.Name == TituloJogo).First().Value;
50
InformacoesJogo.Add(doc.Descendants().Where
(n => n.Name == InformacaoJogo).First().Value);
51
});
52
53 //Exibe uma mensagem, apenas para mostrar o contedo recebido
54 Dispatcher.BeginInvoke(() =>
55
MessageBox.Show(String.Format(Received Notification {0}:\n{1},
56
DateTime.Now.ToShortTimeString(), message))
57
);
58 }
Figura 12. Editando o arquivo de configurao do IISExpress para permitir o acesso do emulador ao site do projeto
demonstrado na Figura 13. Caso no tenha
sucesso no teste, verifique as configuraes explicadas anteriormente.
Para o envio das notificaes, chamaremos
um mtodo a partir do clique do boto. Para
cada tipo de notificao existe um modelo de
XML diferente a ser seguido, apesar disso,
2:16 PM
todos partem do mesmo princpio. Nesse
46
<asp:TextBox ID=TextBoxBackBackgroundImage
47
04
Tipo:
48
05
06
runat=server></asp:TextBox><br />
</asp:TextBox><br />
StaticEnableDefaultPopOutImage=False OnMenuItemClick=
49
</asp:View>
TipoPush_MenuItemClick>
50
07
<Items>
51
<br />
08
52
Iconic<br />
09
53
Title:<br />
10
54
11
</Items>
12
</asp:Menu>
55
13
56
57
Content1:<br />
58
Width=50%></asp:TextBox><br />
59
Content2:<br />
Subtitle:<br />
60
Width=50%></asp:TextBox><br />
61
Content3:<br />
62
63
Count:<br />
64
65
66
14
15
16
17
18
19
20
</asp:TextBox><br />
</asp:TextBox><br />
</asp:TextBox><br />
</asp:TextBox><br />
21
<asp:TextBox ID=TextBoxTituloJogo runat=server
Width=50%></asp:TextBox><br />
22
</asp:View>
23
24
</asp:TextBox><br />
MaxLength=2></asp:TextBox><br />
Orientation=Horizontal
25
26
</asp:TextBox><br />
StaticEnableDefaultPopOutImage=False
67
</asp:View>
OnMenuItemClick=TipoTile_MenuItemClick>
68
<Items>
69
Cycle<br />
27
70
Title:<br />
Selected=true></asp:MenuItem>
71
28
29
30
</Items>
</asp:TextBox><br />
72
73
Count:<br />
<asp:TextBox ID=TextBoxCycleCount runat=server
31
</asp:Menu>
32
74
</asp:View>
33
75
</asp:MultiView>
ActiveViewIndex=0>
76
34
77
35
<br />
78
36
Flip<br />
79
37
80
38
39
40
MaxLength=2></asp:TextBox><br />
Width=50%></asp:TextBox><br />
81
82
84
42
85
43
44
45
83
41
MaxLength=2></asp:TextBox><br />
</div>
</asp:View>
86
</asp:View>
</asp:MultiView>
</div>
<asp:Button ID=ButtonSend runat=server OnClick=ButtonSend_Click
Text=Enviar Notificacao /><br />
87
88
Resposta:<br />
<asp:Label ID=LabelRespostaMPNS runat=server Width=50%></asp:Label>
89 </form>
Caracter
Codificao XML
<
<
>
>
&
&
'
"
17 {
18
19
20
21
22
23
24
25
26
27
28
29
30
31 }
Figura 13. O emulador conseguiu abrir a pgina que criamos no projeto Web, a comunicao
no momento do Push ter sucesso
A partir do status da resposta do envio da requisio possvel
identificar alguns cenrios que dizem a respeito da entrega das
notificaes e estado do canal, de acordo com a Tabela 4.
Os estados de conexo com o telefone podem ser definidos
entre Connected, Temp Disconnected e Disconnected, os quais
possuem as transies demonstradas na Figura 14. No caso, pelo
15
Status da
Notificao
Status da Conexo
com o telefone
Status do
Canal
200 OK
Received
Connected
Active
A requisio da notificao foi aceita e includa na fila para entrega. O MPNS pode responder com esse status mesmo que o telefone esteja alternando para o estado Temp Disconnected. Isso significa que a notificao no ser entregue at que o telefone retorne do
estado Temp Disconnected.
200 OK
Received
Temp Disconnected
Active
A requisio foi aceita e includa na fila para entrega. No entanto, o telefone est temporariamente desconectado.
200 OK
QueueFull
Connected
Active
O MPNS mantem no mximo 30 notificaes de cada canal para entrega. Uma vez que
esse limite atingido, todas as mensagens so descartadas at que o telefone se conecte
e a fila seja esvaziada.
200 OK
QueueFull
Temp Disconnected
Active
O MPNS mantem no mximo 30 notificaes para entrega de cada canal. Uma vez que
esse limite atingido, todas as mensagens so descartadas at que o telefone se conecte
e a fila seja esvaziada.
Active
A notificao foi recebida e foi descartada pelo servio de notificao push. O status de
descartada pode ocorrer se o tipo de notificao no foi ativado pela chamada BindToShellTile ou BindToShellToast pelo App, ou no caso de uma notificao do tipo Raw, a
requisio foi enviada enquanto o App no estava em execuo em primeiro plano, ou se
foi uma notificao do tipo Tile, nenhum Tile est fixado.
200 OK
Suppressed
Connected
200 OK
Suppressed
Temp Disconnected
Active
A notificao foi recebida e foi descartada pelo servio de notificao push. O status de
descartada pode ocorrer se o tipo de notificao no foi ativado pela chamada BindToShellTile ou BindToShellToast pelo App, ou no caso de uma notificao do tipo Raw, a
requisio foi enviada enquanto o App no estava em execuo em primeiro plano, ou se
foi uma notificao do tipo Tile, nenhum Tile est fixado.
400 BadRequest
N/A
N/A
N/A
Esse erro ocorre quando o servio Web enviou uma requisio de notificao com um XML
ou URI que contem erros.
401 Unauthorized
N/A
N/A
N/A
Dropped
Connected
Expired
O canal invlido e no est presente no servio de notificao push. O servio Web deve
parar de enviar novas notificaes para esse canal.
Dropped
Temp Disconnected
Expired
O canal invlido e no est presente no servio de notificao push. O servio Web deve
parar de enviar novas notificaes para esse canal.
Dropped
Disconnected
Expired
O canal invlido e no est presente no servio de notificao push. O servio Web deve
parar de enviar novas notificaes para esse canal.
N/A
N/A
N/A
Active
Esse erro pode acontecer quando um servio Web est utilizando o modo sem autenticao de envio de notificao e esse atingiu o limite por dia de envio para determinado
canal. Quando ocorrer esse erro, o servio Web pode tentar enviar uma notificao a cada
hora, no entanto, pode ser necessrio esperar at 24 horas para que o envio de notificaes seja normalizado.
Dropped
Connected
Dropped
Temp Disconnected
Active
Esse erro pode acontecer quando um servio Web est utilizando o modo sem autenticao de envio de notificao e esse atingiu o limite por dia de envio para determinado
canal. Quando ocorrer esse erro, o servio Web pode tentar enviar uma notificao a cada
hora, no entanto, pode ser necessrio esperar at 24 horas para que o envio de notificaes seja normalizado.
412 Precondition
Failed
Dropped
Disconnected
N/A
N/A
N/A
N/A
Cabealho da Requisio
Valor
Descrio
X-WindowsPhone-Target
toast
Identificao da notificao
Entrega imediata.
12
22
X-NotificationClass
Tabela 5. Cabealhos que devem conter no envio da requisio para notificaes do tipo Toast
Figura 14. Transio entre os estados de conexo dos telefones com o servidor de notificao
Push, fonte: MSDN
Listagem 12. Rotina que faz o envio da notificao do tipo Toast para o MPNS
01 private void EnviarToast()
02 {
03 try
04 {
05
// URI retornada pelo cliente Push quando criado o canal para notificao
06
string subscriptionUri = TextBoxUri.Text.ToString();
07
08
HttpWebRequest sendNotificationRequest =
(HttpWebRequest)WebRequest.Create(subscriptionUri);
09
10
// HTTP POST o unico method aceito para as nofitificaes
11
sendNotificationRequest.Method = POST;
12
13
// O cabealho X-MessageID opcional e pode ser usado
// para identificar uma mensagem de notificao.
14
// Se estiver presente, o mesmo valor retornado na resposta da requisio.
15
// sendNotificationRequest.Headers.Add(X-MessageID, <UUID>);
16
17
// Criando uma mensagem para a notificao.
18
string toastMessage = <?xml version=\1.0\ encoding=\utf-8\?> +
19
<wp:Notification xmlns:wp=\WPNotification\> +
20
<wp:Toast> +
21
<wp:Text1> + TextBoxTitle.Text + </wp:Text1> +
22
<wp:Text2> + TextBoxSubTitle.Text + </wp:Text2> +
23
<wp:Param>/MainPage.xaml?TituloJogo= +
TextBoxTituloJogo.Text + </wp:Param> +
24
</wp:Toast> +
25
</wp:Notification>;
26
27
// Convertendo para byte[].
28
byte[] notificationMessage = Encoding.UTF8.GetBytes(toastMessage);
29
30
// Apontando o tamanho e tipo do corpo da requisio.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 }
sendNotificationRequest.ContentLength = notificationMessage.Length;
sendNotificationRequest.ContentType = text/xml;
// A configurao 2 do cabealho X-NotificationClass
// serve para solicitar uma entrega imediata.
sendNotificationRequest.Headers.Add(X-WindowsPhone-Target, toast);
sendNotificationRequest.Headers.Add(X-NotificationClass, 2);
using (Stream requestStream = sendNotificationRequest.GetRequestStream())
{
requestStream.Write(notificationMessage, 0, notificationMessage.Length);
}
// Recuperando a resposta do MPNS.
HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.
GetResponse();
string notificationStatus = response.Headers[X-NotificationStatus];
string notificationChannelStatus = response.Headers[X-SubscriptionStatus];
string deviceConnectionStatus = response.Headers[X-DeviceConnection
Status];
// Exibindo resposta recebida. Recomendado tratamento de erros,
// at porque as notificaes podem no ser enviadas ao telefone
LabelRespostaMPNS.Text = notificationStatus + | +
deviceConnectionStatus + | + notificationChannelStatus;
}
catch (Exception ex)
{
LabelRespostaMPNS.Text = Ocorreu uma exceo ao enviar a requisio:
+ ex.ToString();
}
17
Figura 17. Visualizao de cada elemento da notificao para Tiles do tipo Flip - Fonte: MSDN
Figura 18. Visualizao de cada elemento da notificao para Tiles do tipo Iconic - Fonte: MSDN
Figura 19. Visualizao de cada elemento da notificao para Tiles do tipo Cycle, fonte: MSDN
Cabealho da Requisio
Valor
X-WindowsPhone-Target token
X-NotificationClass
Descrio
Identificao da notificao
Entrega imediata.
11
21
Tabela 6. Cabealhos que devem conter no envio da requisio para notificaes do tipo Tile.
Listagem 13. Rotina que faz o envio da notificao do tipo Tile para o MPNS
01 private void EnviarTile()
02 {
03 try
04 {
05
// URI retornada pelo cliente Push quando criado o canal para notificao
06
string subscriptionUri = TextBoxUri.Text.ToString();
07
HttpWebRequest sendNotificationRequest =
(HttpWebRequest)WebRequest.Create(subscriptionUri);
08
// HTTP POST o unico method aceito para as nofitificaes
09
sendNotificationRequest.Method = POST;
10
// O cabealho X-MessageID opcional e pode ser usado
// para identificar uma mensagem de notificao.
11
// Se estiver presente, o mesmo valor retornado na resposta da requisio.
12
// sendNotificationRequest.Headers.Add(X-MessageID, <UUID>);
13
// Criando uma mensagem para a notificao.
14
string tileMessage;
15
switch (Convert.ToInt16(TipoTile.SelectedItem.Value))
16
{
17
// Iconic
18
case 1:
19
tileMessage = <?xml version=\1.0\ encoding=\utf-8\?>
20
+<wp:Notification xmlns:wp=\WPNotification\ Version=\2.0\>
21
+ <wp:Tile Id=\/MainPage.xaml?TituloJogo=BRA x
ESP&Tile=iconic\ Template=\IconicTile\>
22
+ <wp:SmallIconImage + (string.IsNullOrEmpty
(TextBoxIconImage.Text) ? Action=\Clear\ : ) + >
+ uriBaseImagesTile + TextBoxIconImage.Text
+ </wp:SmallIconImage>
23
+ <wp:IconImage + (string.IsNullOrEmpty
(TextBoxIconImage.Text) ? Action=\Clear\ : )
+ > + uriBaseImagesTile + TextBoxIconImage.Text
+ </wp:IconImage>
24
+ <wp:WideContent1 + (string.IsNullOrEmpty
(TextBoxContent1.Text) ? Action=\Clear\ : )
+ > + TextBoxContent1.Text + </wp:WideContent1>
25
+ <wp:WideContent2 + (string.IsNullOrEmpty
(TextBoxContent2.Text) ? Action=\Clear\ : )
+ > + TextBoxContent2.Text + </wp:WideContent2>
26
+ <wp:WideContent3 + (string.IsNullOrEmpty
(TextBoxContent3.Text) ? Action=\Clear\ : )
+ > + TextBoxContent3.Text + </wp:WideContent3>
27
+ <wp:Count + (string.IsNullOrEmpty
(TextBoxIconicCount.Text) ? Action=\Clear\ : )
+ > + TextBoxIconicCount.Text + </wp:Count>
28
+ <wp:Title + (string.IsNullOrEmpty
(TextBoxIconicTitle.Text) ? Action=\Clear\ : )
+ > + TextBoxIconicTitle.Text + </wp:Title>
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
+ <wp:BackgroundColor + (string.IsNullOrEmpty
(TextBoxBackgroundColor.Text) ? Action=\Clear\ : )
+ > + TextBoxBackgroundColor.Text + </wp:BackgroundColor>
+</wp:Tile>
+</wp:Notification>;
break;
// Cycle
case 2:
tileMessage = <?xml version=\1.0\ encoding=\utf-8\?>
+<wp:Notification xmlns:wp=\WPNotification\ Version=\2.0\>
+ <wp:Tile Id=\/MainPage.xaml?TituloJogo=BRA x
ESP&Tile=cycle\ Template=\CycleTile\>
+ <wp:SmallBackgroundImage>
/Images/taca.jpg</wp:SmallBackgroundImage>
+ <wp:CycleImage1>/Images/taca.jpg</wp:CycleImage1>
+ <wp:CycleImage2>/Images/campeao.jpg</wp:CycleImage2>
+ <wp:CycleImage3>/Images/carrinho.jpg</wp:CycleImage3>
+ <wp:CycleImage4>/Images/chute.jpg</wp:CycleImage4>
+ <wp:CycleImage5>/Images/comemoracao.jpg</wp:CycleImage5>
+ <wp:CycleImage6>/Images/comemoracao2.jpg</wp:CycleImage6>
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
+ <wp:CycleImage7>/Images/comemoracao3.jpg</wp:CycleImage7>
+ <wp:CycleImage8>/Images/expulsao.jpg</wp:CycleImage8>
+ <wp:CycleImage9>/Images/golneymar.jpg</wp:CycleImage9>
+ <wp:Count + (string.IsNullOrEmpty(TextBoxCycleCount.Text)
? Action=\Clear\ : ) + > + TextBoxCycleCount.Text
+ </wp:Count>
+ <wp:Title + (string.IsNullOrEmpty(TextBoxCycleTitle.Text)
? Action=\Clear\ : ) + > + TextBoxCycleTitle.Text
+ </wp:Title>
+</wp:Tile>
+</wp:Notification>;
break;
// Flip
default:
tileMessage = <?xml version=\1.0\ encoding=\utf-8\?>
+<wp:Notification xmlns:wp=\WPNotification\ Version=\2.0\>
+ <wp:Tile Id=\/MainPage.xaml?TituloJogo=BRA x ESP&Tile=flip\
Template=\FlipTile\>
+ <wp:SmallBackgroundImage
+ (string.IsNullOrEmpty(TextBoxBackgroundImage.Text) ?
Action=\Clear\ : ) + > + uriBaseImagesTile
+ TextBoxBackgroundImage.Text + </wp:SmallBackgroundImage>
+ <wp:WideBackgroundImage
+ (string.IsNullOrEmpty(TextBoxBackgroundImage.Text) ?
Action=\Clear\ : ) + > + uriBaseImagesTile
+ TextBoxBackgroundImage.Text + </wp:WideBackgroundImage>
+ <wp:WideBackBackgroundImage
+ (string.IsNullOrEmpty(TextBoxBackBackgroundImage.Text) ?
Action=\Clear\ : ) + > + uriBaseImagesTile
+ TextBoxBackBackgroundImage.Text +
</wp:WideBackBackgroundImage>
+ <wp:WideBackContent + (string.IsNullOrEmpty
(TextBoxBackContent.Text) ? Action=\Clear\ : ) + >
+ TextBoxBackContent.Text + </wp:WideBackContent>
+ <wp:BackgroundImage + (string.IsNullOrEmpty
(TextBoxBackgroundImage.Text) ? Action=\Clear\ : ) + >
+ uriBaseImagesTile + TextBoxBackgroundImage.Text
+ </wp:BackgroundImage>
+ <wp:Count + (string.IsNullOrEmpty(TextBoxCount.Text) ?
Action=\Clear\ : ) + > + TextBoxCount.Text + </wp:Count>
+ <wp:Title + (string.IsNullOrEmpty(TextBoxFrontTitle.Text) ?
Action=\Clear\ : ) + > + TextBoxFrontTitle.Text + </wp:Title>
+ <wp:BackBackgroundImage
+ (string.IsNullOrEmpty(TextBoxBackBackgroundImage.Text) ?
Action=\Clear\ : ) + > + uriBaseImagesTile
+ TextBoxBackBackgroundImage.Text + </wp:BackBackgroundImage>
+ <wp:BackTitle + (string.IsNullOrEmpty(TextBoxBackTitle.Text) ?
Action=\Clear\ : ) + > + TextBoxBackTitle.Text
+ </wp:BackTitle>
+ <wp:BackContent + (string.IsNullOrEmpty
(TextBoxBackContent.Text) ? Action=\Clear\ : ) + >
+ TextBoxBackContent.Text + </wp:BackContent>
+</wp:Tile>
+</wp:Notification>;
break;
}
// Convertendo para byte[].
byte[] notificationMessage = Encoding.UTF8.GetBytes(tileMessage);
// Apontando o tamanho e tipo do corpo da requisio.
sendNotificationRequest.ContentLength = notificationMessage.Length;
sendNotificationRequest.ContentType = text/xml;
// A configurao 1 do cabealho X-NotificationClass serve
// para solicitar uma entrega imediata.
sendNotificationRequest.Headers.Add(X-WindowsPhone-Target, token);
sendNotificationRequest.Headers.Add(X-NotificationClass, 1);
using (Stream requestStream = sendNotificationRequest.GetRequestStream())
{
19
Continuao: Listagem 13. Rotina que faz o envio da notificao do tipo Tile para o MPNS
83
84
85
86
87
88
89
90
requestStream.Write(notificationMessage, 0, notificationMessage.Length);
}
// Recuperando a resposta do MPNS.
HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.
GetResponse();
string notificationStatus = response.Headers[X-NotificationStatus];
string notificationChannelStatus = response.Headers[X-SubscriptionStatus];
string deviceConnectionStatus = response.Headers[X-DeviceConnectionStatus];
// Exibindo resposta recebida. Recomendado tratamento de erros,
// at porque as notificaes podem no ser enviadas ao telefone
91
92
93
94
95
96
97 }
X-NotificationClass
Valor
Descrio
Entrega imediata.
13
23
Tabela 7. Cabealho que devem conter no envio da requisio para notificaes do tipo Raw
Figura 20. Notificao do tipo Tile - Flip recebida
Listagem 14. Rotina que faz o envio da notificao do tipo Raw para o MPNS
01 private void EnviarRaw()
02 {
03 try
04 {
05
// URI retornada pelo cliente Push quando criado o canal para notificao
06
string subscriptionUri = TextBoxUri.Text.ToString();
07
08
HttpWebRequest sendNotificationRequest =
(HttpWebRequest)WebRequest.Create(subscriptionUri);
09
10
// HTTP POST o unico method aceito para as nofitificaes
11
sendNotificationRequest.Method = POST;
12
13
// Criando um XML. Esse XML no tem template, o App ter que trata-lo.
14
string rawMessage = <?xml version=\1.0\ encoding=\utf-8\?> +
15
<WP8Push> +
16
<TituloJogo> + TextBoxTituloJogoRaw.Text + </TituloJogo> +
17
<InformacaoJogo> + TextBoxInformacaoJogo.Text +
</InformacaoJogo> +
18
</WP8Push>;
19
20
// Convertendo para byte[].
21
byte[] notificationMessage = Encoding.UTF8.GetBytes(rawMessage);
22
23
// Apontando o tamanho e tipo do corpo da requisio.
24
sendNotificationRequest.ContentLength = notificationMessage.Length;
25
sendNotificationRequest.ContentType = text/xml;
26
27
// A configurao 3 do cabealho X-NotificationClass serve
// para solicitar uma entrega imediata.
28
sendNotificationRequest.Headers.Add(X-NotificationClass, 3);
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 }
21
Autor
Felipe Farias Ferrari
Especialista em Desenvolvimento de Software, graduado em Cincia da Computao pelo Centro Universitrio da FEI. Atua como
Desenvolvedor .NET pela Hewlett-Packard Company, e Consultor
Especializado em Arquitetura OO, Web, Mobile e Plataforma .Net.
Links:
Documentao oficial referente o Microsoft Push Notification Service
http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff402558(v=vs.105).aspx
Figura 23. Notificaes do tipo Raw recebidas
O resultado desse exemplo apresentado na Figura 23.
Concluso
A utilizao das notificaes Push pode fazer com que sua App
tenha maior aceitao e, por consequncia, alcance maior popularidade, visto que uma funcionalidade que permite ao usurio
estar sempre atualizado ou em contato mais vezes com a App, e
que d a sensao para o usurio de que ele est recebendo um
contedo exclusivo para ele. Para isso, necessrio que seja feita
uma anlise em relao a escolha do tipo de notificao, levando
em conta objetivo da notificao e a melhor maneira de apresentao ao usurio.
23
Resumo DevMan
Porque esse artigo til::
Em geral, todas as aplicaes reais precisam trabalhar com dados
que, normalmente, vm na forma de um banco. Esse artigo til
porque traz informaes sobre como utilizar dados em aplicaes
WPF de forma segura e rpida. O Data Binding do WPF um recurso extremamente interessante e til para o desenvolvedor, que
consegue realizar a ligao de dados sem precisar criar um cdigo
muito extenso. Alm disso, o uso de LINQ se d pelo fato de ser uma
tecnologia muito til e fcil de utilizar para acesso a bancos de dados
relacionais, e o padro MVVM torna a separao entre a lgica de
negcios, os dados e a interface de usurio muito clara, criando uma
maior organizao do cdigo.
Com isso, Data Binding tambm um conceito chave na criao de animaes em WPF. importante notar que, em WPF,
possvel criar uma ligao entre objeto e fonte de dados atravs
de forma procedural, atravs de cdigo, ou de forma declarativa,
via XAML.
Basicamente, o Data Binding no WPF possui quatro peas
bsicas:
Target: o objeto que ir utilizar o resultado da ligao;
Target Property: a propriedade do objeto alvo que ir utilizar
o resultado;
Source: o objeto que fornece o valor;
Path: o caminho que localiza o valor dentro do objeto fonte.
Dessas quatro, as duas primeiras so as mais fceis de serem
entendidas. O Target o controle que contm a ligao, ou seja,
o controle que receber o valor que o Source ir enviar. J a
Target Property a propriedade desse objeto alvo que ir receber
o valor da ligao. importante notar que a Target Property de
um Binding deve ser uma dependency property (BOX 1). Como
a maioria das propriedades cujo Data Binding traria alguma
vantagem so dependency properties, isso acaba no sendo um
grande problema. A fonte do objeto (Source) o objeto do qual a
ligao busca o valor. Esse objeto pode ser um controle, dados ou
um objeto definido em code-behind.
BOX 1. Dependency Properties
O propsito de dependency properties fornecer um meio de basear o valor de uma propriedade
no valor de outras entradas. Essas outras entradas incluem propriedades de sistema, mecanismos
de determinao de propriedades em tempo de execuo, templates, estilos, etc. Alm disso, elas
podem ser implementadas para fornecer a validao dos dados que so passados a ela, valores
padro, monitoramento de mudanas em outras propriedades, entre outros. Em resumo, dependency
properties so propriedades que podem ser definidas atravs de mtodos como estilizao, data
binding, animao e herana.
LINQ to SQL
L INQ, ou Language Integrated Query, uma linguagem
criada pela Microsoft que permite ao desenvolvedor escrever
consultas estruturadas seguras em torno de colees locais de
objetos e fontes remotas de dados. Basicamente, a LINQ permite
a realizao de consultas em qualquer coleo, seja um array,
uma lista ou uma fonte remota de dados, como uma tabela em
25
View
Data Binding/
Commands
ViewModel
Model
Notifications
possvel obter a primeira fase na diferenciao das responsabilidades de subsistemas dentro do produto. Porm, preciso que
haja uma ligao entre eles. Implementaes de padres de projetos mais recentes, do conta de uma arquitetura Model-View-X,
onde X o elemento responsvel por realizar a integrao entre
o Model e a View. No caso do MVVM, a integrao realizada
atravs da ViewModel.
A partir daqui, interessante focar o desenvolvimento da aplicao no modelo MVVM. Como possvel notar a partir do que
foi visto, a ViewModel o elemento mais importante dessa trinca
que compe o MVVM. Mas, ao mesmo tempo, a menos familiar,
e a mais complicada de entender. Aqui, ser criada a estrutura
completa de uma aplicao com o padro MVVM, bem como uma
classe ViewModelBase, utilizada para trazer operaes bsicas que
dizem respeito ViewModel e sero posteriormente sobrescritas
para mais especificidade.
A ntes de tudo, preciso definir o que sero os Models, as
ViewModels e as Views. As Views so as mais simples de serem
definidas. Como se trata de uma aplicao WPF, as vistas sero
os arquivos XAML contendo as interfaces com o usurio. Alm
disso, eles sero responsveis por realizar o Data Binding com as
ViewModels. J os modelos so um pouco mais complexos. Aqui,
ser criada apenas uma pasta no projeto, chamada Models, que
conter todos os modelos de dados. Essas classes modelo sero
criadas posteriormente, quando o banco de dados for criado e
mapeado como classes do LINQ. Por fim, e mais importante,
preciso que se criem as ViewModels. Elas sero colocadas em uma
pasta separada no projeto, com esse mesmo nome, e essa pasta,
inicialmente, conter apenas a classe ViewModelBase, que ser
criada a seguir. Vale ressaltar que esse modelo de pastas em um
projeto s no o nico possvel para aplicaes com o padro
MVVM. Models, Views e ViewModels poderiam ser criados em
projetos separados, referenciando uns aos outros. A Figura 2
mostra a organizao do projeto no Visual Studio.
Nota
interessante ressaltar que, no caso de projetos diferentes para Models, Views e ViewModels,
preciso haver referncias entre eles. Porm, essas referncias devem ser cuidadas, pois sabido que,
pelo padro MVVM, ViewModels referenciam Models e Views referenciam ViewModels. Qualquer
referncia direta entre Views e Models pode levar a problemas no futuro, seja ela implcita ou
explcita, alm de quebrar o padro MVVM.
A partir da, preciso que haja alguma coisa na classe bsica das
ViewModels, ou seja, a classe ser utilizada como uma base para
as demais. Ela ir simplesmente implementar a interface INotifyPropertyChanged. Isso necessrio para que os ViewModels
sejam capazes de entender quando as propriedades so alteradas
pela View. Isso fundamental, pois, essencialmente, no haver
nenhum tipo de cdigo administrvel na View, de acordo com
o padro MVVM. A questo aqui que a interface em questo
contm apenas um evento, chamado PropertyChanged, que
deve ser implementado. Esse evento deve ser pblico, pois pode
27
ser acessado por qualquer classe. Para as classes que implementam esse evento, faz sentido escrever um ajudante simples, que
simplifica a chamada do evento. Esse mtodo aqui chamado
de OnPropertyChanged(string prop). A Listagem 1 mostra o
resultado da classe base de ViewModels. Posteriormente, ser
visto como esse mtodo utilizado para controlar a mudana de
propriedades na View.
A partir da, a classe bsica est definida. Porm, com essa classe
base, a comunicao entre ViewModel e View ser realizada somente atravs de eventos. Mas essa comunicao tambm pode ser
realizada atravs de comandos. Para isso, ser criada uma classe
bsica, chamada RelayCommand, ou comando de transmisso,
em uma traduo literal. a classe base de todos os comandos
que podero ser chamados na ViewModel que ser criada. Essa
classe vista em muitos projetos MVVM, e se tornou quase um
padro. Embora varie de projeto para projeto, em essncia ela
sempre muito parecida, servindo como uma base a qualquer comando. Porm, preciso entender que existem alguns requisitos
que a classe RelayCommand deve atender. Ela deve manter a
separao entre os controles e o mtodo que ir ser chamado, a
implementao deve ser to artificial quanto for necessrio, nem
mais, nem menos, fazendo com que a mesma seja extremamente
intuitiva para usar, e tambm que dependncias extras devem
ser mantidas ao mnimo, sempre lembrando que dependncias
29
BOX 5. CommandManager
uma classe selada que prov mtodos teis para utilizao em comandos. Alm disso, a classe
fornece servios que permitem descobrir o status de um comando. Os mtodos teis variam desde
mtodos de registro de objetos de binding at handlers de eventos de comandos. Como visto h
pouco, o nico evento da classe o RequerySuggested, que ocorre quando ele detecta condies que
podem alterar a capacidade do comando de executar.
A seguir, temos a criao dos mtodos responsveis pela adio, atualizao e excluso de linhas do banco de dados, alm do
mtodo responsvel por criar uma lista de consumidores. Esses
Criando a ViewModel
Agora, chegou a hora da criao das ViewModels. Como sabemos, pelo padro MVVM, cada uma das Views deve possuir uma
31
possa ter acesso ao banco de dados. Alm disso, a classe CustomerData traz uma srie de mtodos, como vimos anteriormente,
para adio, remoo e atualizao de dados no banco. Agora,
na ViewModel, preciso realizar a ponte entre o modelo e a
vista. Basicamente, o que ser feito aqui a transformao
desses mtodos em comandos que podem ser entendidos pela
View. Repare que poderiam ser utilizados eventos, sem problema
nenhum. Porm, a abordagem por comandos se justifica devido
sua maior simplicidade de operao e codificao.
Em um segundo momento, preciso estabelecer os requisitos.
importante lembrar que antes de tudo, a ViewModel uma classe
e, como tal, ela ter atributos, propriedades e mtodos. Portanto, em
termos de atributos, necessrio que haja um do tipo CustomerData, para criao do banco de dados. Esse objeto ser inicializado no
construtor da classe e somente l. Por outro lado, tambm necessria a criao de trs objetos do tipo RelayCommand, que sero os
comandos de adio, remoo e atualizao do banco. Tambm so
necessrios dois atributos do tipo Customer, uma vez que a View
precisa indicar quem ser adicionado, atualizado ou removido do
banco de dados. Um deles ser o consumidor atual, que pode ser
excludo ou atualizado, enquanto o outro ser o consumidor a ser
adicionado. Tudo isso mostrado na Listagem 8. Todos esses atributos possuiro suas respectivas propriedades, para que possam
ser acessados pelo arquivo XAML.
Listagem 8. Atributos e Construtor da classe MainWindowsViewModel
01 class MainWindowViewModel : ViewModelBase
02 {
03
private CustomerData cData;
04
private RelayCommand addCommand;
05
private RelayCommand updateCommand;
06
private RelayCommand delCommand;
07
private Customer currentCustomer;
08
private Customer newCustomer;
09
10
public MainWindowViewModel()
11
{
12
cData = new CustomerData();
13
}
14 ...
15 }
Por fim, preciso que a ViewModel utilize a lista que foi criada
na classe CustomerData. Para isso, foi criada uma propriedade
chamada ListData, que receber a lista no construtor da ViewModel. Ou seja, quando for criada uma instncia da ViewModel,
ser criada a lista que corresponde a todos os dados do banco.
Esses dados sero atualizados a cada comando, como foi visto na
Listagem 9. importante ressaltar a necessidade de se referenciar
a propriedade ListData, e no o atributo listData. Isso essencial
porque, do contrrio, no haveria chamada ao mtodo OnPropertyChanged() (pois no seria a propriedade que mudaria) e o
listBox da View no seria atualizado.
Agora que h uma definio com relao ao recurso a ser utilizado, interessante preparar a interface. Trata-se de uma interface
bastante simples, dividida, basicamente, em trs partes: uma com
os campos para adio de novos consumidores, uma com os campos para atualizao e excluso dos mesmos e outra com o listBox
que contm todos os consumidores do banco de dados. A Figura 3
mostra como ficou a interface, ainda sem nenhum dado. Repare
que, como no h nenhum dado, o listBox direita se encontra
totalmente vazio. interessante ressaltar um detalhe com relao Listagem 10. Na ltima linha, definido um DataContext
para o Grid. Os controles WPF possuem a capacidade de herdar
propriedades de seus pais. Com isso, todos os controles filhos
do Grid que no possurem uma definio de DataContext iro
procurar, e encontrar essa definio, no prprio GridView.
BOX 6. DataTemplates
Templates de dados so utilizados para mostrar dados de um jeito particular. Basicamente, eles so
utilizados juntamente com objetos complexos, ou seja, objetos que possuem vrias propriedades
bsicas, como os Customers que foram criados nesse artigo. No caso, possvel mostrar em listBoxes,
comboBoxes e controles similares vrios tipos de itens de uma maneira particular, definida no prprio
template. Como um exemplo, com o advento desses templates, possvel para o desenvolvedor
mostrar Nome, Endereo e Telefone dos consumidores de uma forma organizada e rica. um dos
principais diferenciais do WPF para criao de interfaces de usurio ricas.
33
Autor
Henrique Machado Gasparotto
hmgasparotto@hotmail.com
Estudante de Engenharia de Computao na Universidade Federal
de Santa Maria UFSM e Tcnico em Informtica pelo SENAC
Santa Maria. Experincia em programao C# .NET e Java. Atualmente,
trabalha como bolsista no Laboratrio de Computao para Clima Espacial
no Centro Regional Sul de Pesquisas Espaciais (LCCE/CRS/INPE), com atividades voltadas
computao de alto desempenho.
Links e Referncias:
LINQ to SQL: .NET Language-Integrated Query for Relational Data
http://msdn.microsoft.com/en-us/library/bb425822.aspx
Figura 5. UI concluda
Concluso
Esse artigo trouxe uma nova abordagem a respeito de Data Binding em WPF. Alm disso, trouxe uma srie de conceitos, tericos
e prticos, a respeito de MVVM, que no possui muita literatura a
respeito, e a respeito de LINQ to SQL, com a criao de um banco
de dados puramente em classes do C#. So ferramentas muito
poderosas, que podem ser utilizadas juntas ou separadamente,
trazendo uma excelente forma de trabalhar com dados em aplicaes WPF.
35
Integration Services2012:
implementando solues
de ETL - Parte 1
Construindo solues para a integrao entre
sistemas
Este artigo faz parte de um curso
Resumo DevMan
Porque esse artigo til::
37
de um arquivo CSV (BOX 6) contendo o catlogo de uma distribuidora de produtos alimentcios fictcia. O arquivo em questo
no possuir cabealho, sendo formado pelos seguintes campos
(estes j na sequncia esperada, devendo ainda estar separados
por ponto-e-vrgula):
Cdigo do produto;
Nome do produto;
Categoria;
Fornecedor;
Preo Unitrio.
BI (sigla em ingls para Business Intelligence; termo tambm conhecido como Inteligncia
Empresarial) um conjunto de tcnicas que envolvem a coleta, o processamento e a gerao de
informaes a partir de dados gerados em operaes cotidianas de uma organizao. Este tipo de
procedimento busca, a partir de tais prticas, prover anlises que auxiliem profissionais de gesto
em atividades relacionadas tomada de decises.
a exportao de relatrios para formatos como planilhas do Excel e documentos PDF. Muito embora
corresponda a mais um dos servios que compem o SQL Server, o Reporting Services tambm pode
ser empregado na produo de relatrios que acessem outras bases relacionais (como Oracle, por
exemplo), bancos multidimensionais do Analysis Services ou, at mesmo, fontes de dados como XML
e Web Services.
BOX 6. Arquivos CSV
CSV (sigla do ingls Comma-separated values) um padro para a representao de dados em
um formato tabular. Arquivos deste tipo possuem a extenso .csv e, em termos prticos, nada mais
so do que sequncias de texto separadas por um caracter especial (o mais comum que se utilize
vrgula ou ponto-e-vrgula em tais representaes). O uso de arquivos .csv para a integrao entre
diferentes sistema corresponde a um tipo de prtica bastante comum, sendo que o prprio pacote
Office (por meio do Excel) oferece suporte a este tipo de formato.
Nota
Na seo de Links desse artigo possvel encontrar o endereo para download da extenso
Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2012.
39
Nota
Nota
Dentro do Visual Studio, a janela para definio de variveis pode ser acessada atravs do menu
SSIS, opo Variables.
A conexo connNorthwind foi criada a partir da opo New ADO.NET Connection..., a qual est
disponvel atravs do menu de atalho da seo Connection Managers.
Nota
A conexo connArquivoCSVProdutos foi gerada atravs da opo New Flat File Connection..., que
tambm est localizada no menu de atalho da seo Connection Managers.
DataType
OutputColumnWidth DataScale
CodProduto
40
Categoria
string [DT_STR]
15
Fornecedor
string [DT_STR]
40
41
Nota
Para acessar a propriedade Expressions de um controle, utilize a janela Properties do Visual Studio.
Script Task
43
J na linha 6 a varivel vNomeArquivoCSV est sendo preenchida com o nome completo (incluindo diretrio) do arquivo com
informaes de produtos;
Por fim, o valor de enumeration ScriptResults.Success atribudo propriedade TaskResult do objeto Dts, indicando assim que
a execuo do cdigo definido para o controle Script Task teve
sucesso (no caso de uma eventual falha, seria utilizado o valor
ScriptResults.Failure).
Listagem 1. Mtodo Main com as instrues para gerao de um novo nome de
arquivo
01 public void Main()
02 {
03 string nomeArquivoCSV =
04
Dts.Variables[pCaminhoGeracaoArquivosCSV].Value.ToString() +
05
Produtos_{0}.csv;
06 Dts.Variables[vNomeArquivoCSV].Value =
07
String.Format(nomeArquivoCSV,
08
DateTime.Now.ToString(yyyy-MM-dd_HHmmss));
09
10 Dts.TaskResult = (int)ScriptResults.Success;
11 }
Destino
Tecnologia empregada
Excel Source
Excel Destination
ODBC Source
ODBC Destination
Drivers ODBC
OLE DB Source
OLE DB Destination
Driver OLE DB
Arquivos binrios
45
partir do Visual Studio 2012 (da mesma maneira que uma aplicao .NET convencional). To logo o IDE tenha concludo este
procedimento, marcaes em verde aparecero em cada task da
seo Control Flow, indicando que a gerao do arquivo .csv teve
sucesso (Figura 23).
Na seo Execution Results (ainda dentro do Visual Studio)
ser ainda visualizar detalhes da execuo do pacote GeracaoCSVProdutos.dtsx (Figura 24). Eventuais erros estaro indicados
nesse local, servindo assim para que desenvolvedores possam
diagnosticar e corrigir problemas existentes em um package.
Um arquivo .csv dever constar ento no diretrio C:\Devmedia\
TesteVisualStudio\, como indicado na Figura 25.
47
aos recursos disponibilizados pela biblioteca Microsoft.SqlServer.ManagedDTS.dll, a qual permite que aplicaes Windows
Forms, Windows Service, ASP.NET e, at mesmo, Web Services
executem arquivos .dtsx sem maiores dificuldades.
A fim de demonstrar como este procedimento pode ser implementado em projetos .NET, estaremos criando uma Console Application chamada TesteIntegration01.ExecucaoLocalPackage.
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
}
39 }
40 }
package.Parameters[pCaminhoGeracaoArquivosCSV].Value =
ConfigurationManager
.AppSettings[CaminhoGeracaoArquivosCSV];
Console.WriteLine(
Executando localmente o package +
GeracaoCSVProdutos.dtsx...);
DTSExecResult resultado = package.Execute();
Console.WriteLine(
Resultado da execuo do package +
GeracaoCSVProdutos.dtsx: +
resultado.ToString());
Console.Write(
Pressione qualquer tecla para +
encerrar esta aplicao...);
Console.ReadKey();
A base MSDB um dos bancos de dados de sistema do SQL Server, sendo utilizada por este SGDB
em operaes que envolvam o backup/restore de outras bases, envio de e-mail, agendamento e
execuo de Jobs, armazenamento de packages do Integration Services (sobretudo em releases
anteriores verso 2012), dentre outras funcionalidades.
Este mtodo para a implantao de solues baseadas no Integration Services conhecido como Package Deployment Model
e, embora ainda seja possvel a utilizao desta alternativa, no
se recomenda mais que isso seja feito em conjunto com a verso
2012. Neste novo release do SQL Server foi disponibilizado um
modelo mais simplificado e flexvel para o deployment de aplicaes do Integration Services: trata-se do mecanismo conhecido
como Project Deployment Model.
Quanto ao funcionamento do modelo Project Deployment Model, possvel destacar:
O deployment de packages acontece agora a partir do Visual
Studio, atravs de uma funcionalidade que dispensa assim o uso
dos arquivos de manifesto requeridos pelo mtodo anterior;
Parmetros substituram os arquivos XML utilizados na manipulao de configuraes, procurando com isto facilitar o
gerenciamento das informaes necessrias ao funcionamento
de aplicaes do Integration Services;
Ser num repositrio chamado de catlogo que acontecer a publicao de projetos do Integration Services. Para cada instncia de
um servidor SQL Server poder ser criado somente um catlogo,
com este recurso fazendo uso do mecanismo conhecido como CLR
Integration (BOX 12) para a execuo de packages.
Nesta seo demonstremos como realizar o deploy de uma
aplicao do Integration Services a partir do Visual Studio. Alm
deste IDE, estaremos fazendo uso ainda do Microsoft SQL Server
Management Studio 2012.
49
Antes de proceder com a implantao de uma soluo do Integration Services, ser necessrio configurar o ambiente para a
execuo deste servio (caso isto ainda no tenha sido feito).
O primeiro passo consiste em habilitar o uso do Common Language Runtime da plataforma .NET. Na Listagem 5 apresentado
um script que ativa este mecanismo, utilizando para isto as rotinas
SP_CONFIGURE e RECONFIGURE.
Com a integrao junto ao CLR ativada, estaremos prosseguindo
agora com a criao do catlogo que armazenar os projetos do
Integration Services. Selecione dentro do SQL Server Management
Studio a opo Create Catalog..., que estar disponvel a partir
do menu de contexto para o item Integration Services Catalogs
(Figura 30).
Listagem 5. Habilitando o uso do CLR num servidor SQL Server
01 sp_configure clr enabled, 1
02 go
03 reconfigure
04 go
Figura 32. Acionando a opo para a criao de pastas a partir do catlog SSISDB
Neste momento j estaremos com o ambiente devidamente
configurado para a publicao da aplicao TesteIntegration01.
SSIS, conforme pode ser observado na Figura 34.
Para iniciar o processo de publicao do projeto TesteIntegration01.SSIS, acione a opo Deploy a partir do menu de
contexto desta aplicao no Visual Studio (Figura 35). Ser exibida neste instante a janela Integration Services Deployment
Wizard (Figura 36).
51
Crie dentro da seo Steps (Figura 44) o passo que ir acionar o package GeracaoCSVProdutos.dtsx. Na janela New Job
Step (Figura 45), preencha as seguintes configuraes:
Step name: identificao de um passo que far parte de um Job.
Informe o valor Acionar package GeracaoCSVProdutos.dtsx;
Type: tipo de ao a ser executada. O valor SQL Server Integration Services Packages permite invocar um pacote .dtsx
(que pode ser ter sido previamente publicado num servidor
SQL Server ou ainda, estar localizado em algum diretrio do
servidor);
Seo Package: informar o servidor em que se encontra
instalado o package GeracaoCSVProdutos.dtsx, assim como o
caminho deste dentro do catlogo SSISDB.
53
55
A referncia cmd (objeto do tipo System.Data.SqlClient.SqlCommand) invocar o stored procedure SP_START_JOB atravs
de uma chamada ao mtodo ExecuteNonQuery (linha 34), iniciando assim a execuo da rotina Job TesteIntegration01.SSIS.
Se no ocorrerem falhas durante a execuo do projeto (Figura 53),
um novo arquivo .csv ter sido gerado no diretrio C:\Devmedia\
TesteSQLServer (Figura 54).
Concluso
Este artigo procurou fornecer uma viso geral a respeito do Integration Services, enfatizando como tal servio pode ser empregado
na integrao entre diferentes sistemas. Por contar com um escopo
bastante abrangente no que se refere manipulao de informaes, esta ferramenta pode se revelar como um instrumento de
grande valia e flexibilidade nos mais variados contextos.
Dentre os cenrios mais comuns de uso do Integration Services, possvel destacar situaes nas quais o processamento
de um grande volume de informaes requer um bom nvel de
desempenho. importante ressaltar que esta nfase em questes
envolvendo performance uma preocupao central em grandes
Autor
Renato Jos Groffe
renato.groffe@yahoo.com.br - http://www.devmedia.com.br/
renatogroffe
Atua como consultor em atividades voltadas ao desenvolvimento de softwares h mais de 10 anos. Bacharel em Sistemas de
Informao, com especializao em Engenharia de Software. Microsoft
Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows
Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET
MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP,
SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.
Links:
How to: Install Sample Databases
http://msdn.microsoft.com/en-us/library/vstudio/8b6y4c7s.aspx
Integration Services Programming Overview
http://technet.microsoft.com/en-us/library/ms403344.aspx
Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2012
http://www.microsoft.com/en-us/download/details.aspx?id=36843
SQL Server Integration Services
http://technet.microsoft.com/en-us/library/ms141026.aspx
Whats New (Integration Services - SQL Server 2012)
http://technet.microsoft.com/en-us/library/bb522534.aspx
57
Resumo DevMan
Porque esse artigo til:
A utilizao de servios de compartilhamento de tela e controle
remoto til em situaes onde preciso automatizar uma tarefa
que deve ser realizada diretamente na interface grfica do sistema
operacional. Esta automao pode ser realizada atravs do envio de
comandos (teclas) e eventos do mouse para diversos computadores
remotos que tiverem um servidor VNC instalado. Este artigo mostra
exemplos de como enviar caracteres e eventos do mouse para um
servidor VNC remoto atravs de uma aplicao cliente desenvolvida
em linguagem C#.
ser transmitidos para o servidor detalhada no protocolo utilizado. Atualmente existem diversos protocolos empregados por
servidores de compartilhamento de tela, como o protocolo RDP
(Remote Desktop Connection), utilizado pelo servio Terminal
Services da Microsoft, e o protocolo RFB (Remote Framebuffer),
que empregado nos servidores de cdigo livre representados
pela sigla VNC (Virtual Network Connection). Este artigo se concentrar na utilizao do VNC devido facilidade de download,
instalao e execuo. Tambm se destaca a possibilidade de
criao de clientes VNC graas s bibliotecas de cdigo aberto
em C# existentes.
Antes de comearmos a detalhar como vamos criar uma aplicao cliente que acessa remotamente um servidor VNC, preciso
fazer a instalao do servidor e testar a conexo. Dentre as opes
gratuitas disponveis recomenda-se o RealVNC ou o TightVNC
(veja na seo Links). Estes dois softwares possuem pacotes para
download que contm tanto o servidor como ferramentas cliente
para as plataformas Windows, Mac OS e Linux.
Os leitores que desejarem executar os cdigos fontes apresentados neste artigo devem possuir um servidor VNC instalado
e configurado. Executar esta instalao simples e no requer
muitos passos, apesar de serem necessrios privilgios administrativos no computador e a eventual liberao de portas de
comunicao em um firewall. Uma vez que o servidor j esteja
instalado preciso saber qual o endereo IP (ou nome do host),
a porta utilizada (geralmente 5900) e definir uma senha para
controlar o acesso remoto. O protocolo VNC utiliza o tipo de
conexo TCP e, por isso, necessria uma conexo constante e
com uma boa qualidade para que o modo de interao remoto e
visualizao sejam adequados.
A partir do momento em que o servidor VNC est instalado
e com estas informaes em mos (endereo do host, porta e
senha), recomenda-se utilizar um segundo computador, ou seja,
um computador diferente daquele que possui o servidor VNC, e
testar a conexo remota com a ferramenta cliente disponibilizada
junto com o RealVNC ou o TightVNC. Uma vez que a conexo
esteja estabelecida, pode-se controlar remotamente o computador
que possui o servidor VNC instalado e interagir com o sistema
operacional como se o usurio estivesse fisicamente em frente
ao computador.
Um servidor VNC pode ser executado como um servio que
executado em background, isto , sem exigir interao com o
usurio. Desta maneira, quando o sistema operacional for iniciado o servio VNC iniciado junto e, a partir desde momento,
o servidor pode receber conexes remotas. Em geral, os servios
que trabalham desta forma possuem suas permisses limitadas
ao usurio do sistema operacional associado ao servio. Contudo,
um usurio remoto que se conecta no servidor pode realizar um
logon com qualquer usurio (fornecendo um login e senha do
sistema operacional) e obter o acesso desejado. Esta caracterstica
no uma falha de segurana, pois o que o servio VNC proporciona um acesso ao computador: se j houver algum usurio
logado, o servio VNC vai fornecer acesso ao computador como
59
Conhecendo as alternativas
O desenvolvedor da plataforma .NET que trabalha com C#
possui algumas alternativas para criar sua prpria aplicao
que age como cliente VNC. Tanto o RealVNC como o TightVNC
possuem verses com cdigo livre, porm elas so baseadas na
linguagem de programao C/C++. Os projetos mais populares
no .NET que disponibilizam classes e outros recursos para
acessar um servidor VNC em C# so o VNC-Client for .NET, o
.NET VNC Viewer e o VNCSharp.
O projeto VNC-Client for .NET contm apenas um exemplo de
como criar uma aplicao que se conecta a um servidor VNC
remoto. Ele faz uso do arquivo binrio das bibliotecas NzipLib
e DirectX e possui uma documentao simples das classes e
mtodos. Contudo, este projeto no foi criado na forma de uma
biblioteca autocontida que possa ser utilizada em qualquer
tipo de aplicao .NET (console, Windows Forms, WPF, ASP
.NET), o que requer do desenvolvedor um esforo grande para
trabalhar com seus mtodos e classes.
O projeto .NET VNC Viewer disponibilizado como uma
aplicao cliente criada a partir do tipo de projeto Windows
Forms. Apesar de ser completo, este projeto no disponibiliza
uma biblioteca e nem um controle. Alm disso, h no documentao do projeto e ele disponibilizado como um conjunto
de classes que deve ser compilado diretamente no console,
ou seja, no h uma soluo ou projeto do Visual Studio. Este
projeto no possui dependncias externas e nos testes realizados apresentou boa performance de atualizao da tela do
computador remoto.
Por fim, o projeto VNCSharp segue o modelo de licena GPL e
tambm apresentou boa performance de atualizao da tela do
computador remoto. Este projeto disponibilizado como uma
biblioteca .NET (assembly) que contm classes e um controle
do tipo Windows Forms. Apesar do projeto no estar mais em
A Figura 1 mostra a conexo remota com um servidor executando o Windows XP (note que o cone do VNC no canto esquerdo
da barra de tarefas do Windows mudou de cor para indicar a
conexo), enquanto a Figura 2 mostra uma conexo remota com
um computador executando o Mac OS Lion, que possui um servidor VNC nativo, isto , disponibilizado junto com o sistema
operacional. J a Figura 3 mostra um exemplo de conexo com um
dispositivo celular rodando o sistema operacional Android 4.0.4
(Ice Cream Sandwich) com um servidor VNC. Qualquer sistema
operacional que possua um servidor VNC que siga o padro do
protocolo RFB pode receber uma conexo do VncSharp, inclusive
sistemas operacionais das plataformas mveis (iOS, Android e
Windows 8).
Uma vez que o teste de conexo tenha sido realizado com sucesso, preciso utilizar a opo Disconnect do menu File para
finalizar a conexo e liberar os recursos utilizados do lado do
cliente.
Enviando caracteres
Para auxiliar o leitor a compreender como trabalhar com a biblioteca do projeto VNCSharp, este artigo apresentar um projeto
do tipo Console Application escrito em C# que utiliza apenas as
classes bsicas do VNCSharp. O objetivo mostrar como possvel
abrir uma conexo com um servidor VNC remoto, enviar uma
sequncia de caracteres como se fosse algo digitado pelo usurio
e fechar a conexo. Apesar de este exemplo ser simples, ele ilustra
bem como possvel utilizar o C# para se conectar a um servidor
VNC independente da plataforma e sistema operacional na qual
este servidor esteja sendo executado.
Apesar do exemplo apresentado neste artigo utilizar o tipo de
projeto Console Application, as classes do VNCSharp podem
ser utilizadas em qualquer tipo de aplicao .NET. H, inclusive,
a possibilidade de criar um cliente VNC inteiro em HTML5 e
ASP.NET para que o usurio possa acessar remotamente outros
computadores diretamente pelo browser sem a necessidade de
instalao de nenhum software adicional.
Um cliente VNC basicamente faz trs tarefas principais: ele controla a conexo (abrir/fechar), recebe a atualizao de telas e envia
teclas ou eventos do mouse. Tambm possvel realizar tarefas
mais complexas, como copiar o contedo do que foi colocado na
rea de transferncia do servidor remoto com o comando cpia
(ou Control+C) e colar (Control+V) este contedo no computador
que executa o cliente. Porm, como foi explicado na primeira
sesso deste artigo, veremos um exemplo que detalhar como
61
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
}
70 }
71 }
else
// Realiza as inicializaes necessrias
v.Initialize();
// Indicando o mtodo que vai receber o
// evento de desconexo
v.ConnectionLost +=
new EventHandler(ConsoleVNC.ClientConnectionLost);
// Comea a receber as atualizaes de tela
v.StartUpdates();
}
catch (Exception e)
{
// Problemas na conexo: informar usurio e finalizar
Console.WriteLine(Connection error: + e.Message);
return;
}
// Mostra informaes do host
Console.WriteLine(Connection OK!);
Console.WriteLine(Host Name: + v.HostName);
Console.WriteLine(Screen Size: +
v.Framebuffer.Width.ToString() + x
+ v.Framebuffer.Height.ToString() );
// Envia a frase Hello World with VNC para o host
ConsoleVNC.SendString(Hello World with VNC);
// Disconecta e libera os recursos
v.Disconnect();
Console.WriteLine(Disconnected!
Presse any key to terminate);
Console.ReadLine();
estamos prontos para receber as atualizaes de tela. Neste exemplo no iremos trabalhar com a atualizao de tela, pois apenas
vamos enviar um conjunto de caracteres para o servidor VNC.
Um ponto importante que toda a sequncia de conexo est
protegida por um bloco try/catch e as devidas mensagens de erro
so apresentadas, caso ocorra algum problema.
Aps a conexo entre o cliente e o servidor ser estabelecida,
possvel que, por algum motivo, o servidor encerre esta conexo.
Por exemplo: o computador que contm o servio VNC foi reinicializado. Devido a esta possibilidade a biblioteca VNCSharp possui
um evento que ser disparado no cliente caso o servidor encerre a
conexo. Para indicar um mtodo que ser chamado nesta situao
devemos preencher a propriedade ConnectionLost com um objeto
da classe EventHandler, que permite o acesso a um mtodo que
tratar este evento. No cdigo da Listagem 2 o mtodo esttico
ClientConectionLost() utilizado como evento para a propriedade
ConnectionLost do objeto v, que da classe VncClient.
O mtodo ClientConectionLost() segue a assinatura de um evento, ou seja, ele retorna void e possui dois parmetros: um objeto
da classe Object e um objeto da classe EventArgs. A utilizao
do evento ocorre quando o servidor finaliza a conexo e ela ser
simples, pois somente vamos chamar o mtodo Disconnect() da
classe VncClient para liberar os recursos alocados. Contudo, o
leitor pode codificar outras funcionalidades neste evento, como
notificar o usurio de alguma forma na interface grfica que o
servidor finalizou a conexo.
Uma vez que o primeiro passo esteja completo, ou seja, abrir
a conexo, podem mostrar algumas caractersticas do host.
A propriedade HostName da classe VncClient retorna o nome do
host e as propriedades Framebuffer.Width e Framebuffer.Height
retornam valores numricos com a largura e altura da tela do host,
respectivamente. O exemplo mostra estes valores para o usurio
e segue seu fluxo para enviar uma frase pelo VNC.
O envio da frase Hello World with VNC realizado atravs do
mtodo SendString(), que mostrado na Listagem 3. Este mtodo
basicamente recebe uma String como parmetro e faz um loop
para pegar cada caractere individual deste String, uma vez que
esta operao necessria, pois o mtodo WriteKeyboardEvent()
da classe VncCliente requer a converso de cada caractere enviado
para UInt32. Tambm necessrio passar o segundo parmetro
de WriteKeyboardEvent() como verdadeiro para simular que o
usurio realmente digitou algo.
No exemplo do cdigo apresentado na Listagem 3 um texto foi
enviado por meio da converso de cada um dos caracteres para
Tecla
Valor numrico
(UInt32)
Tecla
Tab
0x0000FF09
F1
0x0000FFBE
Enter
0x0000FF0D
F2
0x0000FFBF
Esc
0x0000FF1B
F3
0x0000FFC0
Home
0x0000FF50
F4
0x0000FFC1
0x0000FF51
F5
0x0000FFC2
0x0000FF52
F6
0x0000FFC3
0x0000FF53
F7
0x0000FFC4
0x0000FF54
F8
0x0000FFC5
PageUp
0x0000FF55
F9
0x0000FFC6
PageDown
0x0000FF56
F10
0x0000FFC7
End
0x0000FF57
F11
0x0000FFC8
Insert
0x0000FF63
F12
0x0000FFC9
Shift
0x0000FFE1
Alt
0x0000FFE9
Ctrl
0x0000FFE3
Delete
0x0000FFFF
63
Boto do mouse
Esquerdo
Meio
Direito
16
possvel simular a situao onde mais de um boto foi pressionando adicionando os valores numricos. Por exemplo, se desejarmos indicar que os botes direito e esquerdo foram pressionados
juntos utilizaremos o valor 5, pois 1+4 = 5.
Devemos tomar cuidado com um ltimo detalhe antes de enviar
um evento de clique do mouse com o mtodo WritePointEvent():
nos sistemas operacionais que seguem o modelo de interface
WIMP (BOX 1) um clique do mouse geralmente representado
por dois eventos: MouseDown e MouseUp. Isto quer dizer que
precisamos fazer duas chamadas aos mtodos WritePointEvent()
para simular um clique do mouse, sendo que a primeira delas deve
indicar qual foi o boto utilizado e a segunda chamada indica o
valor 0 (ausncia de boto).
BOX 1. Interfaces WIMP
WIMP um acrnimo usado para descrever todos os elementos de sistemas operacionais que
definem o modo como interagimos com os computadores cuja GUI (Graphical User Interface
Interface Grfica de usurio) seja baseada em janelas.W significa Windows (janelas), I significa Icons
(cones), M significa Menus e P significa Pointers (ponteiros).
Em 1973 a Xerox desenvolveu o primeiro sistema operacional com um paradigma WIMP para o Xerox
Alto. Desde aquela poca at recentemente as GUI baseadas em WIMP foram as lderes da interao
entre humanos e computadores. Sistemas operacionais como o Windows, Mac OS, OS/2 e o Linux
adotaram os conceitos WIMP em suas interfaces, o que facilitou a interao para os usurios que
utilizam mouse e teclado.
Com as novas tecnologias e recursos para desenvolvimento de pginas Web, muitos dos conceitos
WIMP vem sendo desafiados, como a ausncia de menus tradicionais. Alm disso, os sistema
operacionais mveis como iOS, Android e Windows 8 abandonaram muitos dos conceitos WIMP ao
adotarem interfaces baseadas em toques e gestos realizados diretamente no dispositivo sensvel a
toque que apresenta as informaes.
Concluso
A utilizao de tecnologias de compartilhamento de tela e controle remoto representa uma oportunidade para a realizao de
tarefas que necessita do acesso completo local a um computador.
Apesar e ser possvel realizar diversas operaes com ferramentas de acesso remoto ao shell, tais como ferramentas de SSH ou
mesmo servidores de FTP/SFTP, o acesso direto ao desktop de um
computador pode fornecer diversas oportunidades para automao de tarefas, treinamento de usurio, resoluo de problemas
de suporte, deploy de aplicaes, verificao de configuraes e
outras.
As principais ferramentas de compartilhamento de telas livres,
agrupadas sob a sigla VNC, permitem o acesso remoto completo
de um servidor, porm elas representam potenciais problemas de
segurana e violao de privacidade. Por exemplo, atravs do acesso por VNC um usurio com ms intenes pode acessar arquivos
pessoais de usurios ou mesmo observar a digitao de senhas
e outras informaes sigilosas. Neste contexto, permitir o acesso
remoto por meio do VNC se torna uma atitude arriscada.
Contudo, possvel criar uma aplicao na plataforma .NET que
encapsula o acesso remoto a um servidor VNC. Esta aplicao
pode se conectar a um host remoto e enviar determinadas teclas
ou eventos do mouse e realizar certas tarefas sem nem ao menos
mostrar para quem iniciou este cliente VNC a tela do desktop
remoto. Desta maneira evitam-se possveis problemas de violao
de privacidade.
Apesar da tecnologia envolvida nos servidores VNC ser bsica,
ou seja, permite apenas o envio de teclas e eventos do mouse e
recebe do host a atualizao de telas, existem vrias possibilidades
para incluir novas funcionalidades. Criptografia das informaes, ferramentas de chat com texto e VoIP, envio/transferncia
de arquivos e acesso por meio da Web so apenas algumas das
funcionalidades adicionais que no so contempladas pelo protocolo RFB e que podem ser agregadas em uma soluo que utilize
tecnologias de compartilhamento de tela.
65
Outro cenrio de uso para esta tecnologia envolve o treinamento. Em uma situao onde no h recursos para treinamento
adequados (projetores, sala de treinamento, etc) possvel treinar
usurios de forma automatizada diretamente nas suas interfaces, sem a necessidade de locomoo do usurio. Este tipo de
treinamento com demonstraes fornece a sensao de presena
remota e o usurio que est sendo treinado pode acompanhar as
aes sendo realizadas como se o instrutor estivesse trabalhando
junto com ele.
Outra forma para utilizar o compartilhamento de contedo ou
apresentao so seminrios Web ou webinars. Em um webinar
um apresentador envia um convite por e-mail a um grupo de participantes que inclui um link e um cdigo de acesso. Quando os
participantes clicarem no link e digitarem seus cdigos de acesso
eles esto registrados na apresentao virtual. Neste cenrio s
pode haver um apresentador de cada vez que pode compartilhar
seu desktop, suas apresentaes com programas como o PowerPoint, ou partes de outras aplicaes e software no computador
host. Com o software de webinar, que baseado em tecnologias
de compartilhamento de tela, cada apresentador pode compartilhar o seu prprio ambiente de trabalho e arquivos. Talvez o
exemplo mais claro deste tipo de tecnologia seja representado
pelos servios da empresa WebEx (parte do grupo da Cisco) que
fornece aplicativos de demanda, reunio online, web conferncia
e aplicaes de vdeo conferncia.
Com a utilizao de um servidor VNC tambm possvel criar
um servio de monitorao constante do desktop de um computador remoto. Tal ferramenta pode ser til para revisar aes
realizadas ou medir o tempo gasto em determinada aplicao.
Por exemplo: um gerente de projeto deseja saber quanto tempo
um programador passou como a interface do Visual Studio aberto
e quanto tempo ele passou navegando na internet. Ao invs de
programar um servio especfico para este tipo de monitorao,
possvel instalar um servidor VNC no computador do desenvolvedor e criar um cliente VNC em C# que periodicamente l a tela
do desenvolvedor e grava a tela em uma sequncia de imagens
ou em um banco de dados. Posteriormente o gerente de projeto
pode revisar as imagens e verificar exatamente quanto tempo o
desenvolvedor gastou na interface do Visual Studio ou no navegador. Alm disso, o gerente de projeto tambm pode identificar
como o programador utilizou o IDE ou mesmo qual tipo de site
foi visitado pelo programador. Novamente, este uso da tecnologia
VNC possui implicaes no campo da privacidade e segurana
que devem ser consideradas com cautela por quem emprega este
tipo de tecnologia para fins de monitoria.
O leitor que desejar automatizar tarefas remotas que exigem
acesso direto ao servidor em diversas mquinas pode se beneficiar
do contedo apresentado neste artigo, uma vez que ele mostrou
como possvel desenvolver uma aplicao .NET na linguagem
C# que age como um cliente de um servidor VNC atravs do uso
das classes fornecidas pelo projeto VNCSharp.
Autor
Mauro Pichiliani
mauro@pichiliani.com.br http://pichiliani.com.br
bacharel em Cincia da Computao, mestre e doutorando
pelo ITA (Instituto Tecnolgico de Aeronutica) e MCP, MCDBA e
MCTS. Trabalha h mais de 10 anos utilizando diversos bancos de dados
SQL e NoSQL. colunista de SQL Server do web site iMasters (http://www.
imasters.com.br) e mantenedor do DatabaseCast (@databasecast), o podcast brasileiro
sobre banco de dados.
Links:
Projeto VNC-Client for .NET
http://sourceforge.net/projects/dnvnccl/
Projeto.NET VNC Viewer
http://sourceforge.net/projects/dotnetvnc/
Projeto VNCSharp
http://cdot.senecac.on.ca/projects/vncsharp
Servidor e cliente VNC gratuito RealVNC para Windows, Mac OS e Linux
https://www.realvnc.com
Servidor e cliente VNC gratuito TightVNC para Windows, Mac OS e Linux
http://www.tightvnc.com/
OnLive Games
http://games.onlive.com/
67