Boa tarde..
A partir da versão 2.0 da MIDP, os programadores Java podem permitir que aplicativos Java ME (MIDlets) possam ser iniciados de forma automática, sem intervenção do usuário. Este mecanismo é chamado de Push Registry. O objetivo desse post não é explicar de forma detalhada o Push Registry, porém, de forma sucinta, basta saber que é possível programar sua MIDlet pra iniciar automaticamente após um intervalo de tempo ou, com eventos externos, como chegada de mensagem SMS, MMS, Bluetoooth, conexão por socket etc.

A Figura anterior mostra as formas de ativação de uma MIDlet. A “Manual Activation by user” é a forma normal, onde o usuário vai até o menu de aplicativos do dispositivo e inicia a aplicação. Os dois modos de ativação ao lado foram adicionados com o advento do Push Registry.
Bem, dito isso, uma das formas de ativação de MIDlet é com conexão Bluetooth. Para fazer isso, podemos usar a JSR-82, um pacote ocional do Java ME para troca de dados entre dispositivos através de uma conexão Bluetooth ou, utilizar a API Marge. Esta API criada por brasileiros, facilita a criação de aplicativos que utilizem Bluetooth, escondendo um pouco a complexidade da JSR-82.
Para adicionar o mecanismo de Push Registry a um aplicativo tem duas formas: estática ou dinâmica. A forma estática é a mais simples, basta adicionar uma nova linha ao descritor da aplicação, o famoso .JAD. Além disso, é preciso dar permissão de uso para algumas classes. Veja as duas linhas que precisei colocar no arquivo JAD do meu projeto:
MIDlet-Permissions: javax.microedition.io.PushRegistry, javax.microedition.io.Connector.bluetooth.server, javax.microedition.io.Connector.bluetooth.client
MIDlet-Push-1: btspp://localhost:D0FFBEE2D0FFBEE2D0FFBEE2D0FFBEE2,hello.HelloMIDlet,*
A linha de permissões é auto explicativa, a linha MIDlet-Push-1 define um push registre estático. O btspp define o protocolo, a seguir definimos o dispositivo (localhost) e seu UUID como D0FFBEE2D0FFBEE2D0FFBEE2D0FFBEE2. Este UUID é um número de 32 bits que define um identificador único universal. Porque coloquei este número hexadecimal? Porque criei um servidor Bluetooth anteriormente no celular e mandei mostrar no display qual era o UUID que o servidor criado recebia, com isso, fiquei sabendo qual o código universal do aparelho. Depois da vírgula defini qual a classe que será iniciada com esse evento de push resgistry. Finalmente, no último parâmetro é possível criar filtros, no meu caso não coloquei nenhum, passando apenas *.
Bem, o leitor deve ter percebido que para fazer isso precisa conhecer o UUID do aparelho, oque não é muito usual, levando em conta que seu aplicativo será distribuído para N plataformas. Então, a solução é o push registry dinâmico, construído via código fonte. A listagem de código abaixo demonstra como criar um push registry dinâmico:
1: public void registra()
2: {
3: ServerConfiguration config = new ServerConfiguration(this);//communicationListener
4: config.setMaxNumberOfConnections(10);
5: getFrmMain().append(”UUID: “+config.getUuid().toString());
6: communicationFactory.waitClients(config, this);
7:
8: String midletClassName = this.getClass().getName();
9: String url = “btspp://localhost:”+config.getUuid().toString();
10: String filter = “*”;
11:
12: try
13: {
14: PushRegistry.registerConnection(url, midletClassName, filter);
15: }
16: catch (ClassNotFoundException ce)
17: {}
18: catch (IOException io)
19: {}
20: }
Na linha 3 crei uma instância de ServerConfiguration, passando como parâmetro a própria classe que implementa a interface CommunicationListener. A linha 6 poderia ser removida, porque apenas inicia o servidor bluetooth e espera por conexão de clientes, porém, o objetivo aqui é só saber o UUID, mas, deixei a linha de código no lugar até para uma questão de aprendizado. As linhas 8, 9, e 10 definem os parâmetros que serão usados para a criação do push registry. Destaque para a linha 9, que utiliza o código config.getUuid().toString() para recuperar a UUID que é usada pela instância de ServerConfiguration que criei. Finalmente, na linha 14 é onde cria-se de fato o push registry.
Bem, acho que é possível notar que não é dificil fazer um Push Registry através de Bluetooth e, fica bem bacana.
Att.
Ping
| Tweet |
|---|




7 comentários
Ricardo, fiquei com uma dúvida. Como eu faço para ativar essa entrada do push registry através do bluetooth? Sei que preciso fazer uma requisição para alguma URL, mas qual seria ela nesse caso? Não consegui pensar em nada para resolver esse problema.
Fevereiro 8th, 2009 às 01:53
Olá Rodrigo..
Não entendi muito bem sua pergunta, por favor, especifique mais sua dúvida. Segunda é dífícil entender as coisas :).
Att.
Ping
Fevereiro 9th, 2009 às 16:06
Opa Ricardo, to de volta.
Vou tentar ser mais claro dessa vez.
Após seguir os passos descritos acima (ou em outros lugares na internet), podemos considerar que a entrada está registrada no push registry do dispositivo ’servidor’, certo?
Agora a idéia é que haja um outro dispositivo bluetooth que seja capaz de estabelecer, com o ’servidor’, uma conexão que inicie a aplicação no ’servidor’. Estou tentando descobrir qual seria, no exemplo que você deu, a URL de conexão que eu deveria usar para ativar essa aplicação.
Espero que tenha conseguido me fazer entender dessa vez… obrigado pela força!
Fevereiro 14th, 2009 às 03:08
Olá Rodrigo..
Acho que agora entendi. Na verdade não existe string de ativação para se comunicar com o dispositivo servidor. O push registry vai startar a MIDLet quando chegar qualquer evento bluetooth no aparelho, sendo assim, não é necessário um código especial nesse outro celular, apenas a conexão com o servidor.
Att.
Ping
Fevereiro 14th, 2009 às 20:13
Agora entendi. Achei que dava para escutar uma ‘porta’ específica, buscando iniciar o aplicativo apenas com um evento específico de uma aplicação minha.
De qualquer maneira, muito obrigado!
Fevereiro 15th, 2009 às 14:10
Na verdade, o que não é conhecido é o endereço bluetooth do aparelho. Esse valor de UUID é simplesmento o valor padrão da biblioteca marge. Pode ser facilmente alterado na classe MargeDefaults do pacote net.java.dev.marge.entity.config
Outubro 5th, 2009 às 14:55
Obrigado pela explicação William..
Att.
Ping
Outubro 7th, 2009 às 18:48
Envie seu comentário