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 ответ
Подобный вопрос здесь.
Вы можете отслеживать многочисленные запросы на эту функцию здесь.
И, наконец, один способ обойти это, который я нашел в одном из комментариев во второй ссылке, которой я поделился. Внимательно прочитайте комментарии в данном коде.