소스 검색

1.修复pc版本双人蓝牙连接冲突

slambb 1 년 전
부모
커밋
09faed79c2

+ 28 - 3
Assets/BowArrow/InfraredCamera/InfraredDemo.cs

@@ -490,7 +490,7 @@ public class InfraredDemo : MonoBehaviour
 #if UNITY_STANDALONE_WIN || UNITY_EDITOR
         //隐藏不需要的设置
         _btnAdjusting.interactable = false;
-         _dropdownResolution.gameObject.SetActive(false);
+        _dropdownResolution.gameObject.SetActive(false);
         _dropdownResolution2.gameObject.SetActive(false);
     
 #endif
@@ -580,7 +580,21 @@ public class InfraredDemo : MonoBehaviour
                 process.CallStatic("killProcess", pid);
             }
         }
-        else Application.Quit();
+        else {
+            // 获取当前应用程序的可执行文件路径
+            string executablePath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
+
+            // 重启应用程序
+            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
+            {
+                FileName = executablePath,
+                UseShellExecute = false
+            };
+            System.Diagnostics.Process.Start(startInfo);
+
+            // 退出当前应用程序
+            Application.Quit();
+        };
     }
 
     void UpdateInfraredCamera()
@@ -797,8 +811,19 @@ public class InfraredDemo : MonoBehaviour
         //SetContrast(1);
 
         SetShakeFilterValue(6);
-
         SetLineWidth(10);
+        SetInfraredFilterValue(0.8f);
+        SetCaptureValue(30.0f);
+        SetDelayValue(30.0f);
+    }
+
+    public void OnClickClearAll() {
+        PlayerPrefs.DeleteAll();
+        // 保存更改
+        PlayerPrefs.Save();
+
+        StartCoroutine(RestartOrKillApp());
+
     }
     void OnClick_ScreenLocateManual()
     {

+ 215 - 0
Assets/BowArrow/InfraredCamera/Resources/InfraredDemo.prefab

@@ -661,6 +661,7 @@ RectTransform:
   - {fileID: 2158124803493339213}
   - {fileID: 7818170058981052388}
   - {fileID: 1406637764187674216}
+  - {fileID: 267864263453947856}
   m_Father: {fileID: 7795906586411487646}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -7545,6 +7546,86 @@ MonoBehaviour:
     m_VerticalOverflow: 0
     m_LineSpacing: 1
   m_Text: "Capture \u503C"
+--- !u!1 &5705913744133789696
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2445024852286898070}
+  - component: {fileID: 3406677643311788980}
+  - component: {fileID: 4262745974054550364}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2445024852286898070
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5705913744133789696}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 267864263453947856}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &3406677643311788980
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5705913744133789696}
+  m_CullTransparentMesh: 1
+--- !u!114 &4262745974054550364
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5705913744133789696}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 14
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 10
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u6E05\u7A7A\u6240\u6709\u6570\u636E\u5E76\u91CD\u542F"
 --- !u!1 &5712543318665647999
 GameObject:
   m_ObjectHideFlags: 0
@@ -8790,6 +8871,140 @@ MonoBehaviour:
           m_StringArgument: 
           m_BoolArgument: 0
         m_CallState: 2
+--- !u!1 &6743115606770902033
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 267864263453947856}
+  - component: {fileID: 2307510794741238954}
+  - component: {fileID: 3300686981902882828}
+  - component: {fileID: 8142473410360207812}
+  m_Layer: 5
+  m_Name: BtnClear
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &267864263453947856
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6743115606770902033}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 2445024852286898070}
+  m_Father: {fileID: 3859395984171938655}
+  m_RootOrder: 14
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 169.86, y: 30}
+  m_Pivot: {x: 0, y: 1}
+--- !u!222 &2307510794741238954
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6743115606770902033}
+  m_CullTransparentMesh: 1
+--- !u!114 &3300686981902882828
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6743115606770902033}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &8142473410360207812
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6743115606770902033}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 3300686981902882828}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 4914227450854944308}
+        m_TargetAssemblyTypeName: InfraredDemo, Assembly-CSharp
+        m_MethodName: OnClickClearAll
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
 --- !u!1 &6791501363969481351
 GameObject:
   m_ObjectHideFlags: 0

+ 13 - 12
Assets/BowArrow/Scripts/Bluetooth/BluetoothAim.cs

@@ -90,9 +90,9 @@ public class BluetoothAim : MonoBehaviour
 #if UNITY_STANDALONE_WIN || UNITY_EDITOR
         // new GameObject("BleUDP").AddComponent<BleUDP>();
         firstBluetoothWindows = new BluetoothWindows();
-        firstBluetoothWindows.OnConnected = OnConnected_windows;
-        firstBluetoothWindows.OnConnectionFailed = OnConnectionFailed_windows;
-        firstBluetoothWindows.OnCharacteristicChanged = OnCharacteristicChanged_windows;
+        firstBluetoothWindows.OnConnected = OnConnected_windows1;
+        firstBluetoothWindows.OnConnectionFailed = OnConnectionFailed_windows1;
+        firstBluetoothWindows.OnCharacteristicChanged = OnCharacteristicChanged_windows1;
 
         //window蓝牙连接
         if (currentBLEPlayer == BluetoothPlayer.FIRST_PLAYER)
@@ -131,12 +131,13 @@ public class BluetoothAim : MonoBehaviour
             userDoConnect = false;
             doConnect = false;
             OnDisconnect();
-#if UNITY_STANDALONE_WIN || UNITY_EDITOR
-            //BleUDP.ins.Disconnect();
-            if (firstBluetoothWindows.Disconnect()) SetStatus(BluetoothStatusEnum.None);
-#else
             DisconnectBleHelper();
-#endif
+            //#if UNITY_STANDALONE_WIN || UNITY_EDITOR
+            //            //BleUDP.ins.Disconnect();
+            //            if (firstBluetoothWindows.Disconnect()) SetStatus(BluetoothStatusEnum.Connect);
+            //#else
+            //            DisconnectBleHelper();
+            //#endif
         }
     }
 
@@ -213,7 +214,7 @@ public class BluetoothAim : MonoBehaviour
         if (BluetoothWindows.IsWindows())
         {
             if (firstBluetoothWindows.Disconnect())
-                SetStatus(BluetoothStatusEnum.None);
+                SetStatus(BluetoothStatusEnum.Connect);
             return;
         }
 
@@ -1167,19 +1168,19 @@ public class BluetoothAim : MonoBehaviour
 
 
     #region 用户1 window ble 连接
-    void OnConnected_windows()
+    void OnConnected_windows1()
     {
         Log("[WinBle_1P]连接成功\n" + deviceName);
         SetStatus(BluetoothStatusEnum.ConnectSuccess);
         BowCamera.isTouchMode = false;
         InitWhenConenct();
     }
-    void OnConnectionFailed_windows()
+    void OnConnectionFailed_windows1()
     {
         Log("连接失败\n" + deviceName);
         OnDisconnect();
     }
-    void OnCharacteristicChanged_windows(byte[] value)
+    void OnCharacteristicChanged_windows1(string deviceId,byte[] value)
     {
         OnCharacteristicChanged(null, value, null);
     }

+ 1 - 1
Assets/BowArrow/Scripts/CommonConfig.cs

@@ -76,7 +76,7 @@ public class CommonConfig
                 else if (serverIndex == 1)
                     return "https://www.wonderfittervr.com/SmartBowBusinessServer";//"http://54.165.56.200/SmartBowBusinessServer";
             }
-            return "http://192.168.0.112:11432/SmartBowBusinessServer";
+            return "http://192.168.10.105:11432/SmartBowBusinessServer";
         }
     }
     //业务服务端WS访问地址

+ 1 - 0
Assets/InfraredProject/UVC4UnityAndroidPlugin/Scripts/UVCManager.cs

@@ -290,6 +290,7 @@ namespace Serenegiant.UVC
             {
                 currentWidth = width;
                 currentHeight = height;
+                Debug.Log("设置 SetSize:[" + width + "," + height + "]");
             }
 
             /**

+ 27 - 8
Assets/InfraredProject/WebCamera/Script/PcWebCamera.cs

@@ -9,9 +9,9 @@ using UnityEngine.UI;
 public class PcWebCamera : MonoBehaviour
 {
     public int cameraIndex = 0;
-    public int width = 1280;
-    public int height = 720;
-    public int fps = 60;
+    public int width = 320;
+    public int height = 240;
+    public int fps = 30;
     public string deviceName;
 
     private WebCamTexture _webCamTexture;
@@ -114,7 +114,7 @@ public class PcWebCamera : MonoBehaviour
             Debug.LogError("开启失败,请先关闭正在使用的摄像头!");
             return;
         }
-        //if (Application.HasUserAuthorization(UserAuthorization.WebCam))
+        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
         {
             WebCamDevice[] devices = WebCamTexture.devices;
             for (int i = 0; i < devices.Length; i++)
@@ -132,19 +132,38 @@ public class PcWebCamera : MonoBehaviour
                 return;
             }
             deviceName = devices[cameraIndex].name;
+
             _webCamTexture = new WebCamTexture(deviceName, width, height, fps);
             _webCamTexture.Play();
             // 创建一个 Texture2D 用于存储调整后的图像
             //adjustedTexture = new Texture2D(_webCamTexture.width, _webCamTexture.height);
             Debug.Log("成功开启摄像头 " + deviceName);
             ScreenLocate.Main.WebCamIsReady(_webCamTexture);
+
+           // StartCoroutine(getResolutions(devices[cameraIndex]));
+        }
+        else
+        {
+            Debug.LogError("开启失败,用户未授予摄像头权限!");
         }
-        //else
-        //{
-        //    Debug.LogError("开启失败,用户未授予摄像头权限!");
-        //}
     }
 
+    IEnumerator getResolutions(WebCamDevice  device) {
+        yield return new WaitForSeconds(1.0f);
+        // 打印支持的分辨率
+        Resolution[] resolutions = device.availableResolutions;
+        if (resolutions != null && resolutions.Length > 0)
+        {
+            foreach (Resolution res in resolutions)
+            {
+                Debug.Log("支持的分辨率: " + res.width + "x" + res.height);
+            }
+        }
+        else
+        {
+            Debug.Log("没有可用的分辨率信息。");
+        }
+    }
 
     public void newWebCamTexture(string name)
     {

BIN
Assets/Plugins/BleWinrtDll.dll


+ 99 - 0
Assets/SmartBow/SmartBowSDK/BleApi.cs

@@ -0,0 +1,99 @@
+using System.Runtime.InteropServices;
+
+public class BleApi
+{
+    // dll calls
+    public enum ScanStatus { PROCESSING, AVAILABLE, FINISHED };
+
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+    public struct DeviceUpdate
+    {
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
+        public string id;
+        [MarshalAs(UnmanagedType.I1)]
+        public bool isConnectable;
+        [MarshalAs(UnmanagedType.I1)]
+        public bool isConnectableUpdated;
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
+        public string name;
+        [MarshalAs(UnmanagedType.I1)]
+        public bool nameUpdated;
+    }
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "StartDeviceScan")]
+    public static extern void StartDeviceScan();
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "PollDevice")]
+    public static extern ScanStatus PollDevice(ref DeviceUpdate device, bool block);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "StopDeviceScan")]
+    public static extern void StopDeviceScan();
+
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+    public struct Service
+    {
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
+        public string uuid;
+    };
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "ScanServices", CharSet = CharSet.Unicode)]
+    public static extern void ScanServices(string deviceId);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "PollService")]
+    public static extern ScanStatus PollService(out Service service, bool block);
+
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+    public struct Characteristic
+    {
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
+        public string uuid;
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
+        public string userDescription;
+    };
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "ScanCharacteristics", CharSet = CharSet.Unicode)]
+    public static extern void ScanCharacteristics(string deviceId, string serviceId);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "PollCharacteristic")]
+    public static extern ScanStatus PollCharacteristic(out Characteristic characteristic, bool block);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "SubscribeCharacteristic", CharSet = CharSet.Unicode)]
+    public static extern bool SubscribeCharacteristic(string deviceId, string serviceId, string characteristicId, bool block);
+
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+    public struct BLEData
+    {
+        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
+        public byte[] buf;
+        [MarshalAs(UnmanagedType.I2)]
+        public short size;
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+        public string deviceId;
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+        public string serviceUuid;
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
+        public string characteristicUuid;
+    };
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "PollData")]
+    public static extern bool PollData(out BLEData data, bool block);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "SendData")]
+    public static extern bool SendData(in BLEData data, bool block);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "Quit")]
+    public static extern void Quit();
+
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+    public struct ErrorMessage
+    {
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
+        public string msg;
+    };
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "GetError")]
+    public static extern void GetError(out ErrorMessage buf);
+
+    [DllImport("BleWinrtDll.dll", EntryPoint = "Disconnect", CharSet = CharSet.Unicode)]
+    public static extern void Disconnect(string deviceId);
+}

+ 11 - 0
Assets/SmartBow/SmartBowSDK/BleApi.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3daf0d6d86b53a746b8207920d3c395f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 36 - 118
Assets/SmartBow/SmartBowSDK/BleWinHelper.cs

@@ -13,16 +13,16 @@ namespace SmartBowSDK
     /// </summary>
     public class BleWinHelper : MonoBehaviour
     {
-        private static string LogTag = "BleWinHelper-Log: ";
-        private static void Log(string text)
+        public string LogTag = "BleWinHelper-Log: ";
+        private  void Log(string text)
         {
             Debug.Log(LogTag + text);
         }
-        private static void Warn(string text)
+        private void Warn(string text)
         {
             Debug.LogWarning(LogTag + text);
         }
-        private static void Error(string text)
+        private  void Error(string text)
         {
             Debug.Log(LogTag + text);
         }
@@ -40,7 +40,7 @@ namespace SmartBowSDK
         private bool isSubscribing = false;
 
         private string lastError = null;
-
+        [SerializeField]
         private string selectedDeviceId = null;
 
         private Dictionary<string, Dictionary<string, string>> deviceList = new Dictionary<string, Dictionary<string, string>>();
@@ -51,12 +51,13 @@ namespace SmartBowSDK
         private float _receiveDataTime = 0;
         private float _heartBeatInterval = 0;
 
+
         private Action OnConnected;
         /// <summary>
         /// 主动调用Disconnect()不会触发该委托
         /// </summary>
         private Action OnConnectionFailed;
-        private Action<byte[]> OnCharacteristicChanged;
+        private static Action<string, byte[]> OnCharacteristicChanged;
 
         /// <summary>
         /// 注册window对象
@@ -75,17 +76,24 @@ namespace SmartBowSDK
        
             GameObject obj = new GameObject("BleWinHelper"+ logTip);
             obj.transform.SetParent(o.transform);
+         
+            BleWinHelper bleWinHelper = obj.AddComponent<BleWinHelper>();
             //日志名字
-            LogTag = "BleWinHelper-" + logTip + ": ";
-
-            BleWinHelper comp = obj.AddComponent<BleWinHelper>();
-            bluetoothWindows.Connect = comp.Connect;
-            bluetoothWindows.Disconnect = comp.Disconnect;
-            bluetoothWindows.Write = comp.Write;
-            comp.OnConnected = () => bluetoothWindows.OnConnected?.Invoke();
-            comp.OnConnectionFailed = () => bluetoothWindows.OnConnectionFailed?.Invoke();
-            comp.OnCharacteristicChanged = (bytes) => bluetoothWindows.OnCharacteristicChanged?.Invoke(bytes);
-            return comp;
+            bleWinHelper.LogTag = "BleWinHelper-" + logTip + ": ";
+            bluetoothWindows.Connect = bleWinHelper.Connect;
+            bluetoothWindows.Disconnect = bleWinHelper.Disconnect;
+            bluetoothWindows.Write = bleWinHelper.Write;
+            bleWinHelper.OnConnected = () => bluetoothWindows.OnConnected?.Invoke();
+            bleWinHelper.OnConnectionFailed = () => bluetoothWindows.OnConnectionFailed?.Invoke();
+            //多个定义共用一个OnCharacteristicChanged
+            OnCharacteristicChanged += (deviceID,bytes) => {
+                if (deviceID == bleWinHelper.selectedDeviceId) { 
+                
+                    bluetoothWindows.OnCharacteristicChanged?.Invoke(deviceID, bytes);
+                }
+            };
+
+            return bleWinHelper;
         }
 
         /// <summary>
@@ -201,7 +209,8 @@ namespace SmartBowSDK
                     byte[] bytes = new byte[res.size];
                     Array.Copy(res.buf, bytes, res.size);
                     _receiveDataTime = Time.realtimeSinceStartup;
-                    OnCharacteristicChanged?.Invoke(bytes);
+                    OnCharacteristicChanged?.Invoke(res.deviceId, bytes);
+
                 }
             }
             {
@@ -211,7 +220,8 @@ namespace SmartBowSDK
                 {
                     Error(res.msg);
                     lastError = res.msg;
-                    if (lastError.Contains("SendDataAsync") && isSubscribed)
+                    //对应设备才断开
+                    if (lastError.Contains("SendDataAsync") && lastError.Contains(selectedDeviceId) && isSubscribed)
                     {
                         HandleConnectFail();
                     }
@@ -222,11 +232,15 @@ namespace SmartBowSDK
         void LateUpdate()
         {
             if (
-                _heartBeatInterval > 0 && 
-                isSubscribed && 
+                _heartBeatInterval > 0 &&
+                isSubscribed &&
                 Time.realtimeSinceStartup - _connectedTime >= _heartBeatInterval &&
                 Time.realtimeSinceStartup - _receiveDataTime >= _heartBeatInterval
-            ) HandleConnectFail();
+            )
+            {
+                HandleConnectFail();
+            }
+              
         }
 
         private bool Connect()
@@ -382,101 +396,5 @@ namespace SmartBowSDK
             return true;
         }
     }
-    public class BleApi
-    {
-        // dll calls
-        public enum ScanStatus { PROCESSING, AVAILABLE, FINISHED };
-
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
-        public struct DeviceUpdate
-        {
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
-            public string id;
-            [MarshalAs(UnmanagedType.I1)]
-            public bool isConnectable;
-            [MarshalAs(UnmanagedType.I1)]
-            public bool isConnectableUpdated;
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
-            public string name;
-            [MarshalAs(UnmanagedType.I1)]
-            public bool nameUpdated;
-        }
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "StartDeviceScan")]
-        public static extern void StartDeviceScan();
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "PollDevice")]
-        public static extern ScanStatus PollDevice(ref DeviceUpdate device, bool block);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "StopDeviceScan")]
-        public static extern void StopDeviceScan();
-
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
-        public struct Service
-        {
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
-            public string uuid;
-        };
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "ScanServices", CharSet = CharSet.Unicode)]
-        public static extern void ScanServices(string deviceId);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "PollService")]
-        public static extern ScanStatus PollService(out Service service, bool block);
-
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
-        public struct Characteristic
-        {
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
-            public string uuid;
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
-            public string userDescription;
-        };
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "ScanCharacteristics", CharSet = CharSet.Unicode)]
-        public static extern void ScanCharacteristics(string deviceId, string serviceId);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "PollCharacteristic")]
-        public static extern ScanStatus PollCharacteristic(out Characteristic characteristic, bool block);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "SubscribeCharacteristic", CharSet = CharSet.Unicode)]
-        public static extern bool SubscribeCharacteristic(string deviceId, string serviceId, string characteristicId, bool block);
-
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
-        public struct BLEData
-        {
-            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
-            public byte[] buf;
-            [MarshalAs(UnmanagedType.I2)]
-            public short size;
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
-            public string deviceId;
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
-            public string serviceUuid;
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
-            public string characteristicUuid;
-        };
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "PollData")]
-        public static extern bool PollData(out BLEData data, bool block);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "SendData")]
-        public static extern bool SendData(in BLEData data, bool block);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "Quit")]
-        public static extern void Quit();
-
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
-        public struct ErrorMessage
-        {
-            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
-            public string msg;
-        };
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "GetError")]
-        public static extern void GetError(out ErrorMessage buf);
-
-        [DllImport("BleWinrtDll.dll", EntryPoint = "Disconnect", CharSet = CharSet.Unicode)]
-        public static extern void Disconnect(string deviceId);
-    }
+   
 }

BIN
Assets/SmartBow/SmartBowSDK/SmartBowSDK.dll