如何获得wi - fi的BSSID i'm连接到Unity (c#)

本文关键字:连接 Unity wi 何获得 fi BSSID | 更新日期: 2023-09-27 18:07:28

如何在Android和iOS手机上的Unity游戏应用程序中获得BSSID(我连接的wifi路由器的MAC地址,而不是我的设备MAC地址)?

我试过这些方法,但都不起作用。我通过打印游戏场景来检查结果。请帮助

*方法1:这段代码工作得很好,得到正确的BSSID信息,但它只在编辑器上工作,当我把它构建到Android应用程序时,它不工作,返回字符串是什么都没有(不是null,而是空值)。

 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函数以在Unity文档中获得android手机上的BSSID。关于Unity中的AndroidJavaClass和Android的WifiInfo类的更多信息

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

我还添加了android权限读取wifi状态通过修改"AndroidManifest.xml"文件在位置"[项目位置]'Assets'Plugins' android"与下面的代码

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

因为这个方法不工作的编辑器,我建立和运行这在Android手机上,但没有字符串返回。有谁能帮我一下吗?

如何获得wi - fi的BSSID i'm连接到Unity (c#)

为了在移动设备上做到这一点,你确实需要制作插件。

对于iOS,你必须将这个答案转换成一个插件,然后从c#调用它。有很多Unity iOS插件教程可以帮你入门。

对于Android,在获得BSSID之前,你应该先检查Wifi是否启用,代码如下:

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;
    }