如何获取我在 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;
}
如何在 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,您应该首先
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;
}