167 lines
5.5 KiB
C#
Raw Normal View History

2026-06-08 08:55:10 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using Kill.Bluetooth;
using Kill.Core;
using Kill.Managers;
using Kill.UI.Components;
using UnityEngine;
using UnityEngine.UI;
namespace Kill.UI.Pages
{
public class SetWifiPage : MonoBehaviour
{
public InputField ssidInput;
public InputField passwordInput;
public Button confirmButton;
public Button backButton;
Action<string> callback;
public void Init(Action<string> wifiInfoCallback)
{
callback = wifiInfoCallback;
UIManager.Instance.RegisterBackAction(Back);
backButton.onClick.RemoveAllListeners();
backButton.onClick.AddListener(Back);
confirmButton.onClick.RemoveAllListeners();
confirmButton.onClick.AddListener(OnWifiConfirmClick);
string wifiName = GetCurrentWiFiName();
ssidInput.text = wifiName ?? "";
passwordInput.text = "";
CheckWifiNameAndPassword();
ssidInput.onEndEdit.RemoveAllListeners();
ssidInput.onEndEdit.AddListener(delegate { CheckWifiNameAndPassword(); });
passwordInput.onEndEdit.RemoveAllListeners();
passwordInput.onEndEdit.AddListener(delegate { CheckWifiNameAndPassword(); });
}
public void Back()
{
UIManager.Instance.RegisterBackAction(GetComponentInParent<DeviceInfoPage>().Back);
Destroy(gameObject);
}
public void CheckWifiNameAndPassword()
{
string ssid = ssidInput.text.Trim();
string password = passwordInput.text;
if (string.IsNullOrEmpty(ssid) || string.IsNullOrEmpty(password))
{
confirmButton.gameObject.SetActive(false);
}
else
{
confirmButton.gameObject.SetActive(true);
}
}
/// <summary>
/// 确认配置 WiFi
/// </summary>
public void OnWifiConfirmClick()
{
string ssid = ssidInput.text.Trim();
string password = passwordInput.text;
if (string.IsNullOrEmpty(ssid))
{
ToastUI.ShowText(LanguageManager.Instance.GetLanguage("100082") ?? "请输入WiFi名称");
return;
}
// 创建 WiFi 配置
var wifiControl = new Bluetooth.Protocol.WIFIControl
{
Enable = true,
SSID = ssid,
Password = password
};
LoadingUI.Show();
// 发送 WiFi 配置到设备
BLECommunicationManager.Instance.WriteWIFIControl(wifiControl, (success) =>
{
Loom.QueueOnMainThread(() =>
{
LoadingUI.Hide();
if (success)
{
ToastUI.ShowText(LanguageManager.Instance.GetLanguage("100222") ?? "WiFi配置成功");
Back();
callback?.Invoke(ssid);
}
else
{
ToastUI.ShowText(LanguageManager.Instance.GetLanguage("100083") ?? "WiFi配置失败");
}
});
});
}
/// <summary>
/// 获取当前连接的 WiFi 名称
/// </summary>
private string GetCurrentWiFiName()
{
#if UNITY_ANDROID && !UNITY_EDITOR
try
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
using (AndroidJavaObject wifiManager = currentActivity.Call<AndroidJavaObject>("getSystemService", "wifi"))
{
if (wifiManager == null) return null;
using (AndroidJavaObject wifiInfo = wifiManager.Call<AndroidJavaObject>("getConnectionInfo"))
{
if (wifiInfo == null) return null;
string ssid = wifiInfo.Call<string>("getSSID");
if (!string.IsNullOrEmpty(ssid) && ssid != "<unknown ssid>")
{
return ssid.Trim('"');
}
}
}
}
catch (System.Exception ex)
{
Debug.LogError($"获取 WiFi 名称失败: {ex.Message}");
}
return null;
#elif UNITY_IOS && !UNITY_EDITOR
// iOS 调用原生插件
return GetWiFiNameIOS();
#else
return "Editor_WiFi"; // 编辑器返回模拟值
#endif
}
#if UNITY_IOS && !UNITY_EDITOR
[System.Runtime.InteropServices.DllImport("__Internal")]
private static extern System.IntPtr GetWiFiSSID();
/// <summary>
/// iOS 获取 WiFi 名称
/// </summary>
private string GetWiFiNameIOS()
{
try
{
System.IntPtr ptr = GetWiFiSSID();
if (ptr == System.IntPtr.Zero)
{
return null;
}
string ssid = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr);
// 释放内存
System.Runtime.InteropServices.Marshal.FreeHGlobal(ptr);
return ssid;
}
catch (System.Exception ex)
{
Debug.LogError($"iOS 获取 WiFi 名称失败: {ex.Message}");
return null;
}
}
#endif
}
}