2012-04-16 3 views
0

Je tente de recevoir une diffusion UDP sous Mono pour Android et je ne vois aucune entrée de données. C'est assez perplexe car cela fonctionne bien sur les Galaxy Tab 7 et Galaxy Tab 10 (Android v 3.2) J'ai, mais échoue sur un HTC G2 (Android v2.3.4).UDPClient ne recevant pas les paquets sur HTC G2

Le code est simple:

public void BeginDiscover() 
{ 
    var packet = new DiscoverPacket(); 

    lock (m_syncRoot) 
    { 
     var localEndpoint = new IPEndPoint(m_local, 0); 
     using (var udp = new UdpClient(localEndpoint)) 
     { 
      var remoteEndpoint = new IPEndPoint(IPAddress.Broadcast, DiscoverPort); 
      udp.Send(packet.Data, packet.Data.Length, remoteEndpoint); 
      Thread.Sleep(100); 
     } 
    } 
} 

Je ai vérifié que le manifeste comprend cette ligne:

<uses-permission android:name="android.permission.INTERNET" /> 

Bien que cela se passe dans Debug, ce qui devrait être implicitement mis de toute façon.

Autres observations très étranges:

  • Encore une fois, ce qui fonctionne très bien sur un autre type de dispositif
  • Le gestionnaire d'écoute pour les diffusions UDP (dont la liste d'écoute de la réponse) -t voir cette sortant paquet. Le code de cet écouteur est aussi simple:

[code auditeur]

private void Start() 
{ 
    m_discoverListener = new UdpClient(DiscoverPort); 
    m_discoverListener.BeginReceive(DiscoverCallback, m_discoverListener); 
} 

private void DiscoverCallback(IAsyncResult result) 
{ 
    try 
    { 
     var ep = new IPEndPoint(IPAddress.Any, DiscoverPort); 
     var data = m_discoverListener.EndReceive(result, ref ep); 

     // filter out what we send 
     var add = AddressWithoutPort(ep.Address); 
     if (add == m_local.ToString()) return; 

     // parse discover response 
     // [clipped for clarity] 
    } 
    finally 
    { 
     m_discoverListener.BeginReceive(DiscoverCallback, m_discoverListener); 
    } 
} 
  • Wireshark en cours d'exécution sur un PC séparé sur le même réseau -t voir le découvrir paquet de demande (ci-dessus)
  • la « découverte » l'appareil est également le voir, parce que Wireshark voit aussi la réponse
  • l'écouteur UDP appareil Android est non recevant le paquet de réponse

Les seules différences majeures entre les appareils que je peux penser (autres que les différents constructeurs mettant en œuvre la plate-forme) est que le G2 a une radio cellulaire intégré et la Galaxy Tab ne fonctionne pas. Dans mon cas de test spécifique, je n'ai pas de carte SIM dans le téléphone, donc aucune connexion cellulaire n'est en cours. Notez que le code ci-dessus utilise explicitement le point de terminaison local qui se trouve sur le réseau WiFi.

Y at-il un problème connu avec UDP sur le G2 spécifiquement ou généralement sur les anciennes implémentations de la plate-forme Android?

Répondre

1

Il a fallu un peu de travail car la réponse UDP en question vient d'un microcontrôleur sur l'appareil et je voulais être absolument certain que ce n'était pas un problème sur le micro fin (même si je ne pensais pas). J'ai créé un simulateur basé sur PC pour le périphérique de microcontrôleur qui gère ma demande UDP Android et qui renvoie exactement la même réponse UDP que le microcontrôleur, puis vérifié tout le trafic semble bien avec Wireshark.

Le résultat net est que je vois qu'il a exactement le même comportement avec le simulateur. Les dispositifs Galaxy Tab 7 et 10 reçoivent la réponse UDP sans problème. Le HTC G2 ne le fait jamais.Cela me conduit à conclure que l'une des conditions suivantes est remplie:

a) Le HTC G2 a spécifiquement un bug de mise en œuvre empêchant de recevoir (ou au moins en passant le long) diffuse UDP sur le réseau

ou

b) L'ancienne version d'Android a son bug. Jusqu'à ce que je trouve un autre matériel avec la même version Android que le G2 (v2.3), je ne peux pas dire quel est le cas. Dans tous les cas, c'est un bug qui rend ce matériel (et potentiellement autre) inutilisable pour ma solution spécifique.

+0

En fait, j'eu le même problème, je trouve que HTC ne recevra pas de paquet UDP à moins qu'il ne soit dirigé vers son adresse. –

0

J'ai quelques applications sur le marché basées sur la communication UDP.

J'ai des problèmes avec les téléphones HTC qui ne reçoivent pas les paquets de diffusion UDP envoyés depuis un autre appareil ... s'ils sont envoyés depuis le même appareil, les paquets arrivent.

, je pense que le problème est dans HTC, et je l'ai trouvé une solution possible en ligne (même si je ne l'ai pas essayé):

http://www.flattermann.net/2010/09/fix-udp-broadcasts-on-htc-phones-running-stock-firmware/

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous aurez suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez être capable de [commenter sur n'importe quel post] (http://stackoverflow.com/help/privileges/comment). – Noel

+0

@ Ramblin'Man pourquoi pensez-vous qu'il ne fournit pas de réponse? Comme je vois, en bref, la question est de savoir pourquoi les paquets de diffusion UDP ne sont pas reçus par certains appareils HTC. Donc, j'ai fourni un lien où ce problème peut être résolu ... Pouvez-vous expliquer plus pourquoi cela ne fournit pas de réponse? – sasebt

+0

J'aurais dû fournir une meilleure raison, mais les liens ne sont pas encouragés sur le SO. Il y a plusieurs messages à ce sujet sur meta.stackoverflow. En voici un [post] (http://meta.stackexchange.com/questions/92505/should-i-flag-answers-which-contain-only-a-link-as-not-an-answer) – Noel

Questions connexes