简体   繁体   English

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

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

How can I get BSSID (MAC address of the wifi router I'm connecting in, not my device MAC Address) in my Unity Game App on Android and iOS phone? 如何在Android和iOS手机上的Unity Game App中获取BSSID(我正在连接的wifi路由器的MAC地址,而不是设备的MAC地址)?

I have tried these method but none of them working.I check the result by printing it on game scene. 我已经尝试了这些方法,但是都没有用。我通过在游戏场景上打印结果来检查结果。 Please help 请帮忙

*Method 1: This code work fine and get the correct BSSID info but it's only work on Editor, when I build it to Android App it's not working, return string is nothing (Not null but empty value). *方法1:此代码可以正常运行并获取正确的BSSID信息,但仅在编辑器上有效,当我将其构建到Android App时无法正常工作,返回字符串为空(不是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;
 }

*Method 2: I'm using AndroidJavaClass to call an android function to get BSSID on Android Phone as in Unity document. *方法2:如Unity文档中所述,我正在使用AndroidJavaClass调用android函数以在Android Phone上获取BSSID。 More info about AndroidJavaClass in Unity and WifiInfo class of Android 有关更多信息AndroidJavaClass团结WifiInfo类的Android

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

I also add android permission for reading wifi state by modifing "AndroidManifest.xml" file at location "[Project Location]\\Assets\\Plugins\\Android" with the code below 我还通过使用以下代码修改位置“ [Project Location] \\ Assets \\ Plugins \\ Android”中的“ AndroidManifest.xml”文件来添加读取wifi状态的android权限

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

Since this method not working on Editor, I build and run this on Android Phone but no string is return. 由于此方法不适用于Editor,因此我在Android Phone上构建并运行该方法,但未返回任何字符串。 Can anyone help me please. 谁能帮我。

You do need to make plugins in order to do this on mobile devices. 您确实需要制作插件才能在移动设备上执行此操作。

For iOS, you have to convert this answer into a plugin then call it from C#. 对于iOS,您必须将此答案转换为插件,然后从C#调用它。 There are many Unity iOS plugin tutorials out there that can get you started on this. 那里有很多Unity iOS插件教程,可以帮助您入门。

For Android, you should first check if Wifi is enabled before getting the BSSID with the code below: 对于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;
}

Don't forget to include the permission <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> . 不要忘记添加权限<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Use this 用这个

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM