WiFi P2P Соединение обхода взаимодействия с пользователем?

Я работаю над приложением Android, используя WiFi Direct. Предполагается, что приложение создает группу на каждом устройстве или ищет одноранговые узлы и передает строку каждому одноранговому узлу, в зависимости от того, подключено ли устройство к Интернету или нет. Также я могу обнаружить MAC-адреса всех соседних узлов в случае, если устройство имеет Интернет.

Это мой код для получения ближайших устройств, где groupCreated - это переменная, которая сообщает, создало ли это устройство группу с помощью createGroup() или действительно ищет партнеров:

private WifiP2pManager.PeerListListener peerListListener = new WifiP2pManager.PeerListListener() {

    @Override
    public void onPeersAvailable(WifiP2pDeviceList peerList) {

        if (!groupCreated) {

            Collection<WifiP2pDevice> refreshedPeers = peerList.getDeviceList();
            String peerInfo = "Available peers: \n";

            if (!refreshedPeers.equals(peers)) {
                peers.clear();
                peers.addAll(refreshedPeers);
                for (WifiP2pDevice peer : peers) {
                    peerInfo += "\nMAC: " + peer.deviceAddress + " - Name: " + peer.deviceName;
                }
                TextView peerDisplay = (TextView) findViewById(R.id.peerListText);
                peerDisplay.setText(peerInfo);

                connectPeers();
            }
            if (peers.size() == 0) {
                Toast.makeText(ProviderActivity.this, "No peers found!",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }
};

Это код для фактического подключения к пирам:

public void connectPeers(){
    for (WifiP2pDevice peer : peers) {
        WifiP2pConfig config = new WifiP2pConfig();
        config.deviceAddress = peer.deviceAddress;
        mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {

            @Override
            public void onSuccess() {

                String host = "192.168.69.1";
                int port = 8888;
                int len;
                Socket socket = new Socket();
                String sent = "Hi!";
                byte buf[] = new byte[1024];

                try {
                    /**
                     * Create a client socket with the host,
                     * port, and timeout information.
                     */
                    socket.bind(null);
                    socket.connect((new InetSocketAddress(host, port)), 1000);

                    /**
                     * Create a byte stream from a JPEG file and pipe it to the output stream
                     * of the socket. This data will be retrieved by the server device.
                     */
                    OutputStream outputStream = socket.getOutputStream();
                    InputStream inputStream = new ByteArrayInputStream(sent.getBytes(Charset.forName("UTF-8")));
                    while ((len = inputStream.read(buf)) != -1) {
                        outputStream.write(buf, 0, len);
                    }
                    outputStream.close();
                    inputStream.close();
                } catch (IOException e) {
                    System.out.println(e.toString());
                }

                /**
                 * Clean up any open sockets when done
                 * transferring or if an exception occurred.
                 */ finally {
                    if (socket != null) {
                        if (socket.isConnected()) {
                            try {
                                socket.close();
                            } catch (IOException e) {
                                Toast.makeText(ProviderActivity.this, "Failed to close the connection!",
                                        Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                }
            }
            @Override
            public void onFailure(int reason) {
                Toast.makeText(ProviderActivity.this, "Failed to connect to peer!",
                        Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Это сторона клиента, а сторона сервера - это асинхронная задача, которую можно найти по https://developer.android.com/guide/topics/connectivity/wifip2p.html в разделе "Передача данных". Поскольку я всегда подключаюсь к владельцам групп, я жестко закодировал атрибуты IP-адресов Android для GO в WiFi Direct (192.168.69.1).

С помощью этого кода я могу создать группу и подключиться к одноранговым узлам, но когда я пытаюсь создать сокет и передать данные, в одноранговых узлах появляется приглашение для пользователя принять или отклонить соединение. В руководстве по API не было никакого взаимодействия с пользователем. Что я делаю неправильно?

Спасибо за внимание.

1 ответ

Подобный вопрос здесь.

Вы можете отслеживать многочисленные запросы на эту функцию здесь.

И, наконец, один способ обойти это, который я нашел в одном из комментариев во второй ссылке, которой я поделился. Внимательно прочитайте комментарии в данном коде.

Другие вопросы по тегам