У меня проблема с использованием Wi-Fi Direct. Мне удалось подключить 2 устройства и отправить данные от клиента владельцу группы, потому что ip владельца группы тот, который всем известен. Мне также удалось узнать IP-адрес клиента и передать его владельцу группы, но я не могу отправить данные от владельца группы клиенту, даже если они должны быть симметричными. Я использую Intent
и startService()
для отправки данных и AsynkTask
для получения. Используя всего 2 устройства, я заметил, что IP-адрес клиента всегда один и тот же (192.168.49.10), поэтому я отдаю его намерению вручную.
Вот метод, в котором я пытаюсь создать отправителя для владельца и получателя для клиента:
@Override
public void onConnectionInfoAvailable(final WifiP2pInfo info) {
// InetAddress from WifiP2pInfo struct.
InetAddress groupOwnerAddress = info.groupOwnerAddress;
connected = true;
ownerIP = groupOwnerAddress.getHostAddress();
// After the group negotiation, we can determine the group owner.
if (info.groupFormed && info.isGroupOwner) {
Toast.makeText(MainActivity.this, "I'm the owner!!", Toast.LENGTH_SHORT).show();
owner = true;
// Do whatever tasks are specific to the group owner.
// One common case is creating a server thread and accepting
// incoming connections.
Intent serviceIntent = new Intent(MainActivity.this, OwnerSender.class);
serviceIntent.setAction(OwnerSender.ACTION_SEND);
serviceIntent.putExtra(OwnerSender.EXTRAS_CLIENT_ADDRESS,"192.168.49.10");
serviceIntent.putExtra(OwnerSender.EXTRAS_CLIENT_PORT, 8988);
startService(serviceIntent);
//new OwnerReceiver(this).execute(); // owner riceve dai client sulla porta 8988
} else if (info.groupFormed) {
// The other device acts as the client. In this case,
// you'll want to create a client thread that connects to the group
// owner.
/*Intent serviceIntent = new Intent(MainActivity.this, ClientSender.class);
serviceIntent.setAction(ClientSender.ACTION_SEND);
serviceIntent.putExtra(ClientSender.EXTRAS_GROUP_OWNER_ADDRESS,ownerIP);
serviceIntent.putExtra(ClientSender.EXTRAS_GROUP_OWNER_PORT, 8988);
startService(serviceIntent);*/
new ClientReceiver(this).execute(); // i client ricevono dall'owner sula porta 8989
Toast.makeText(MainActivity.this, "I'm a client...", Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "Server IP: " + groupOwnerAddress.getHostAddress(), Toast.LENGTH_SHORT).show();
}
}
Этот метод запускается, когда соединение установлено, и владелец должен запустить службу для отправки данных, но служба никогда не запускается. Как я уже говорил, тот же сервис запускается, если он используется на стороне клиента и данные правильно передаются от клиента к владельцу.