Не удается обнаружить устройства в локальной сети WiFi с помощью Android UDP-трансляции - PullRequest
1 голос
/ 25 мая 2019

Мне нужно "найти" определенные устройства в сети Wi-Fi с устройством Android. Устройства прослушивают порт 7432, и мне нужно отправить 02904 в байтах и ​​получить ответ по IP-адресу. Количество устройств может быть от 0 до n. Мне нужны IP-адреса на каждом устройстве (из ответа или из обнаружения) Пока это мой код (я не говорю, что он работает для меня):

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DiscoveryThread implements Runnable {
    @Override
    public void run() {
        try {
            //Keep a socket open to listen to all the UDP trafic that is destined for this port
            DatagramSocket socket = new DatagramSocket(7432, InetAddress.getByName("255.255.255.255"));
            socket.setBroadcast(true);

            do {
                System.out.println(getClass().getName() + ">>>Ready to receive broadcast packets!");

                //Receive a packet
                byte[] recvBuf = new byte[5];
                DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
                socket.receive(packet);

                //Packet received
                System.out.println(getClass().getName() + ">>>Discovery packet received from: " + packet.getAddress().getHostAddress());
                System.out.println(getClass().getName() + ">>>Packet received; data: " + new String(packet.getData()));

                //See if the packet holds the right command (message)
                String message = new String(packet.getData()).trim();
                if (message.equals("DISCOVER_FUIFSERVER_REQUEST")) {
                    byte[] sendData = "DISCOVER_FUIFSERVER_RESPONSE".getBytes();

                    //Send a response
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, packet.getAddress(), packet.getPort());
                    socket.send(sendPacket);

                    System.out.println(getClass().getName() + ">>>Sent packet to: " + sendPacket.getAddress().getHostAddress());
                }
            } while (true);
        } catch (IOException ex) {
            Logger.getLogger(DiscoveryThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    static DiscoveryThread getInstance() {
        return DiscoveryThreadHolder.INSTANCE;
    }

    private static class DiscoveryThreadHolder {

        private static final DiscoveryThread INSTANCE = new DiscoveryThread();
    }

}

Я пробовал:

Передача Android при передаче udp молча завершается сбоем

https://lab.dyne.org/AndroidUDPBroadcast

http://rocknirmana.blogspot.com/2013/08/sending-udp-broadcast-socket-messages.html

https://jackiexie.com/2015/07/15/network-discovery-using-udp-broadcast-java/

https://developer.android.com/reference/java/net/DatagramSocket

http://www.helloandroid.com/tutorials/simple-udp-communication-example

https://www.baeldung.com/java-broadcast-multicast

https://answers.unity.com/questions/250732/android-build-is-not-receiving-udp-broadcasts.html

https://pzoleeblogen.wordpress.com/2014/03/04/android-udp-broadcast-message-is-not-received/

Manifest:

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

С большинством примеров, которые я связал, я получил ответ "192.168.0.230", и мне нужен список IP-адресов, таких как ["192.168.0.101", "192.168.0.102", "192.168.0.103"] (вот как они должны выглядеть в моей сети, я вижу их в маршрутизатор с точно такими IP-адресами, я просто не могу получить их в моем приложении). Я не слишком знаком с сетями, возможно, я начал это неправильно, но я впадаю в отчаяние.

...