Android Wifi Direct: как отправлять данные от владельца группы клиентам?

У меня проблема с использованием 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();
        }
    }

Этот метод запускается, когда соединение установлено, и владелец должен запустить службу для отправки данных, но служба никогда не запускается. Как я уже говорил, тот же сервис запускается, если он используется на стороне клиента и данные правильно передаются от клиента к владельцу.


person Matteo Bernardon    schedule 02.09.2015    source источник
comment
После того, как клиенты подключились, они должны отправить сообщение или что-то владельцу группы через связь через сокет (они знают IP-адрес владельца группы). Владелец группы может прочитать IP-адрес клиента из сокета. Сохраните IP, и вы сможете отправлять данные клиентам.   -  person László Magyar    schedule 03.09.2015
comment
Сначала я пытался отправить данные от клиента к владельцу, и это работало нормально. Я сохранил IP-адрес клиента и попытался отправить данные от владельца клиенту, но это не сработало. Я заметил, что с 2-мя устройствами IP-адрес клиента всегда один и тот же (192.168.49.10). В приведенном выше примере я пытаюсь отправить напрямую от владельца клиенту после установления соединения. Так как IP клиента всегда один и тот же, я отдаю его сервису напрямую, но он ни в коем случае не работает.   -  person Matteo Bernardon    schedule 03.09.2015
comment
Я не понимаю, почему служба не хочет запускаться. Я почти уверен, что IP-адрес клиента правильный, а порт (8988) тот же, что и для отправки данных от клиента владельцу.   -  person Matteo Bernardon    schedule 03.09.2015
comment
@MatteoBernardon нашел что-то?   -  person David    schedule 26.09.2015
comment
Ничего нового. Возможно, проблема неразрешима.   -  person Matteo Bernardon    schedule 28.09.2015
comment
@MatteoBernardon Эй, ты решил эту проблему?   -  person Igor Bykov    schedule 10.01.2016


Ответы (1)


Как сказал Ласло Мадьяр, вам нужно сначала отправить пустое сообщение на сервер, чтобы сервер мог использовать клиентский сокет для получения входящего IP-адреса.

Мое решение состоит в том, чтобы отправить строку на сервер от клиента, чтобы сервер МОЖЕТ знать IP-адрес клиента, а остальная часть процесса такая же.

person Lady Chocobo    schedule 29.10.2015
comment
возможно, мой предыдущий ответ был слишком расплывчатым - person Lady Chocobo; 12.07.2017