Wi-Fi Direct/P2P 可被视为普通 Wi-Fi,但组所有者 (GO) 充当软件接入点(dhcp 服务器、配置等)。所以回答你的最后一个问题,是的,Wi-Fi Direct 也使用 IP 发送和接收数据。
您想向群组中的所有成员发送数据吗?对此有两种解决方案:
- 使用多播广播一次消息。
- 将消息发送给组中的每个单独客户端。
最有效的方法是解决方案 1,使用多播广播数据,因为您只需要发送一次数据。不幸的是,Android 中的 Wi-Fi 多播支持非常分散,因为许多设备似乎会阻止非单播流量。看本文 http://codeisland.org/2012/udp-multicast-on-android/如果您想沿着这条路线走下去,请获取更深入的信息。
如果您想保证所有设备上的支持并且仅传输少量数据,则解决方案 2 是最佳方法。 GO 需要组中客户端的 IP 地址,但由于 Android 中 Wi-Fi Direct 的实现方式,所有设备只知道 GO IP。一种解决方案是让客户端连接到 GO 上的套接字,以获取其 IP 地址:
客户端代码
private static final int SERVER_PORT = 1030;
... // on group join:
wifiP2pManager.requestConnectionInfo(channel, new ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(WifiP2pInfo p2pInfo) {
if (!p2pInfo.isGroupOwner) {
// Joined group as client - connect to GO
Socket socket = new Socket();
socket.connect(new InetSocketAddress(p2pInfo.groupOwnerAddress, SERVER_PORT));
}
}
});
群组所有者代码:
private static final int SERVER_PORT = 1030;
private ArrayList<InetAddress> clients = new ArrayList<InetAddress>();
public void startServer() {
clients.clear();
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
// Collect client ip's
while(true) {
Socket clientSocket = serverSocket.accept();
clients.add(clientSocket.getInetAddress());
clientSocket.close();
}
}
现在您需要做的就是在每个客户端上启动一个serversocket,然后遍历客户端列表,为每个客户端创建一个套接字连接并发送您想要广播的消息。