1

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

我尝试了这些方法,但都没有工作。我通过在游戏场景中打印来检查结果。请帮忙

*方法1:此代码工作正常并获得正确的BSSID信息,但它仅适用于编辑器,当我将它构建到Android App时它不起作用,返回字符串什么都没有(不是空值而是空值)。

 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手机上的BSSID,就像Unity文档中一样。更多关于Unity 中的AndroidJavaClass和 Android 的WifiInfo类的信息

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

我还通过使用以下代码在“[项目位置]\Assets\Plugins\Android”位置修改“AndroidManifest.xml”文件来添加读取 wifi 状态的 android 权限

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

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

4

2 回答 2

1

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

对于 iOS,您必须将此答案转换为插件,然后从 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" />

于 2016-09-19T07:54:35.667 回答
0

用这个

    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;
    }
于 2019-07-19T10:02:04.483 回答