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 Unity.VisualScripting;
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();
BluetoothManager.Instance.ChangeAimMac("");
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)
{
qrCodePlane.GetComponent().Close();
foreach(var d in DataManager.Instance.OwnedDevices)
{
if(d.ble_mac==result)
ToastUI.Show("100287");
qrCodePlane.GetComponent().OnQRCodeScanned+=GetQrResult;
return;
}
foreach(var d in DataManager.Instance.SharedDevices)
{
if(d.ble_mac==result)
ToastUI.Show("100287");
qrCodePlane.GetComponent().OnQRCodeScanned+=GetQrResult;
return;
}
isconnecting=true;
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("100082") ?? "请输入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("100083") ?? "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;
foreach(var d in DataManager.Instance.OwnedDevices)
{
if(d.ble_mac==device.Address)
return;
}
foreach(var d in DataManager.Instance.SharedDevices)
{
if(d.ble_mac==device.Address)
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();
BandDevice();
}
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.transform.Find("mac").GetComponent().text=device.Address;
deviceObject.SetActive(true);
deviceObjects.Add(deviceObject);
int index = deviceObjects.Count-1;
deviceObject.GetComponent