Multicast no Android 2.2
Pergunta
Alguém conseguiu o Multicast trabalhar no Android 2.2, especificamente JMDNs para detecção de serviços Bonjour. Existem muitas perguntas e respostas do período do Android 1.5-> 2.0, inclusive no Stackoverflow, que indicam níveis variados de sucesso e um bug no rastreador de bugs que indicam que foi corrigido e fechado para 2,2 (http://code.google.com/p/android/issues/detail?id=2323). Eu tentei o código -fonte "TuneControl", mas funcionou em ~ 1,5 e não foi atualizado e não funciona para mim no 2.2.
Então, as perguntas ... 1) tem alguém Visto um trabalho multicast em 2.2, especificamente JMDNs e, especificamente, para detecção de serviços Bonjour?
2) O que é necessário no código para fazer isso funcionar?
Estou usando as permissões apropriadas:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Eu adquiri o bloqueio multicast:
WifiManager wifi = (WifiManager)getSystemService( Context.WIFI_SERVICE );
if(wifi != null)
{
MulticastLock mcLock = wifi.createMulticastLock("mylock");
mcLock.acquire();
...
E então tente iniciar o JMDNS para procurar servidores:
mdns = JmDNS.create(addr, HOSTNAME);
jmdns.addServiceListener(TOUCH_ABLE_TYPE, listener);
jmdns.addServiceListener(DACP_TYPE, listener);
...
O ouvinte nunca vê nenhum serviço. Verifiquei usando o Wireshark que os pacotes de solicitação foram enviados e que o servidor responde, mas o pacote de resposta nunca é visto pelo código do ouvinte da Socket na biblioteca JMDNS.
Então ... estou perdendo alguma coisa? Ainda é um bug? Alguém conseguiu alguma coisa, mesmo que remotamente funcione ???
Solução
Para (rudemente) responder minha própria pergunta, mais informações foram fornecidas em http://code.google.com/p/android/issues/detail?id=2917#c48 por outra pessoa. Para a posteridade, como se costuma dizer, aqui está Brian.ro ...@Gmail.com Resposta ...
"Passei bastante tempo em depuração do MDNS com JMDNs no meu EVO e HTC Hero (CDMA). O que eu descobri é que parece haver um filtro no lugar no driver sem fio da Broadcom no evo (e desde que eu ' estou obtendo uma REPRT similar de um usuário do HTC Desire - com o mesmo chipset, presumivelmente esse aparelho também). O filtro, por padrão, bloqueia qualquer tráfego que não é unicast ou de transmissão de rede, incluindo multicast. Aparentemente, a teoria era que é um economizador de bateria .
O problema parece ser o WPA_Supplicant no EVO não suporta a remoção desses filtros quando você obtém um multicastlock. (Verifique a saída do log logo após obter o bloqueio e você verá o que quero dizer). Infelizmente, o que aconteceu é que os fornecedores de hardware têm suporte multicast fragmentado .... :( "
Então ... parece que este é um problema de dispositivo mais do que um problema de codificação. D'HO. :( se eu tiver a oportunidade de testar em outro dispositivo ...
Outras dicas
Eu tenho pesquisado um pouco sobre isso e acredito que é um problema com o Android em geral e corrigido no Android 2.3.7 ou ao redor do Android.
É um pouco anedótico demais, mas aqui está o que eu testei:
- HTC Desire, 2.2, Stock: Fail
- HTC Desire, 2.3.7, CyanogenMod: Sucesso
- Motorola Milestone, 2.1-update1: Fail
- HTC Desire S, 2.3.3: Falha
- Acer Iconia A501, 3.2.1: Sucesso
- Samsung Something, 2.3.3: Falha
- Lenda htc, 2.2 eu acho: falha
Quando digo 'falhar', na verdade todos eles foram capazes de enviar mensagens multicast para os dispositivos 'Sucesso', mas nunca recebem nada de volta, exceto suas próprias mensagens - como JlDuPont descreve.
Observe que o aplicativo Multicast IM Kouchat está disponível apenas para 2.3.7, mesmo que possa ser feito para compilar até 2.1, o que dá mais credibilidade a essa teoria.
Eu acho que o outro motivo é que o seu AP não suporta.
Outro: Enviar/receber do computador para/para Android
Seu computador deve usar apenas wifi, melhor em todas as outras redes