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

Я работаю над приложением для 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#setup в разделе «Перенос данных». Поскольку я всегда подключаюсь к владельцам групп, я жестко запрограммировал атрибуты IP-адреса Android для GO в WiFi Direct (192.168.69.1).

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

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


person Blackfing    schedule 05.04.2017    source источник


Ответы (1)


Аналогичный вопрос здесь.

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

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

person Mohammad Asim Iqbal    schedule 14.08.2017