413 lines
14 KiB
C#
413 lines
14 KiB
C#
|
|
// using System;
|
|||
|
|
// using UnityEngine;
|
|||
|
|
// using System.Collections;
|
|||
|
|
// using System.Net.NetworkInformation;
|
|||
|
|
// using System.Net;
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 跨平台网络管理器
|
|||
|
|
// /// 支持 Windows、Android 等平台的网络功能
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static class CrossPlatformNetworkManager
|
|||
|
|
// {
|
|||
|
|
// #if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
|
|||
|
|
// #region Android 网络实现
|
|||
|
|
|
|||
|
|
// private static AndroidJavaClass _unityPlayer;
|
|||
|
|
// private static AndroidJavaObject _currentActivity;
|
|||
|
|
// private static AndroidJavaObject _connectivityManager;
|
|||
|
|
// private static AndroidJavaObject _wifiManager;
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 初始化Android网络管理
|
|||
|
|
// /// </summary>
|
|||
|
|
// static CrossPlatformNetworkManager()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// _unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
|
|||
|
|
// _currentActivity = _unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
|
|||
|
|
|
|||
|
|
// // 获取ConnectivityManager
|
|||
|
|
// _connectivityManager = _currentActivity.Call<AndroidJavaObject>("getSystemService", "connectivity");
|
|||
|
|
|
|||
|
|
// // 获取WifiManager
|
|||
|
|
// AndroidJavaObject applicationContext = _currentActivity.Call<AndroidJavaObject>("getApplicationContext");
|
|||
|
|
// _wifiManager = applicationContext.Call<AndroidJavaObject>("getSystemService", "wifi");
|
|||
|
|
|
|||
|
|
// Debug.Log("Android网络管理器初始化成功");
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"Android网络管理器初始化失败: {ex.Message}");
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取网络连接状态
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static NetworkReachability GetNetworkReachability()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// if (_connectivityManager == null)
|
|||
|
|
// return NetworkReachability.NotReachable;
|
|||
|
|
|
|||
|
|
// AndroidJavaObject activeNetwork = _connectivityManager.Call<AndroidJavaObject>("getActiveNetworkInfo");
|
|||
|
|
|
|||
|
|
// if (activeNetwork == null)
|
|||
|
|
// return NetworkReachability.NotReachable;
|
|||
|
|
|
|||
|
|
// bool isConnected = activeNetwork.Call<bool>("isConnected");
|
|||
|
|
// if (!isConnected)
|
|||
|
|
// return NetworkReachability.NotReachable;
|
|||
|
|
|
|||
|
|
// int networkType = activeNetwork.Call<int>("getType");
|
|||
|
|
|
|||
|
|
// // TYPE_WIFI = 1, TYPE_MOBILE = 0
|
|||
|
|
// return networkType == 1 ? NetworkReachability.ReachableViaLocalAreaNetwork
|
|||
|
|
// : NetworkReachability.ReachableViaCarrierDataNetwork;
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"获取Android网络状态失败: {ex.Message}");
|
|||
|
|
// return NetworkReachability.NotReachable;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取WiFi信息
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static AndroidWifiInfo GetWifiInfo()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// var wifiInfo = new AndroidWifiInfo();
|
|||
|
|
|
|||
|
|
// if (_wifiManager == null)
|
|||
|
|
// {
|
|||
|
|
// wifiInfo.IsConnected = false;
|
|||
|
|
// return wifiInfo;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// bool isWifiEnabled = _wifiManager.Call<bool>("isWifiEnabled");
|
|||
|
|
// wifiInfo.IsWifiEnabled = isWifiEnabled;
|
|||
|
|
|
|||
|
|
// if (!isWifiEnabled)
|
|||
|
|
// {
|
|||
|
|
// wifiInfo.IsConnected = false;
|
|||
|
|
// return wifiInfo;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// AndroidJavaObject connectionInfo = _wifiManager.Call<AndroidJavaObject>("getConnectionInfo");
|
|||
|
|
|
|||
|
|
// if (connectionInfo != null)
|
|||
|
|
// {
|
|||
|
|
// wifiInfo.SSID = connectionInfo.Call<string>("getSSID");
|
|||
|
|
// wifiInfo.SignalStrength = connectionInfo.Call<int>("getRssi");
|
|||
|
|
// wifiInfo.LinkSpeed = connectionInfo.Call<int>("getLinkSpeed");
|
|||
|
|
// wifiInfo.IsConnected = !string.IsNullOrEmpty(wifiInfo.SSID) && !wifiInfo.SSID.Equals("<unknown ssid>");
|
|||
|
|
|
|||
|
|
// // 清理SSID的引号
|
|||
|
|
// if (wifiInfo.SSID != null && wifiInfo.SSID.StartsWith("\"") && wifiInfo.SSID.EndsWith("\""))
|
|||
|
|
// {
|
|||
|
|
// wifiInfo.SSID = wifiInfo.SSID.Substring(1, wifiInfo.SSID.Length - 2);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return wifiInfo;
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"获取Android WiFi信息失败: {ex.Message}");
|
|||
|
|
// return new AndroidWifiInfo { IsConnected = false };
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取本地IP地址
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static string GetLocalIPAddress()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// if (_wifiManager == null) return "未知";
|
|||
|
|
|
|||
|
|
// AndroidJavaObject connectionInfo = _wifiManager.Call<AndroidJavaObject>("getConnectionInfo");
|
|||
|
|
// if (connectionInfo != null)
|
|||
|
|
// {
|
|||
|
|
// int ipAddress = connectionInfo.Call<int>("getIpAddress");
|
|||
|
|
|
|||
|
|
// // 转换IP地址格式
|
|||
|
|
// return string.Format("{0}.{1}.{2}.{3}",
|
|||
|
|
// (ipAddress & 0xff),
|
|||
|
|
// (ipAddress >> 8 & 0xff),
|
|||
|
|
// (ipAddress >> 16 & 0xff),
|
|||
|
|
// (ipAddress >> 24 & 0xff));
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return "未知";
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"获取Android IP地址失败: {ex.Message}");
|
|||
|
|
// return "未知";
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 启用/禁用WiFi (需要权限)
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static bool SetWifiEnabled(bool enabled)
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// if (_wifiManager == null) return false;
|
|||
|
|
|
|||
|
|
// // 注意:从Android Q (API 29) 开始,应用无法直接启用/禁用WiFi
|
|||
|
|
// bool result = _wifiManager.Call<bool>("setWifiEnabled", enabled);
|
|||
|
|
|
|||
|
|
// Debug.Log($"Android: WiFi {(enabled ? "启用" : "禁用")} - 结果: {result}");
|
|||
|
|
// return result;
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"Android WiFi控制失败: {ex.Message}");
|
|||
|
|
// return false;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// #endregion
|
|||
|
|
|
|||
|
|
// #elif UNITY_STANDALONE_WIN && !UNITY_EDITOR
|
|||
|
|
|
|||
|
|
// #region Windows 网络实现
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取Windows网络连接状态
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static NetworkReachability GetNetworkReachability()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// if (NetworkInterface.GetIsNetworkAvailable())
|
|||
|
|
// {
|
|||
|
|
// // 检查是否有可用的网络接口
|
|||
|
|
// NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
|
|||
|
|
// foreach (NetworkInterface ni in interfaces)
|
|||
|
|
// {
|
|||
|
|
// if (ni.OperationalStatus == OperationalStatus.Up &&
|
|||
|
|
// ni.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
|
|||
|
|
// ni.NetworkInterfaceType != NetworkInterfaceType.Tunnel)
|
|||
|
|
// {
|
|||
|
|
// // 简化判断:如果是以太网接口则认为是局域网,否则可能是移动网络
|
|||
|
|
// if (ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
|
|||
|
|
// ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
|
|||
|
|
// {
|
|||
|
|
// return NetworkReachability.ReachableViaLocalAreaNetwork;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return NetworkReachability.NotReachable;
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"获取Windows网络状态失败: {ex.Message}");
|
|||
|
|
// return NetworkReachability.NotReachable;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取Windows本地IP地址
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static string GetLocalIPAddress()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// string hostName = Dns.GetHostName();
|
|||
|
|
// IPHostEntry hostEntry = Dns.GetHostEntry(hostName);
|
|||
|
|
|
|||
|
|
// foreach (IPAddress ip in hostEntry.AddressList)
|
|||
|
|
// {
|
|||
|
|
// if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
|||
|
|
// {
|
|||
|
|
// return ip.ToString();
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return "未知";
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"获取Windows IP地址失败: {ex.Message}");
|
|||
|
|
// return "未知";
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取Windows WiFi信息 (简化版本)
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static WindowsWifiInfo GetWifiInfo()
|
|||
|
|
// {
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// var wifiInfo = new WindowsWifiInfo();
|
|||
|
|
|
|||
|
|
// NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
|
|||
|
|
// foreach (NetworkInterface ni in interfaces)
|
|||
|
|
// {
|
|||
|
|
// if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 &&
|
|||
|
|
// ni.OperationalStatus == OperationalStatus.Up)
|
|||
|
|
// {
|
|||
|
|
// wifiInfo.IsConnected = true;
|
|||
|
|
// wifiInfo.InterfaceName = ni.Name;
|
|||
|
|
// wifiInfo.Speed = ni.Speed;
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// return wifiInfo;
|
|||
|
|
// }
|
|||
|
|
// catch (Exception ex)
|
|||
|
|
// {
|
|||
|
|
// Debug.LogError($"获取Windows WiFi信息失败: {ex.Message}");
|
|||
|
|
// return new WindowsWifiInfo { IsConnected = false };
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// #endregion
|
|||
|
|
|
|||
|
|
// #else
|
|||
|
|
|
|||
|
|
// #region 模拟实现
|
|||
|
|
|
|||
|
|
// public static NetworkReachability GetNetworkReachability()
|
|||
|
|
// {
|
|||
|
|
// Debug.Log("[模拟] 获取网络状态");
|
|||
|
|
// return NetworkReachability.ReachableViaLocalAreaNetwork;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// public static string GetLocalIPAddress()
|
|||
|
|
// {
|
|||
|
|
// Debug.Log("[模拟] 获取IP地址");
|
|||
|
|
// return "192.168.1.100";
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// #if UNITY_ANDROID
|
|||
|
|
// public static AndroidWifiInfo GetWifiInfo()
|
|||
|
|
// {
|
|||
|
|
// Debug.Log("[模拟] 获取WiFi信息");
|
|||
|
|
// return new AndroidWifiInfo
|
|||
|
|
// {
|
|||
|
|
// IsConnected = true,
|
|||
|
|
// SSID = "TestNetwork",
|
|||
|
|
// SignalStrength = -50,
|
|||
|
|
// LinkSpeed = 150
|
|||
|
|
// };
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// public static bool SetWifiEnabled(bool enabled)
|
|||
|
|
// {
|
|||
|
|
// Debug.Log($"[模拟] WiFi {(enabled ? "启用" : "禁用")}");
|
|||
|
|
// return true;
|
|||
|
|
// }
|
|||
|
|
// #else
|
|||
|
|
// public static WindowsWifiInfo GetWifiInfo()
|
|||
|
|
// {
|
|||
|
|
// Debug.Log("[模拟] 获取WiFi信息");
|
|||
|
|
// return new WindowsWifiInfo
|
|||
|
|
// {
|
|||
|
|
// IsConnected = true,
|
|||
|
|
// InterfaceName = "Wi-Fi",
|
|||
|
|
// Speed = 1000000000
|
|||
|
|
// };
|
|||
|
|
// }
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// #endregion
|
|||
|
|
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
// #region 公共方法
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 检查是否连接到互联网
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static bool HasInternetConnection()
|
|||
|
|
// {
|
|||
|
|
// #if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
// // Android平台:返回false避免网络检查
|
|||
|
|
// return false;
|
|||
|
|
// #else
|
|||
|
|
// return Application.internetReachability != NetworkReachability.NotReachable;
|
|||
|
|
// #endif
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// 获取网络类型描述
|
|||
|
|
// /// </summary>
|
|||
|
|
// public static string GetNetworkTypeDescription()
|
|||
|
|
// {
|
|||
|
|
// #if UNITY_ANDROID && !UNITY_EDITOR
|
|||
|
|
// // Android平台:返回静态描述避免网络检查
|
|||
|
|
// return "配置模式 (跳过网络检查)";
|
|||
|
|
// #else
|
|||
|
|
// switch (Application.internetReachability)
|
|||
|
|
// {
|
|||
|
|
// case NetworkReachability.NotReachable:
|
|||
|
|
// return "无网络连接";
|
|||
|
|
// case NetworkReachability.ReachableViaCarrierDataNetwork:
|
|||
|
|
// return "移动数据网络";
|
|||
|
|
// case NetworkReachability.ReachableViaLocalAreaNetwork:
|
|||
|
|
// return "WiFi/以太网";
|
|||
|
|
// default:
|
|||
|
|
// return "未知网络";
|
|||
|
|
// }
|
|||
|
|
// #endif
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// #endregion
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// Android WiFi信息
|
|||
|
|
// /// </summary>
|
|||
|
|
// [System.Serializable]
|
|||
|
|
// public class AndroidWifiInfo
|
|||
|
|
// {
|
|||
|
|
// public bool IsConnected;
|
|||
|
|
// public bool IsWifiEnabled;
|
|||
|
|
// public string SSID;
|
|||
|
|
// public int SignalStrength; // dBm
|
|||
|
|
// public int LinkSpeed; // Mbps
|
|||
|
|
|
|||
|
|
// public override string ToString()
|
|||
|
|
// {
|
|||
|
|
// if (!IsConnected)
|
|||
|
|
// return "未连接WiFi";
|
|||
|
|
|
|||
|
|
// return $"WiFi: {SSID}, 信号: {SignalStrength}dBm, 速度: {LinkSpeed}Mbps";
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// /// <summary>
|
|||
|
|
// /// Windows WiFi信息
|
|||
|
|
// /// </summary>
|
|||
|
|
// [System.Serializable]
|
|||
|
|
// public class WindowsWifiInfo
|
|||
|
|
// {
|
|||
|
|
// public bool IsConnected;
|
|||
|
|
// public string InterfaceName;
|
|||
|
|
// public long Speed; // bps
|
|||
|
|
|
|||
|
|
// public override string ToString()
|
|||
|
|
// {
|
|||
|
|
// if (!IsConnected)
|
|||
|
|
// return "未连接WiFi";
|
|||
|
|
|
|||
|
|
// return $"WiFi: {InterfaceName}, 速度: {Speed / 1000000}Mbps";
|
|||
|
|
// }
|
|||
|
|
// }
|