DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Usando a Porta Infravermelha com o Compact Framework

Como usar a porta infravermelha de seu Smartphone (funciona também para PocketPC's) para transferir informações entre esses dispositivos.

por:José Antonio Leal de Farias

Introdução

Com todo o oba-oba ao redor do Wi-Fi, do Bluetooth e de outras tecnologias sem-fio, é fácil esquecer a um das formas mais simples e comuns de comunicação sem fio: a infravermelha. Qualquer um que já usou um controle remoto usou o infravermelho! Como usa-se a luz como meio de transporte, é necessário que um ponto “enxergue” o outro, mas mesmo com essa limitação, o infravermelho está cada vez mais popular em aparelhos como câmeras digitais, Celulares, PDA's  e NoteBooks.

Neste artigo mostrarei como usar a porta infravermelha de seu Smartphone (funciona também para PocketPC's) para transferir informações entre esses dispositivos. Iremos criar uma simples aplicação de Chat usando a classe IrDAClient do Compact Framework. Essa aplicação pode ser bastante útil em reuniões tediosas.

Vamos lá!

Construindo a aplicação

Para começar, rode o Visual Studio .NET 2003 e criar um projeto “Smart Device Application” usando o C#, como mostrado na figura 1. Chame o projeto de IrdaChat.

 

Figura 1 – Criando a aplicação

 Agora vamos construir a interface da aplicação do Chat. Baixe os seguintes controles no Form1 (veja a figura 2):

Dois TextBoxes;
MainMenu (já é criado automaticamente);
Dois Labels.

 

Figura 2 – Interface do Chat

 O controle do menu tem um sub-item chamado “Nome do Serviço” dentro do menu “Configurações”.

 O TextBox maior deve se chamar txtMessagesArchive e ter a propriedade MultiLine setada como true. O outro TextBox deve se chamar txtMessage.

Agora você precisa declarar o uso de alguns namespaces, como na listagem 1:

 Listagem 1 – NameSpaces adicionais necessários ao projeto.

using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

 Para usar a classe IrDAClient no Compact Framework, que fornece os serviços de comunicação infravermelha, você vai precisar adicionar uma referência ao assembly System.Net.IrDA. Para fazê-lo, clique com o botão direito no nome do projeto na Solution e selecione “Add Reference”, como na figura 3.

 

Figura 3 – Adicionando a referência

 Clique 2 vezes sob o item System.Net.IrDa e clique OK.

Declare também estes objetos e constantes da classe Form1, da listagem 2.

 Listagem 2 – Membros adicionais da classe Form1

private const int MAX_MESSAGE_SIZE = 128;
private const int MAX_TRIES = 3;
private string ServiceName = "default";
private IrDAClient irdaClient = new IrDAClient();
private Stream irStream;

A constante MAX_MESSAGE_SIZE é o tamanho máximo da mensagem trocada e a MAX_TRIES é o número máximo de tentativas para enviar uma mensagem antes de desistir e avisar um erro no envio.

O atributo ServiceName é usada para identificar a sessão de uso do Chat. O objeto irdaClient contém os serviços da comunicação infravermelho e o irStream serve para conter os dados recebidos e enviados.

Recebendo Mensagens

Quando a aplicação está carregada, ela precisa começar a “ouvir” as mensagens que possam chegar. Para fazer isso, coloque o código da listagem 3 no evento OnLoad() do formulário. 

Listagem 3 – Evento OnLoad() do form1

private void Form1_Load(object sender, System.EventArgs e)
{
Thread t1 = new Thread(new ThreadStart(receiveLoop));
       
t1.Start();
}
 

Basicamente esse evento cria um thread para invocar o método receiveLoop(). O objetivo aqui é “ouvir” as mensagens em background, para que você possa enviar mensagens a qualquer momento.

Na listagem 4 temos o código do receiveLoop().

 Listagem 4 – Método receiveLopp()

private void receiveLoop()
{
        string strReceived;
        strReceived = receiveMessage(MAX_MESSAGE_SIZE);
       
while (true)
        {
                if (strReceived != "")
               
{
                        UpdateTextBox(strReceived);
                        strReceived = receiveMessage(MAX_MESSAGE_SIZE);
               
}
        }
}

 A principal função deste método é invocar repetidamente o método receiveMessage(). Este método retorna a mensagem recebida pela porta infravermelha e seu código é o da listagem 5.

 Listagem 5 – Método que recebe as mensagens

private string receiveMessage(int BufferLen)
{        
int bytesRead = 0;
        IrDAListener listener = new IrDAListener(ServiceName);
        IrDAClient client = null;
        System.IO.Stream stream = null;
        byte[] Buffer = new byte[MAX_MESSAGE_SIZE];
       
string str = "";
        try
       
{
                listener.Start();
                client = listener.AcceptIrDAClient();
                stream = client.GetStream();
                bytesRead = stream.Read(Buffer, 0, BufferLen);
                str = client.RemoteMachineName + "->";
      str += Encoding.ASCII.GetString (Buffer, 0, bytesRead);
       
}
        catch (Exception e)
        {
                MessageBox.Show ("Erro obtendo a mensagem");
        }
        finally
       
{
                if ((!(stream == null)))
                {
                        stream.Close();
                }
                if ((!(client == null)))
                {
                        client.Close();
               
}
                listener.Stop();
        }
        return str;

Vou explicar melhor o funcionamento deste método. Primeiro estabelecemos os objetos relevantes para este método. Em particular, criamos um objeto IrDAListener que é usado para escutar os dados recebidos pela porta infravermelha e contém o Nome do Serviço. Dois dispositivos conversando entre si pela porta infravermelha devem ter o mesmo nome de serviço.

Criamos também um objeto IrDACliente para enviar e receber dados de outro dispositivo.

O objeto IrDAListener começa ouvindo dados de entrada e retorna um objeto IrDACliente quando dados são recebidos. Então usamos um objeto stream para ler o fluxo de dados. Finalmente o método receiveMessage() retorna os dados formatados já prontos para serem exibidos no formulário.

Enviando mensagens

Agora que nosso programa já está pronto para receber as mensagens, só temos que enviá-las! Então, quando a opção “Enviar” do menu principal é selecionada, o seguinte código é executado: 

Listagem 6 – Evento da opção “Enviar” do menu principal

private void menuItem3_Click(object sender, System.EventArgs e)
{
sendMessage(MAX_TRIES,
Encoding.ASCII.GetBytes(txtMessage.Text),  
txtMessage.Text.Length);
}

 O método sendMessage() primeiro tenta estabelecer uma conexão com o outro aparelho até que o número de novas tentativas seja excedido. Uma vez que a conexão seja estabelecida, ele escreve a mensagem usando o objeto de io stream e finalmente fecha o fluxo de dados e a conexão.

 Listagem 7 – Método para enviar mensagems

private void sendMessage(int NumRetries, byte[]Buffer, int BufferLen)
{
        IrDAClient client = null;
        int CurrentTries = 0;
       
do
        {
                try
               
{
                        client = new IrDAClient(ServiceName);
                }
                catch (SocketException se)
                {
                        if ((CurrentTries >= NumRetries))
                        {
                               throw se;
                        }
                }
                CurrentTries = CurrentTries + 1;
        } while (client == null & CurrentTries < NumRetries);
       
if ((client == null))
        {
                MessageBox.Show("Erro estabelecendo conexão");
               
return;
        }
        System.IO.Stream stream = null;
       
try
       
{
                stream = client.GetStream();
                stream.Write(Buffer, 0, BufferLen);
       
}
        catch (Exception e)
        {
                MessageBox.Show("Erro enviando");
        }
        finally
       
{
                if ((!(stream == null)))
                {
                        stream.Close();
                }
                if ((!(client == null)))
                {
                        client.Close();
               
}
        }
}


Mudando o Nome do Serviço

Por default, o nome do serviço dos dois aparelhos que se comunicam é setado para ser ‘default'. No entanto o usuário pode mudar esse nome usando a opção do menu ‘Nome do Serviço'. Neste artigo, esta função apenas troca o nome do serviço para “default2”. Você pode posteriormente criar um formulário para pedir este novo nome.

 Listagem 8 – Mudando o nome do serviço

private void menuItem2_Click(object sender, System.EventArgs e)
{
        ServiceName = “default2”;
}

 Conclusão

Com este artigo você adquiriu o conhecimento necessário para desenvolver aplicações que transfiram informações através da porta infravermelha usando o .NET Compact Framework. Agora você pode incluir em suas aplicações recursos para troca de dados sem necessariamente precisar de infra-estruturas caras, como wi-fi, para a transferência de dados sem fio. Divirta-se!

 

 

José Antonio Leal de Farias, jalf@infocon.com.br é bacharel em computação pela UFCG, programador profissional nas linguagens C++ e C# e líder do grupo de usuários CGSharp. E adora Smartphones! Veja seu blog em http://br.thespoke.net/MyBlog/Jalf/MyBlog.aspx





    0 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


Nenhum comentário foi postado - seja o primeiro a comentar!



[Este post ainda não foi associado a uma sequência]
Publicidade
Autor
José Antonio Leal De Farias

José Antonio Leal de Farias (jalf@infocon.com.br) é MVP, bacharel em ciências da computação pela UFCG e atualmente é Gerente de Pesquisa e Desenvolvimento da Light Infocon S.A. É programador profissional nas linguagens C++ e C#, líder do grupo de usuários CGSharp e adora Smartphones! Veja seu blog e...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
0   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03