Лучший ответ вы можете получить, возможно, один из Мано:
я столкнулся с той же проблемой. Так как оба устройства знают группу владельца , то уже можно отправить сообщение группе . Первое отправленное вами сообщение может содержать IP-адрес другого устройства; с этого момента возможна двунаправленная связь.
Вот как я его реализовал. Когда я подключаю клиента к владельцу группы через WiFi Direct, я получаю IP-адрес владельца группы и отправляю сообщение владельцу группы через сокет.Что-то вроде:
Socket socket = new Socket();
socket.setReuseAddress(true);
socket.connect((new InetSocketAddress(mIP, mPort)), SOCKET_TIMEOUT);
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(new String("BROFIST");
oos.close();
os.close();
socket.close();
Вы уже знаете, MIP (IP-адрес владельца группы), и только должны решить Mport и получить соединение на владельца группы вроде этого:
Socket serverSocket = new ServerSocket(mPort);
serverSocket.setReuseAddress(true);
Socket client = serverSocket.accept();
ObjectInputStream objectInputStream = new ObjectInputStream(client.getInputStream());
Object object = objectInputStream.readObject();
if (object.getClass().equals(String.class) && ((String) object).equals("BROFIST")) {
Log.d(TAG, "Client IP address: "+client.getInetAddress());
}
Это фактический код, который я использую. Я собираюсь заменить это сообщение на некоторую полезную информацию, например объект сообщения, содержащий MAC отправителя, который можно использовать для определения отношений MAC-IP, поскольку WifiP2pDevice предоставляет только MAC и InetAddress IP (Кто-нибудь знает, есть ли способ получить MAC-адрес от InetAddress?)
Предупреждение: этот код возвращает первый IP-адрес, который не является loopback, если вы подключены к точке доступа Wi-Fi, а также к Wi-Fi Direct, ее возможно вернуть адрес точки доступа. Из того, что я видел, сеть, используемая Wifi Direct, - 192.168.49.0, поэтому вы должны проверить, находится ли его в этом диапазоне или еще лучше сравнить адрес хоста владельца, чтобы убедиться, что они находятся в одной сети. – triggs
Из предыдущего сообщения в форуме, я выяснил, что можно получить клиентский ip хозяином (владельцем группы), если я могу создать TCP-соединение. Но для UDP-соединения, как можно будет получить клиентский IP-адрес? Спасибо. – user1850484