2013-03-20 1 views
14

Je regarde la possibilité de diffuser via une connexion Wi-Fi Direct entre plusieurs appareils Android. J'ai créé une application de diffusion de message simple pour tester si cela fonctionne ou non, mais jusqu'à présent, je n'ai pas été en mesure de diffuser un message. Lorsque je tente d'envoyer le paquet que je reçois un SocketException (Network est injoignable):Diffusion sur Wi-Fi Direct

03-20 13:23:00.148: E/UdpBroadcaster(4180): sendto failed: ENETUNREACH (Network is unreachable) 
03-20 13:23:00.148: E/UdpBroadcaster(4180): java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at libcore.io.IoBridge.sendto(IoBridge.java:465) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at java.net.DatagramSocket.send(DatagramSocket.java:307) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at com.example.android.wifidirect.UdpBroadcaster.sendMessage(UdpBroadcaster.java:59) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at com.example.android.wifidirect.UdpBroadcaster.run(UdpBroadcaster.java:44) 
03-20 13:23:00.148: E/UdpBroadcaster(4180): Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at libcore.io.Posix.sendtoBytes(Native Method) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at libcore.io.Posix.sendto(Posix.java:146) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  at libcore.io.IoBridge.sendto(IoBridge.java:463) 
03-20 13:23:00.148: E/UdpBroadcaster(4180):  ... 4 more 

Telle est l'essence de mon code:

InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255"); 
int port = 8888; 

DatagramSocket socket = new DatagramSocket(port); 
socket.setBroadcast(true); 
socket.connect(broadcastAddress, port); 

String message = "Hello"; 
byte[] buffer = message.getBytes(); 

DatagramPacket packet = new DatagramPacket(
     buffer, buffer.length, broadcastAddress, port); 

try { 
    socket.send(packet); // <----- Causes a SocketException 
} catch (IOException e) { 
    Log.e(TAG, e.getMessage(), e); 
} 

This post suggère que la diffusion sur le réseau Wi-Fi Direct devrait être possible.

Est-ce que quelqu'un sait si la diffusion sur Wi-Fi Direct sur Android fonctionne réellement? Si cela devrait fonctionner, qu'est-ce que je fais de mal? Je commence à penser que les appareils ne savent pas où acheminer les paquets de diffusion. Dans mon cas, il doit fonctionner sans avoir à rooter l'appareil et ajouter manuellement une route pour les paquets de diffusion.


Mise à jour

Après avoir utilisé la fonction getBroadcastAddress() suggérée par Romain Hippeau le SocketException a disparu et il semble que la diffusion fonctionne comme prévu. Cependant, j'ai des problèmes pour recevoir la diffusion sur le second appareil.

J'utilise le code suivant pour recevoir l'émission:

DatagramSocket socket = null; 
try { 
    socket = new DatagramSocket(8888); 
    socket.setBroadcast(true); // Not needed? 
    socket.setSoTimeout(200); 

    DatagramPacket packet = null; 
    while (!mStopping) { 
     byte[] buffer = new byte[1024]; 
     packet = new DatagramPacket(buffer, buffer.length); 

     try { 
      socket.receive(packet); 

      if (packet.getData().length > 0) { 
       String receivedString = new String(packet.getData()); 

       Log.i(TAG, "Received string: " + receivedString); 
      } 
     } catch (InterruptedIOException e) { /* Ignore */ } 
    } 
} catch (IOException e) { 
    Log.e(TAG, e.getMessage(), e); 
} finally { 
    if (socket != null) 
     socket.close(); 
} 

J'ai également essayé d'ajouter une adresse générique pour la DatagramSocket en ajoutant InetAddress.getByName("0.0.0.0") comme argument, mais pas de chance.

Suggestions?

+0

BTW: Regardez cet article: http: //developer.android.com/training/connect-devices-wirelessly/wifi-direct.html –

Répondre

12

Shamelessly volé https://code.google.com/p/boxeeremote/wiki/AndroidUDP

Essayez d'obtenir votre connexion en réseau ainsi:

InetAddress getBroadcastAddress() throws IOException { 
    WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcp = wifi.getDhcpInfo(); 
    // handle null somehow 

    int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
    byte[] quads = new byte[4]; 
    for (int k = 0; k < 4; k++) 
     quads[k] = (byte) ((broadcast >> k * 8) & 0xFF); 
    return InetAddress.getByAddress(quads); 
} 

Ensuite, essayez d'envoyer un paquet de cette façon:

DatagramSocket socket = new DatagramSocket(PORT); 
socket.setBroadcast(true); 
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), 
    getBroadcastAddress(), PORT); 
socket.send(packet); 

// If you want to listen for a response ... 
byte[] buf = new byte[1024]; 
DatagramPacket packet = new DatagramPacket(buf, buf.length); 
socket.receive(packet); 

Edit: De la même page lire essayer ceci ...

WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
MulticastLock lock = wifi.createMulticastLock("dk.aboaya.pingpong"); 
lock.acquire(); 
serverSocket = new DatagramSocket(19876); 
serverSocket.setSoTimeout(15000); //15 sec wait for the client to connect 
byte[] data = new byte[UDPBatPositionUpdater.secretWord.length()]; 
DatagramPacket packet = new DatagramPacket(data, data.length); 
serverSocket.receive(packet); 
lock.release(); 
String s = new String(packet.getData()); 
System.out.println(s); 

Rappelez-vous, que vous avez besoin de l'autorisation suivante pour que cela fonctionne:
< utilise-permission android: name = "android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

+3

La SocketException a disparu après avoir utilisé cette fonction pour obtenir l'adresse de diffusion et la diffusion semble fonctionner, mais j'ai des problèmes pour recevoir la diffusion. sur le deuxième appareil.J'initialise un 'DatagramSocket' de la même manière sur le périphérique de réception. J'ai également essayé d'utiliser une adresse générique sur la réception de 'DatagramSocket' en ajoutant' InetAddress.getByName ("0.0.0.0") 'comme argument. Pas de chance. – KatoStoelen

+0

@ user2190832 ajouté plus de détails à ma réponse pour lire UDP. –

+0

Le code fonctionne très bien, merci! Quelques détails concernant les dispositifs: Je construis mes propres bibliothèques pour gérer cette communication basée sur ce code. J'utilise actuellement le port 8888. Mon Nexus 5 peut envoyer et recevoir. Mon Moto G peut seulement envoyer des paquets (et recevoir les siens, mais pas d'autres appareils). J'ai récemment essayé dans un Samsung Galaxy S2 et peut envoyer et recevoir des paquets. Motorola bloque les diffusions entrantes. J'ai essayé dans deux Moto G différents, l'un pourri avec des politiques de pare-feu spécifiques et un stock, mais pas de chance. –