From d8927ceca5a20031c38e266af85592dd58463fae Mon Sep 17 00:00:00 2001 From: lishuo Date: Thu, 26 Aug 2021 19:33:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E7=89=99=E5=81=9C=E6=AD=A2=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E5=92=8C=E4=B8=80=E4=BA=9Bbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Android/unityandroidbluetoothlelib.jar | Bin 36890 -> 36977 bytes Assets/Plugins/BluetoothDeviceScript.cs | 26 ++-- Assets/Plugins/BluetoothHardwareInterface.cs | 5 +- Assets/Plugins/iOS/UnityBluetoothLE.h.meta | 6 +- Assets/Plugins/iOS/libWeChatSDK.a.meta | 2 +- Assets/Scripts/Devices/Ble/BleDevice.cs | 1 - .../Scripts/Devices/Ble/BleDeviceAdapter.cs | 6 +- .../Ble/Interfaces/IBleWinHwInterface.cs | 1 + .../Devices/Ble/Win/BleWinHwInterface.cs | 4 + .../Devices/Ble/Win/WclBleMainThread.cs | 10 +- .../Devices/Ble/mobile/BleMobileInterface.cs | 119 +++++++++++------- .../Devices/Ble/mobile/BleMobileThread.cs | 5 + Assets/Scripts/Devices/MainDeviceAdapter.cs | 5 +- Assets/Scripts/Scenes/MainController.cs | 5 +- .../UI/Prefab/Panel/DeviceController.cs | 6 +- Assets/Shatalmic/plugin.unitypackage.meta | 7 ++ 16 files changed, 137 insertions(+), 71 deletions(-) create mode 100644 Assets/Shatalmic/plugin.unitypackage.meta diff --git a/Assets/Plugins/Android/unityandroidbluetoothlelib.jar b/Assets/Plugins/Android/unityandroidbluetoothlelib.jar index 588e16217adb295a08e4385a7310328a3e2c9160..ec45ca2ab39730b5c7bf8f885eb06d6f4908e4d2 100644 GIT binary patch delta 29740 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 RetrievedConnectedPeripheralAction; public Action PeripheralReceivedWriteDataAction; public Action ConnectedPeripheralAction; - public Action ConnectedDisconnectPeripheralAction; + public Action ConnectedDisconnectPeripheralAction { get; set; } public Action DisconnectedPeripheralAction; + public Action DeviceBleStatusDisconnectedAction; public Action DiscoveredServiceAction; public Action DiscoveredCharacteristicAction; public Action DidWriteCharacteristicAction; @@ -80,11 +81,14 @@ public class BluetoothDeviceScript : MonoBehaviour { char[] delim = new char[] { '~' }; string[] parts = message.Split (delim); - if (parts[0].Equals("DeviceStateChanged")) - { - //throw new Exception("test"); - } - if (parts[0].Equals(bleStatusChanged)) + if (parts[0].Equals("DeviceStateChanged")) + { + if (DeviceBleStatusDisconnectedAction != null && parts[1].Equals("0")) + { + DeviceBleStatusDisconnectedAction(parts[2]); + } + } + if (parts[0].Equals(bleStatusChanged)) { if (BleStatusChangedAction != null) { @@ -231,12 +235,12 @@ public class BluetoothDeviceScript : MonoBehaviour { if (parts.Length >= 2) { - if (ConnectedDisconnectPeripheralAction != null) - ConnectedDisconnectPeripheralAction (parts[1]); + if (ConnectedDisconnectPeripheralAction != null) + ConnectedDisconnectPeripheralAction(parts[1]); - if (DisconnectedPeripheralAction != null) - DisconnectedPeripheralAction (parts[1]); - } + if (DisconnectedPeripheralAction != null) + DisconnectedPeripheralAction(parts[1]); + } } else if (message.Length >= deviceDiscoveredService.Length && message.Substring (0, deviceDiscoveredService.Length) == deviceDiscoveredService) { diff --git a/Assets/Plugins/BluetoothHardwareInterface.cs b/Assets/Plugins/BluetoothHardwareInterface.cs index 4c80d913..674d2410 100644 --- a/Assets/Plugins/BluetoothHardwareInterface.cs +++ b/Assets/Plugins/BluetoothHardwareInterface.cs @@ -26,6 +26,7 @@ using UnityEngine; using System; using System.Runtime.InteropServices; using System.Collections.Generic; +using System.Threading; #if UNITY_2018_3_OR_NEWER #if UNITY_ANDROID @@ -605,6 +606,7 @@ public class BluetoothLEHardwareInterface public static void ConnectToPeripheral (string name, Action connectAction, Action serviceAction, Action characteristicAction, Action disconnectAction = null) { + #if !UNITY_EDITOR_OSX || !EXPERIMENTAL_MACOS_EDITOR if (!Application.isEditor) { @@ -614,7 +616,8 @@ public class BluetoothLEHardwareInterface bluetoothDeviceScript.ConnectedPeripheralAction = connectAction; bluetoothDeviceScript.DiscoveredServiceAction = serviceAction; bluetoothDeviceScript.DiscoveredCharacteristicAction = characteristicAction; - bluetoothDeviceScript.ConnectedDisconnectPeripheralAction = disconnectAction; + //bluetoothDeviceScript.ConnectedDisconnectPeripheralAction = disconnectAction; + bluetoothDeviceScript.DeviceBleStatusDisconnectedAction = disconnectAction; } #if EXPERIMENTAL_MACOS_EDITOR && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX) diff --git a/Assets/Plugins/iOS/UnityBluetoothLE.h.meta b/Assets/Plugins/iOS/UnityBluetoothLE.h.meta index 4bab6c82..4702e528 100644 --- a/Assets/Plugins/iOS/UnityBluetoothLE.h.meta +++ b/Assets/Plugins/iOS/UnityBluetoothLE.h.meta @@ -12,19 +12,19 @@ PluginImporter: validateReferences: 1 platformData: - first: - '': Linux + : Linux second: enabled: 0 settings: CPU: x86 - first: - '': OSXIntel + : OSXIntel second: enabled: 0 settings: CPU: AnyCPU - first: - '': OSXIntel64 + : OSXIntel64 second: enabled: 0 settings: diff --git a/Assets/Plugins/iOS/libWeChatSDK.a.meta b/Assets/Plugins/iOS/libWeChatSDK.a.meta index 4514869d..db5b0492 100644 --- a/Assets/Plugins/iOS/libWeChatSDK.a.meta +++ b/Assets/Plugins/iOS/libWeChatSDK.a.meta @@ -47,7 +47,7 @@ PluginImporter: second: enabled: 0 settings: - CPU: x86_64 + CPU: AnyCPU - first: Standalone: OSXUniversal second: diff --git a/Assets/Scripts/Devices/Ble/BleDevice.cs b/Assets/Scripts/Devices/Ble/BleDevice.cs index beadb367..aea62baa 100644 --- a/Assets/Scripts/Devices/Ble/BleDevice.cs +++ b/Assets/Scripts/Devices/Ble/BleDevice.cs @@ -103,7 +103,6 @@ namespace Assets.Scripts.Devices.Ble hwInterface.DiscoverServices(this.peripheralInfo, ServicesDiscoveredAction);//, this.ServicesDiscoveredAction); return; } - this.State = DeviceState.Disconnected; if (response.Error != null) { diff --git a/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs b/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs index b32faaae..8b12fe79 100644 --- a/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs +++ b/Assets/Scripts/Devices/Ble/BleDeviceAdapter.cs @@ -94,7 +94,7 @@ namespace Assets.Scripts.Devices.Ble { return; } - +#if !(UNITY_ANDROID || UNITY_IOS) var device111 = discoveredDevices.Last().Value; if (device111 != null && device111.State == Ant.DeviceState.Disconnected) { @@ -103,8 +103,10 @@ namespace Assets.Scripts.Devices.Ble //TODO:取消注释,自动连接设备 //Debug.Log("自动连接" + device111.Id); device111.Connect(); + Thread.Sleep(2000); } } +#endif //discoveredDevices.Add(device.Peripheral.Address, new BleDevice(device.Peripheral, hwInterface, device.SensorType)); @@ -119,7 +121,7 @@ namespace Assets.Scripts.Devices.Ble public override void StopScan() { - + hwInterface.StopScan(); } public override void Dispose() diff --git a/Assets/Scripts/Devices/Ble/Interfaces/IBleWinHwInterface.cs b/Assets/Scripts/Devices/Ble/Interfaces/IBleWinHwInterface.cs index dc500079..2be4426b 100644 --- a/Assets/Scripts/Devices/Ble/Interfaces/IBleWinHwInterface.cs +++ b/Assets/Scripts/Devices/Ble/Interfaces/IBleWinHwInterface.cs @@ -19,6 +19,7 @@ namespace Assets.Scripts.Devices.Ble.Interfaces void WriteCharacteristic(BleCharacteristicInfo characteristic, byte[] data); void ReadCharacteristic(BleCharacteristicInfo characteristic, CharacteristicReadCallback callback); void Dispose(); + void StopScan(); BleState BleState { get; set; } Dictionary pCache { get; set; } event BluetoothStateChangedCallback BluetoothStateChangedEvent; diff --git a/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs b/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs index 794db60f..a8a4f73e 100644 --- a/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs +++ b/Assets/Scripts/Devices/Ble/Win/BleWinHwInterface.cs @@ -477,6 +477,10 @@ namespace Assets.Scripts.Ble hwInterface = null; pCache.Clear(); } + public void StopScan() + { + + } public void ReadCharacteristic(BleCharacteristicInfo characteristic, CharacteristicReadCallback callback) { diff --git a/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs b/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs index 78d461e6..c614d4a3 100644 --- a/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs +++ b/Assets/Scripts/Devices/Ble/Win/WclBleMainThread.cs @@ -80,7 +80,7 @@ namespace Assets.Scripts.Devices.Ble.Win { this.wclWatcher.StopScan(); } - //this.StopGattThreads(); + this.StopGattThreads(); if (this.wclBleManager.Active) { this.wclBleManager.ManagerStatusChanged = null; @@ -119,6 +119,14 @@ namespace Assets.Scripts.Devices.Ble.Win status, }); } + public void StopGattThreads() + { + Debug.Log("停止thread"); + foreach (var item in this.gattClients.Values) + { + item.Stop(); + } + } public override bool Stop() { diff --git a/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs b/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs index b18fa19f..b447ce4c 100644 --- a/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs +++ b/Assets/Scripts/Devices/Ble/mobile/BleMobileInterface.cs @@ -203,21 +203,6 @@ namespace Assets.Scripts.Ble } } - //private WclBleGattThread SetUpGattClient(BlePeripheralInfo peripheral) - //{ - // WclBleGattThread wclBleGattThread = this.wclBleMainThread.CreateGattThread(peripheral); - // wclBleGattThread.GattConnected += this.GattConnected; - // wclBleGattThread.GattDisconnected += this.GattDisconnected; - // wclBleGattThread.GattServicesDiscovered += this.GattServicesDiscovered; - // wclBleGattThread.GattCharacteristicsDiscovered += this.GattCharacteristicsDiscovered; - // wclBleGattThread.GattCharacteristicSubscribed += this.GattCharacteristicSubscribed; - // wclBleGattThread.GattCharacteristicRead += this.GattCharacteristicRead; - // wclBleGattThread.GattCharacteristicWrote += this.GattCharacteristicWrote; - // wclBleGattThread.GattCharacteristicChanged += this.GattCharacteristicChanged; - // wclBleGattThread.Start(); - // return wclBleGattThread; - //} - List servicelist = new List(); List characteristilist = new List(); public void ConnectPeripheral(BlePeripheralInfo info, Action callback) @@ -230,45 +215,81 @@ namespace Assets.Scripts.Ble { callback?.Invoke(self, info, s); }, (address, service) => { - if (servicesCallbacks.Where(c => c.Key.Address == address).Any()) - { - - var serviceCallback = servicesCallbacks.Where(c => c.Key.Address == address).FirstOrDefault(); - List servicelist = new List(); - servicelist.Add(new WinBleServiceInfo(serviceCallback.Key,new Guid(service))); - BleResponse> response = new BleResponse> - { - IsSuccess = true, - Error = null, - Data = servicelist, - }; - serviceCallback.Value?.Invoke(this, serviceCallback.Key, response); - } - + ServicesDiscovered(address, service); }, (address, service, characteristic) => { - if (characteristicsDiscoveredCallbacks.Where(c => c.Key.Peripheral.Address == address).Any()) - { - var characteristicCallback = characteristicsDiscoveredCallbacks.Where(c => c.Key.Peripheral.Address == address).FirstOrDefault(); - List characteristiclist = new List(); - characteristiclist.Add(new WinBleCharacteristicInfo(new Guid(characteristic), new WinBleServiceInfo(characteristicCallback.Key.Peripheral, new Guid(service)),0)); - BleResponse> response = new BleResponse> - { - IsSuccess = true, - Error = null, - Data = characteristiclist, - }; - characteristicCallback.Value?.Invoke(this, characteristicCallback.Key, response); - } - }, null); + CharacteristicsDiscovered(address, service, characteristic); + }, (address)=> { + PeripheralDisconnected(address, info); + }); } + #region 私有方法 + //服务发现 + private void ServicesDiscovered(string address, string service) + { + if (servicesCallbacks.Where(c => c.Key.Address == address).Any()) + { + + var serviceCallback = servicesCallbacks.Where(c => c.Key.Address == address).FirstOrDefault(); + List servicelist = new List(); + servicelist.Add(new WinBleServiceInfo(serviceCallback.Key, new Guid(service))); + BleResponse> response = new BleResponse> + { + IsSuccess = true, + Error = null, + Data = servicelist, + }; + serviceCallback.Value?.Invoke(this, serviceCallback.Key, response); + } + } + //特征值发现 + private void CharacteristicsDiscovered(string address, string service, string characteristic) + { + if (characteristicsDiscoveredCallbacks.Where(c => c.Key.Peripheral.Address == address).Any()) + { + var characteristicCallback = characteristicsDiscoveredCallbacks.Where(c => c.Key.Peripheral.Address == address).FirstOrDefault(); + List characteristiclist = new List(); + characteristiclist.Add(new WinBleCharacteristicInfo(new Guid(characteristic), new WinBleServiceInfo(characteristicCallback.Key.Peripheral, new Guid(service)), 0)); + BleResponse> response = new BleResponse> + { + IsSuccess = true, + Error = null, + Data = characteristiclist, + }; + characteristicCallback.Value?.Invoke(this, characteristicCallback.Key, response); + } + } + //设备主动断开处理 + private void PeripheralDisconnected(string address, BlePeripheralInfo info) + { + var characteristicCallback = characteristicNotificationCallbacks.Where(c => c.Key.MatchAddress(address)); + if (characteristicCallback.Any()) + { + characteristicNotificationCallbacks.Remove(characteristicCallback.First().Key); + } + + var serviceCallback = servicesCallbacks.Where(c => c.Key.MatchAddress(address)); + if (serviceCallback.Any()) + { + servicesCallbacks.Remove(serviceCallback.First().Key); + } + + var characteristicsDiscoveredCallback = characteristicsDiscoveredCallbacks.Where(c => c.Key.MatchAddress(address)); + if (serviceCallback.Any()) + { + characteristicsDiscoveredCallbacks.Remove(characteristicsDiscoveredCallback.First().Key); + } + + peripheralDisconnectedEvent(this, info, null, false); + } + #endregion //设备断开连接 public void DisconnectPeripheral(BlePeripheralInfo peripheral, Action callback) { BluetoothLEHardwareInterface.DisconnectPeripheral(peripheral.Address, (address) => { - //peripheralDisconnectedEvent(this, peripheral, null, true); + peripheralDisconnectedEvent(this, peripheral, null, true); callback?.Invoke(); }); } @@ -289,6 +310,12 @@ namespace Assets.Scripts.Ble _discoveredCallback = discoveredCallBack; bleMobileThread.StartWatcher(); } + + public void StopScan() + { + bleMobileThread.Stop(); + } + //发现服务列表 public void DiscoverServices(BlePeripheralInfo peripheral, Action>> callback) { @@ -332,7 +359,7 @@ namespace Assets.Scripts.Ble bleMobileThread.ManagerInitialized -= BleMobileThread_ManagerInitialized; bleMobileThread.ManagerStatusChanged -= ManagerStatusChanged; bleMobileThread.ScanInfoReceived -= WatcherScanInfoReceived; - bleMobileThread.Stop(); + bleMobileThread.Dispose(); bleMobileThread = null; hwInterface = null; pCache.Clear(); diff --git a/Assets/Scripts/Devices/Ble/mobile/BleMobileThread.cs b/Assets/Scripts/Devices/Ble/mobile/BleMobileThread.cs index 701ee78c..a083fcc7 100644 --- a/Assets/Scripts/Devices/Ble/mobile/BleMobileThread.cs +++ b/Assets/Scripts/Devices/Ble/mobile/BleMobileThread.cs @@ -77,5 +77,10 @@ namespace Assets.Scripts.Devices.Ble { BluetoothLEHardwareInterface.StopScan(); } + public void Dispose() + { + BluetoothLEHardwareInterface.StopScan(); + BluetoothLEHardwareInterface.DisconnectAll(); + } } } diff --git a/Assets/Scripts/Devices/MainDeviceAdapter.cs b/Assets/Scripts/Devices/MainDeviceAdapter.cs index a5f84d70..d3246a5e 100644 --- a/Assets/Scripts/Devices/MainDeviceAdapter.cs +++ b/Assets/Scripts/Devices/MainDeviceAdapter.cs @@ -47,7 +47,10 @@ namespace Assets.Scripts.Devices public void StopScan() { - + adapters.ForEach(item => + { + item.StopScan(); + }); } public DeviceAdapterState GetState(ConnectionInterface connectionInterface) diff --git a/Assets/Scripts/Scenes/MainController.cs b/Assets/Scripts/Scenes/MainController.cs index 4f088670..6c45e744 100644 --- a/Assets/Scripts/Scenes/MainController.cs +++ b/Assets/Scripts/Scenes/MainController.cs @@ -24,9 +24,10 @@ public class MainController : BaseScene #if UNITY_ANDROID || UNITY_IOS transform.GetComponent().referenceResolution = new Vector2(844, 390); transform.Find("Panel").GetComponent().sizeDelta = new Vector2(844, 390); - transform.Find("ModalPanel").GetComponent().sizeDelta = new Vector2(844, 390); -#endif + //transform.Find("ModalPanel").GetComponent().sizeDelta = new Vector2(844, 390); +#else App.MainDeviceAdapter.StartScan(); +#endif } // Start is called before the first frame update diff --git a/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs b/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs index 20113156..30496149 100644 --- a/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs +++ b/Assets/Scripts/UI/Prefab/Panel/DeviceController.cs @@ -90,7 +90,6 @@ public class DeviceController : PFUIPanel protected override void Awake() { base.Awake(); - //Debug.Log("device awake"); } @@ -109,6 +108,7 @@ public class DeviceController : PFUIPanel { //UIManager.ShowHomePanel(); //UIManager.CloseModal(); + App.MainDeviceAdapter.StopScan(); this.Close(); })); //UIManager.AddEvent(mReturnBtn.gameObject, EventTriggerType.PointerUp, (e) => @@ -191,7 +191,9 @@ public class DeviceController : PFUIPanel cg.alpha = 0; base.Show(); App.MainDeviceAdapter.ClearDevice(); - +#if UNITY_ANDROID || UNITY_IOS + App.MainDeviceAdapter.StartScan(); +#endif cg.DOFade(1f, 0.3f); } diff --git a/Assets/Shatalmic/plugin.unitypackage.meta b/Assets/Shatalmic/plugin.unitypackage.meta new file mode 100644 index 00000000..c11cbc4e --- /dev/null +++ b/Assets/Shatalmic/plugin.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1a70f37e2f13e4df0ac477f3c3eb451b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: