如何获取我在 Unity (C#) 中连接的 wifi 的 BSSID?

How to get BSSID of wifi i'm connecting to in Unity (C#)?

如何在 Android 和 [上的 Unity 游戏应用程序中获取 BSSID(我正在连接的 wifi 路由器的 MAC 地址,而不是我的设备 MAC 地址) =40=] phone?

我已经尝试过这些方法,但是 none 其中 working.I 通过在游戏场景中打印结果来检查结果。请帮助

*方法 1: 此代码可以正常工作并获取正确的 BSSID 信息,但它仅适用于编辑器,当我将其构建到 Android 应用程序时它不起作用, return 字符串什么都不是(不是空值,而是空值)。

 string mac = "";
 var card = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault();
 if (card == null)
     return null;
 else
 {
     byte[] bytes = card.GetPhysicalAddress().GetAddressBytes();
     for (int i = 0; i < bytes.Length; i++)
     {
         mac = string.Concat(mac + (string.Format("{0}", bytes[i].ToString("X2"))));
         if (i != bytes.Length - 1)
         {
             //This is just for formating the final result
             mac = string.Concat(mac + ":");
         }
     }
     mac = card.GetPhysicalAddress().ToString();
     return mac;
 }

*方法 2: 我正在使用 AndroidJavaClass 调用 android 函数来获取 Android [=46 上的 BSSID =] 与 Unity 文档中一样。有关 AndroidJavaClass in Unity and WifiInfo class 的更多信息 Android

 string mac = "";
 AndroidJavaClass jc = new AndroidJavaClass("android.net.wifi.WifiInfo");
 mac = jc.Call<string>("getBSSID");

我还通过修改位于“[Project Location]\Assets\Plugins\Android”位置的"AndroidManifest.xml"文件,添加android读取wifi状态的权限,代码如下

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

由于此方法不适用于编辑器,因此我在 Android Phone 上构建并 运行,但没有字符串是 return。谁能帮帮我。

您需要制作插件才能在移动设备上执行此操作。

对于 iOS,您必须将此 answer 转换为插件,然后从 C# 调用它。有许多 Unity iOS 插件教程可以帮助您开始这方面的工作。

对于 Android,您应该首先 如果 Wifi 已启用,然后使用以下代码获取 BSSID:

public static string getSSID()
{
    string tempSSID = "";

    try
    {
        using (var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"))
        {
            using (var wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi"))
            {
                tempSSID = wifiManager.Call<AndroidJavaObject>("getConnectionInfo").Call<string>("getSSID");
            }
        }
    }
    catch (Exception e)
    {

    }
    return tempSSID;
}

public static string getBSSID()
{
    string tempBSSID = "";

    try
    {
        using (var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"))
        {
            using (var wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi"))
            {
                tempBSSID = wifiManager.Call<AndroidJavaObject>("getConnectionInfo").Call<string>("getBSSID");
            }
        }
    }
    catch (Exception e)
    {

    }
    return tempBSSID;
}

不要忘记包含权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

使用这个

    string bytes2Mac(byte[] bytes) {
        string[] m = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
        string ret = "";
        foreach (byte b in bytes)
        {
            int low = b & 0x0F;
            int hi = (b & 0xF0) >> 4;
            ret += m[hi] + m[low];
        }
        return ret;
    }

    public string ReturnMacAddress()
    {
        string macAddr = "";
        var network = new AndroidJavaClass("java.net.NetworkInterface").CallStatic<AndroidJavaObject>("getNetworkInterfaces");
        while(network.Call<Boolean>("hasMoreElements")) {
            var d = network.Call<AndroidJavaObject>("nextElement");
            var address = d.Call<byte[]>("getHardwareAddress");
            var ifname = d.Call<string>("getName");
            if (address != null && ifname == "wlan0") {
                macAddr = bytes2Mac(address);
                break;
            }
        }
        return macAddr;
    }