using System; using System.Collections; using System.Collections.Generic; using Kill.Bluetooth; using Kill.Core; using Kill.Managers; using Kill.Network; using Kill.UI; using Kill.UI.Components; using Kill.UI.Pages; using UnityEngine; using UnityEngine.UI; public class ConnectDevicePageCtrl : MonoBehaviour { /// /// 0连接 1 失败 2 成功 3 选择wifi /// public GameObject[] sonPages; public GameObject topBar; public string blueToothNameKeyWord; private List deviceList = new List(); public Button backButton; public Button skipButton; public GameObject titleText; public GameObject scanningIcon; void Start() { BluetoothManager.Instance.OnDeviceFound += OnDeviceFound; BluetoothManager.Instance.OnConnectedSuccess += OnDeviceConnected; BluetoothManager.Instance.OnConnectFailed += OnConnectFailed; BluetoothManager.Instance.OnDisconnected += OnDeviceDisconnected; EnterConnectPage(); } void OnDestroy() { BluetoothManager.Instance.OnDeviceFound -= OnDeviceFound; BluetoothManager.Instance.OnConnectedSuccess -= OnDeviceConnected; BluetoothManager.Instance.OnConnectFailed -= OnConnectFailed; BluetoothManager.Instance.OnDisconnected -= OnDeviceDisconnected; } public void EnterConnectPage() { OnStopScanClick(); if(BluetoothManager.Instance.IsConnected) BluetoothManager.Instance.Disconnect(); topBar.SetActive(true); titleText.SetActive(false); backButton.onClick.RemoveAllListeners(); backButton.onClick.AddListener(BackToHomePage); backButton.gameObject.SetActive(true); skipButton.gameObject.SetActive(false); foreach(GameObject g in sonPages) g.gameObject.SetActive(false); sonPages[0].SetActive(true); UIManager.Instance.RegisterBackAction(BackToHomePage); OnScanClick(); } public GameObject qrCodePlane; public void ScanQrCode() { qrCodePlane.SetActive(true); qrCodePlane.GetComponent().OnQRCodeScanned+=GetQrResult; } public void GetQrResult(string result) { BluetoothManager.Instance.Connect(result); LoadingUI.Show(); qrCodePlane.SetActive(false); nowDeviceMac=result; } string errorTip=""; private void ShowErrorPage() { if(BluetoothManager.Instance.IsConnected) BluetoothManager.Instance.Disconnect(); topBar.SetActive(false); foreach(GameObject g in sonPages) g.gameObject.SetActive(false); sonPages[1].SetActive(true); Text errorText=sonPages[1].transform.Find("提示").GetComponent(); if(errorTip!="") { errorText.text=LanguageManager.Instance.GetLanguage(errorTip); } else { errorText.text=LanguageManager.Instance.GetLanguage("100069"); } UIManager.Instance.RegisterBackAction(EnterConnectPage); LoadingUI.Hide(); } public InputField wifiNameInput; public InputField wifiPasswordInput; public void ShowWifiPage() { topBar.SetActive(true); titleText.SetActive(true); backButton.gameObject.SetActive(false); UIManager.Instance.ClearBackAction(); skipButton.gameObject.SetActive(true); foreach(GameObject g in sonPages) g.gameObject.SetActive(false); sonPages[3].SetActive(true); // 获取当前 WiFi 名称 string wifiName = GetCurrentWiFiName(); wifiNameInput.text = wifiName ?? ""; wifiPasswordInput.text=""; } /// /// 确认配置 WiFi /// public void OnWifiConfirmClick() { string ssid = wifiNameInput.text.Trim(); string password = wifiPasswordInput.text; if (string.IsNullOrEmpty(ssid)) { ToastUI.ShowText(LanguageManager.Instance.GetLanguage("100071") ?? "请输入WiFi名称"); return; } // 创建 WiFi 配置 var wifiControl = new Kill.Bluetooth.Protocol.WIFIControl { Enable = true, SSID = ssid, Password = password }; LoadingUI.Show(); // 发送 WiFi 配置到设备 BLECommunicationManager.Instance.WriteWIFIControl(wifiControl, (success) => { Loom.QueueOnMainThread(() => { LoadingUI.Hide(); if (success) { UnityEngine.Debug.Log("WiFi 配置成功"); ShowSuccessPage(); } else { ToastUI.ShowText(LanguageManager.Instance.GetLanguage("100072") ?? "WiFi配置失败"); } }); }); } /// /// 0不可点击 1可点击 /// public GameObject[] wifiConfirmButtons; public void CheckWifiNameAndPassword() { string ssid = wifiNameInput.text.Trim(); string password = wifiPasswordInput.text; if(string.IsNullOrEmpty(ssid) || string.IsNullOrEmpty(password)) { wifiConfirmButtons[0].SetActive(true); wifiConfirmButtons[1].SetActive(false); } else { wifiConfirmButtons[0].SetActive(false); wifiConfirmButtons[1].SetActive(true); } } /// /// 获取当前连接的 WiFi 名称 /// private string GetCurrentWiFiName() { #if UNITY_ANDROID && !UNITY_EDITOR try { using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (AndroidJavaObject currentActivity = unityPlayer.GetStatic("currentActivity")) using (AndroidJavaObject wifiManager = currentActivity.Call("getSystemService", "wifi")) { if (wifiManager == null) return null; using (AndroidJavaObject wifiInfo = wifiManager.Call("getConnectionInfo")) { if (wifiInfo == null) return null; string ssid = wifiInfo.Call("getSSID"); if (!string.IsNullOrEmpty(ssid) && 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(); /// /// iOS 获取 WiFi 名称 /// 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 public void ShowSuccessPage() { topBar.SetActive(false); foreach(GameObject g in sonPages) g.gameObject.SetActive(false); sonPages[2].SetActive(true); UIManager.Instance.RegisterBackAction(EnterConnectPage); } private void OnDeviceFound(BluetoothDevice device) { if(string.IsNullOrEmpty(device.Name)) return; AddOneDevice(device); } private void OnDeviceConnected() { if (selectedIndex >= 0 && selectedIndex < deviceObjects.Count) { deviceObjects[selectedIndex].transform.Find("状态").Find("loading").gameObject.SetActive(false); deviceObjects[selectedIndex].transform.Find("状态").Find("成功").gameObject.SetActive(true); } // 延迟 500ms 再查询,确保 BLE 连接完全就绪 StartCoroutine(DelayedQueryRegistration()); isconnecting =false; } /// /// 延迟查询注册状态 /// private System.Collections.IEnumerator DelayedQueryRegistration() { yield return new WaitForSeconds(0.5f); OnQueryRegistrationClick(); } private void OnConnectFailed(string address) { if(!isconnecting) return; errorTip="100069"; ShowErrorPage(); isconnecting=false; } private void OnDeviceDisconnected(string address) { // UpdateStatus($"已断开连接: {address}"); // if (deviceStatusText != null) // deviceStatusText.text = "未连接"; } public List deviceObjects; /// /// 开始扫描 /// public void OnScanClick() { scanningIcon.SetActive(true); devicePrefab.SetActive(false); if (BluetoothManager.Instance != null) { // 清空列表 deviceList.Clear(); if (deviceObjects != null && deviceObjects.Count > 0) { foreach (var item in deviceObjects) { Destroy(item); } deviceObjects.Clear(); } deviceObjects = new List(); BluetoothManager.Instance.StartScan(999f); // 扫描999秒 } } public GameObject deviceListParent; public GameObject devicePrefab; public GameObject deviceListUi; bool isconnecting=false; public void AddOneDevice(BluetoothDevice device) { if (deviceList.Contains(device)) return; if(!device.Name.Contains(blueToothNameKeyWord)) return; if(!deviceListUi.activeSelf) deviceListUi.SetActive(true); deviceList.Add(device); GameObject deviceObject = Instantiate(devicePrefab, deviceListParent.transform); deviceObject.transform.Find("name").GetComponent().text=device.Name; deviceObject.SetActive(true); deviceObjects.Add(deviceObject); int index = deviceObjects.Count-1; deviceObject.GetComponent