Wi-Fi Direct/P2P는 일반 Wi-Fi로 간주 할 수 있지만 그룹 소유자 (GO)는 소프트웨어 액세스 지점 (DHCP 서버, 프로비저닝 등) 역할을합니다. 그래서 마지막 질문에 답하기 위해 예 Wi-Fi Direct는 IP를 사용하여 데이터를 보내고받습니다.
그룹의 모든 구성원에게 데이터를 보내시겠습니까? 이에 대한 솔루션은 두 가지가 있습니다.
- 멀티 캐스트를 사용하여 메시지를 한 번 브로드 캐스트합니다.
- 그룹의 개별 고객에게 메시지를 보냅니다.
가장 효율적인 방법은 데이터를 한 번만 보내면되므로 멀티 캐스트를 사용하여 데이터를 브로드 캐스트하는 해결책 1입니다. 안타깝게도 Wi-Fi 멀티 캐스트 지원은 많은 기기가 비 유니 캐스트 트래픽을 차단하는 것처럼 보이므로 안드로이드에서 매우 분열되어 있습니다. 이 경로를 따라 가려면 자세한 내용은 this article을 참조하십시오.
모든 장치에 대한 지원을 보장하고 소량의 데이터 만 전송하려는 경우 솔루션 2가 가장 좋습니다. GO는 그룹의 클라이언트의 IP 주소가 필요하지만 Android에서 Wi-Fi Direct가 구현되는 방식 때문에 GO IP 만 모든 장치에 알려져 있습니다. 하나 개의 솔루션은 클라이언트가 이동 소켓에 연결 자신의 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을 시작하고 클라이언트 목록을 반복하여 각각에 대한 소켓 연결을 만들고 브로드 캐스트하려는 메시지를 보냅니다.
성공적인 결과를 얻었습니까? 그렇다면 알려주십시오. 동일한 문제에 직면하고 있으며 해결 방법을 찾을 수 없습니다. 가능한 모든 문서를 드릴 다운했지만 성공하지 못했습니다. (:( –