Мне нужно "найти" определенные устройства в сети 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-адресами, я просто не могу получить их в моем приложении).
Я не слишком знаком с сетями, возможно, я начал это неправильно, но я впадаю в отчаяние.