magem_pdf.jpg src="/imagens/imagem_pdf.jpg" width=34 border=0>

Mini-Curso

Programação Java ME

MINI-CURSO DE JAVA ME: PARTE 6

 

Nesta última parte do mini-curso que iniciamos na Edição 44, falaremos de mais algumas APIs importantes da MIDP. Mas ao contrário da abordagem mais aprofundada que dedicamos a outras APIs, daremos uma visão mais ampla e abordaremos várias outras tecnologias. Terminamos, então, da mesma forma como começamos: com uma visão geral – porém dessa vez, mais aplicada, falando de diversos tópicos de programação Java ME.

 

WMA: Mensageria1

Em qualquer rede onde a comunicação é cara, lenta ou pouco confiável, o paradigma de troca de mensagens assíncronas é proveitoso. Um bom exemplo disso é o e-mail; exemplos mais sofisticados incluem JMS e Especiweb services. O uso de mensagens não exige manter conexões abertas por muito tempo, o que reduz a dependência de redes baratas e confiáveis. Também não exige sincronização entre transmissor e receptor, o que diminui a dependência de redes rápidas (pois o tempo de execução do transmissor não é prejudicado por lentidão ou excesso de carga de um receptor, nem vice-versa).

Estas qualidades tornam o SMS2 ideal para muitos tipos de aplicações. O SMS vai além do seu uso comum para “bate-papo” via celular. Essas mensagens também podem ser enviadas de forma automática por aplicações. Isso também é bastante difundido, por exemplo pelos serviços de extrato via celular oferecidos por bancos.,

Nota 1: O termo “mensageria” é um tradução comum do inglês messaging, um “sub-paradigma” de programação (de rede, concorrente/paralela ou OO) fundamentado na troca de mensagens discretas e possivelmente assíncronas entre aplicações (ou tarefas, threads etc.). Tem vantagens como baixo acoplamento, garantia de entrega através de enfileiramento, bem como concorrência facilitada (pois no contexto de concorrência, o uso de messaging não exige locks). Neste artigo, nos concentramos na aplicação deste paradigma à programação de rede.

Nota 2:  Neste artigo, uso SMS no lugar de “SMS, MMS ou CBS”, para simplificar. Todas essas modalidades de mensagens são suportadas pela WMA. Para CBS (Cell Broadcast Service), a WMA só suporta recepção (nenhuma operadora permitiria a clientes comuns originar mensagens CBS, que são entregues em massa para todos os aparelhos no alcance de uma ou mais estações-base).

 

Indo além, mensagens SMS podem ser consumidas por aplicações. Por exemplo, num cenário corporativo, poderíamos ter funcionários que trabalham em campo (ex.: vendedores) recebendo de forma automática mensagens com atualização de informações relevantes ao seu trabalho, como um desconto de última hora. Os funcionários não leriam as mensagens (nem saberiam que estão recebendo mensagens SMS); só veriam o efeito indireto dessas mensagens numa aplicação. Veja o quadro “Enviando SMS a partir do seu PC”.

A API da WMA – javax.wireless.messaging (JSR-120) – se encaixa no framework definido pelo GCF (Generic Connection Framework). Uma URL com o tipo “sms:” é usada para abrir uma MessageConnection cliente (capaz somente de enviar mensagens), ou servidora (capaz de enviar e receber). O código a seguir abre uma conexão de cliente e envia uma mensagem:

 

MessageConnection conn =

(MessageConnection) Connector.open("sms://123456789");

TextMessage msg = (TextMessage)conn.newMessage(

MessageConnection.TEXT_MESSAGE);

msg.setPayloadText(“Um dois três testando, câmbio e desligo!”);

conn.send(msg);

 

Para receber uma mensagem, pode-se  usar o PushRegistry, uma facilidade que vimos na Edição 47. O PushRegistry permite que uma MIDlet registre, através de uma API ou dos seus descritores, que quer ser notificada do recebimento de determinado evento. Veja um exemplo desse tipo de registro no descritor (JAD):

 

MIDlet-Push-1: sms://:50001, MIDletReceptora, *

 

Aqui usamos uma “URL de servidor”, na qual o número do aparelho é omitido, mas especificamos um número de porta. Pode haver várias MIDlets no mesmo aparelho desejando receber mensagens SMS. Basta que usem portas diferentes. Numa conexão de cliente também é possível especificar a porta; caso omitida, a mensagem é enviada para o Inbox do aparelho.

 

WMA para mensageria?

A WMA é freqüentemente comparada  a APIs de e-mail, mas também possui recursos de mensageria generalizada (como a JMS). Primeiro, assim como a JMS (mas diferentemente da JavaMail), a WMA permite enviar mensagens assíncronas de qualquer tipo – além de TextMessage, existe também o tipo BinaryMessage que comporta até 140 bytes3, sem necessidade de um encoding ASCII como o base64.

Nota 3:  Para uma TextMessage o limite é de 160 caracteres, pois os caracteres são codificados com 7 bits cada. Exceto para línguas como o chinês que precisam de codificação Unicode de 16 bits, resultando num limite de 70 caracteres.

 

Segundo, as mensagens da WMA trafegam com grande eficiência nas redes móveis, beneficiando-se de transmissão out-of-band4. Mas o uso da WMA como middleware de integração esbarra na tarifação por mensagem. Caso contrário, seria uma boa opção para usos como jogos online multiusuário e outras aplicações que necessitem da troca intermitente (freqüente, mas não contínua) de dados – seja ponto a ponto ou com intermédio de um servidor central. A tendência pela oferta de planos com acesso ilimitado a serviços de dados talvez mude isso, abrindo as portas para muitas oportunidades. 

Nota 4: Nesse tipo de transmissão, usa-se um canal de comunicação distinto do normalmente usado para dados ou voz. Este canal normalmente só é usado para pacotes de informações de controle, sendo menos congestionado. Por outro lado, canais out-of-band só são adequados para mensagens curtas e isoladas, não para protocolos com conexão de longo prazo, garantia de entrega e outras complicações. Por isso existem os limites do SMS, como o tamanho máximo de 140 bytes por mensagem.

 

Enviando SMS a partir do seu PC

Quando se fala de usos corporativos de SMS, vem a dúvida: como faço para mandar para os celulares ou PDAs dos meus vendedores, técnicos de manutenção, estoquistas etc., mensagens SMS com dados extraídos do meu sistema?

Isso é possível, mas infelizmente não é tão simples para que possamos explorar a técnica aqui (exigiria um artigo dedicado). Funciona assim: a operadora disponibiliza, na internet, um gateway para a sua rede móvel. Este gateway geralmente disponibiliza um web service. Os dados da mensagem são codificados em uma requisição no formato especificado pelo gateway. Ao receber esta requisição, o gateway se comunica com o SMSC (Short Message Service Center) da operadora, o qual gera e envia a(s) mensagem(s) SMS correspondentes na rede móvel.

Quem quer enviar as mensagens precisa possuir uma “large account”, que é uma espécie de número telefônico especial, que funciona como número de origem das mensagens SMS e é usado para finalidades como faturamento. O custo do serviço varia conforme o caso (operadora, volume médio de mensagens, condições de negociação). Pode ser menor que o custo de mensagens enviadas por usuários comuns, mas não foge muito disso. Pode haver um custo mínimo que inviabilize o serviço para clientes que enviariam um número de mensagens muito pequeno, mas este custo pode ser minimizado fazendo a multiplexação de uma large account entre vários interessados. Há empresas integradoras que oferecem serviços de brokering (intermediação) de SMS, fazendo contratos com diversas operadoras e oferecendo a clientes interessados em envio de SMS um serviço mais conveniente, ex.: com um gateway único para qualquer operadora, e com custos mais acessíveis mesmo para volumes pequenos de mensagens.

Você pode diminuir os custos ainda de outra forma. Imagine, por exemplo, um sistema de suporte a vendas que envia notificações de preços atualizados como: “Rebimboca da Parafuseta: R$ 99,50”. É desperdício enviar uma mensagem SMS só com isso, pois a mensagem comporta muito mais dados pelo mesmo preço (para ser exato, cerca de quaro vezes mais, considerando o limite padrão de 160 caracteres). Então, a aplicação transmissora poderia enfileirar notificações (pelo menos as que não forem urgentes) e enviar uma mensagem somente quando a fila atingisse o limite de tamanho. ...

Quer ler esse conteúdo completo? Tenha acesso completo