如何在Unity中获取设备的网关?

3
我正在尝试在安卓智能手机上使用Unity和C#获取设备的标准网关,但我无法解决问题。因此,我想知道是否有可能使用Unity和C#在安卓智能手机上找到网关。
我已经尝试了以下方法,它可以在Unity编辑器中工作:
    NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
    foreach (NetworkInterface adapter in adapters)
    {
        IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
        GatewayIPAddressInformationCollection addresses = adapterProperties.GatewayAddresses;
        if (addresses.Count > 0)
        {
            foreach (GatewayIPAddressInformation address in addresses)
            {
                if (address.Address.ToString() != "0.0.0.0")
                {
                    Debug.Log("Gateway: " + address.Address.ToString());
                }
            }
        }
    }

这个解决方案存在一个问题。在Android中找不到DLL文件,如果我想将DLL文件作为引用添加进来,那么Microsoft会提示无法添加引用,因为它可能无法访问或者不是有效的程序集/COM组件。(所以它只能在我的桌面上工作) - Skittluier
请尝试访问此网页:http://www.codepool.biz/how-to-monitor-usb-events-on-android.html - jdweng
我在adb logcat中遇到了这个错误。也许这会对你有所帮助? I/Unity (14783): EntryPointNotFoundException: getifaddrs I/Unity (14783): at (wrapper managed-to-native) System.Net.NetworkInformation.LinuxNetworkInterface:getifaddrs (intptr&) - Skittluier
“Entry Point not found”意味着方法名错误或方法/函数不是公共的(也可能是静态和/或外部)。请检查函数名称getifaddrs,确保它正确(包括大小写)。 - jdweng
请确保您已经安装了所有最新的更新。看起来问题在大多数情况下已经被解决了。如果您仍然遇到问题,我建议您在 bugzilla(上面提到的链接)中开启一个新的报告。 - jdweng
显示剩余3条评论
2个回答

1

适用于PC:

IPAddress GatewayAddress = NetworkInterface
                .GetAllNetworkInterfaces()
                .Where(n => n.OperationalStatus == OperationalStatus.Up)
                .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                .Where(n => n.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                .SelectMany(n => n.GetIPProperties()?.GatewayAddresses)
                .Select(g => g?.Address)
                .Where(a => a != null)
                .Where(a => a.AddressFamily == AddressFamily.InterNetwork)
                .FirstOrDefault();

0
Assets/Plugins/Android 目录下创建一个名为 Network.java 的文件。

Assets/Plugins/Android/Network.java

package com.mynet;
 
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
 
public class Network{
    //Match the IP of class C address
    public static final String regexCIp = "^192\\.168\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";
    //Match a class A address
    public static final String regexAIp = "^10\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";
    //Match B address
    public static final String regexBIp = "^172\\.(1[6-9]|2\\d|3[0-1])\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)\\.(\\d{1}|[1-9]\\d|1\\d{2}|2[0-4]\\d|25\\d)$";
 
 
    public  String getHostIp() {
        String hostIp;
        Pattern ip = Pattern.compile("(" + regexAIp + ")|" + "(" + regexBIp + ")|" + "(" + regexCIp + ")");
        Enumeration<NetworkInterface> networkInterfaces = null;
        try {
            networkInterfaces = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        InetAddress address;
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = networkInterfaces.nextElement();
            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
            while (inetAddresses.hasMoreElements()) {
                address = inetAddresses.nextElement();
                String hostAddress = address.getHostAddress();
                Matcher matcher = ip.matcher(hostAddress);
                if (matcher.matches()) {
                    hostIp = hostAddress;
                    return hostIp;
                }
 
            }
        }
        return null;
    }
}

在C#代码中使用以下脚本:
using UnityEngine;
using UnityEngine.UI;

public class MyIPScript: MonoBehaviour
{

    public Text ipText;

    public void Start()
    {
        string ip = GetIP();
        ipText.text = ip;
    }

    private string GetIP() {
        AndroidJavaObject jo = new AndroidJavaObject("com.mynet.Network");
        AndroidJavaClass act = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        return jo.Call<string>("getHostIp");
    }
}

注意:此方法仅适用于 Android 设备。如果在电脑上测试,您将看不到任何 IP 地址。因此,请从 Build Settings 中选择 Android 平台构建您的 Unity 项目并生成 apk 文件,然后将其安装在您的 Android 手机VR 头盔 上。我已在 Oculus Quest 上进行了测试,效果非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接