mars-m 2024-11-29 10:30 采纳率: 0%
浏览 20
已结题

Miracast sink 怎样获取组内client的IP地址

通过wifiP2P连接设备后,怎样根据设备mac地址获取IP地址?

wifip2p连接成功后,作为GO端,通过调用requestGroup方法获取到WifiP2PDevices后,只能获取mac地址的信息。

根据获取到的mac ,尝试通过ARP获取IP映射,但发现通过wifiP2pDevices 获取到的mac地址与通过ARP获取到的mac地址不匹配。

在API35上google 提供了获取IP地址的API,但在35以下的设备上不能使用。

  • 写回答

7条回答 默认 最新

  • 专家-皆知 2024-12-02 15:00
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要解决Miracast Sink获取组内客户端IP地址的问题,特别是在API 35以下的Android设备上,确实需要一些间接的方法,因为直接获取IP地址的API在较早的版本中不可用。以下是一个详细的步骤和代码示例,用于在不同API级别下获取连接到您作为GO端的Wi-Fi P2P设备的IP地址。

    步骤1:获取设备列表

    首先,确保您已经正确建立了Wi-Fi P2P连接,并且通过WifiP2pManager获取到了设备列表。这部分你应该已经有了,但为了完整性,这里简述一下:

    WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    WifiP2pManager.Channel channel = manager.initialize(this, getMainLooper(), null);
    manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
        @Override
        public void onSuccess() {
            // 成功发现设备后,调用请求组信息的方法
            manager.requestGroupInfo(channel, new WifiP2pManager.GroupInfoListener() {
                @Override
                public void onGroupInfoAvailable(WifiP2pGroup group) {
                    // 处理组信息,获取成员设备
                }
            });
        }
    
        @Override
        public void onFailure(int reason) {
            // 失败处理
        }
    });
    

    步骤2:解析设备信息

    在API 35以下,您不能直接从WifiP2pDevice获取IP地址,需要间接通过网络接口来尝试。

    步骤3:创建自定义方法获取IP

    由于直接从MAC到IP的映射可能需要网络通信(比如通过ARP协议),在Android中直接执行ARP查询并不直接支持,因此我们可以利用已知的设备MAC地址和组内的网络信息来间接寻找IP地址。

    注意:以下方法依赖于设备已经成功建立P2P连接,并且您的应用有必要的权限(如ACCESS_WIFI_STATE, CHANGE_WIFI_STATE)。

    private String findIpForMac(String macAddress) {
        try {
            List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
                for (InetAddress addr : addrs) {
                    if (!addr.isLoopbackAddress()) {
                        byte[] addrBytes = addr.getAddress();
                        if (addrBytes.length == 6 && Arrays.equals(macAddress.getBytes(), addrBytes)) {
                            return addr.getHostAddress();
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.e("IPFinder", "Error finding IP for MAC", e);
        }
        return null;
    }
    

    步骤4:应用到实际设备列表

    在您获取到的WifiP2pGroup中,每个成员都有一个设备信息,您可以通过上述方法尝试找到它们的IP地址:

    // 假设group是您从GroupInfoListener得到的WifiP2pGroup实例
    for (WifiP2pDevice device : group.getClientList()) {
        String mac = device.deviceAddress;
        String ip = findIpForMac(mac);
        if (ip != null) {
            Log.d("P2PConnection", "Device with MAC: " + mac + " has IP: " + ip);
        } else {
            Log.d("P2PConnection", "Could not find IP for MAC: " + mac);
        }
    }
    

    注意事项

    • 上述代码示例在实际应用中可能需要根据具体情况进行调整。
    • 由于设备的网络状态和操作系统限制,这种方法可能在某些情况下不适用或不稳定。
    • 对于API 35及以上版本,可以直接使用相关API获取IP地址,但具体实现细节不在此次解答范围内。

    此方案避免了直接使用ARP协议的复杂性,转而利用Java网络编程来尝试匹配MAC地址和IP地址,适合API 35以下的环境。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月4日
  • 赞助了问题酬金15元 12月2日
  • 创建了问题 11月29日