From dbc23459fdf4e8b74a5f955fbb9fc631b4babc70 Mon Sep 17 00:00:00 2001
From: 陈嘉乐 <cjl@hdlchina.com.cn>
Date: 星期三, 17 三月 2021 11:56:16 +0800
Subject: [PATCH] Merge branch 'temp-wxr' into WJC

---
 HDL_ON/UI/UI0-Stan/Logic/HdlBluetoothIOSLogic.cs |  489 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 489 insertions(+), 0 deletions(-)

diff --git a/HDL_ON/UI/UI0-Stan/Logic/HdlBluetoothIOSLogic.cs b/HDL_ON/UI/UI0-Stan/Logic/HdlBluetoothIOSLogic.cs
new file mode 100644
index 0000000..8900504
--- /dev/null
+++ b/HDL_ON/UI/UI0-Stan/Logic/HdlBluetoothIOSLogic.cs
@@ -0,0 +1,489 @@
+锘縰sing System;
+using System.Collections.Generic;
+
+namespace HDL_ON.Stan
+{
+#if __IOS__
+    /// <summary>
+    /// IOS钃濈墮鐨勯�昏緫
+    /// </summary>
+    public class HdlBluetoothLogic
+    {
+        #region 鈻� 鍙橀噺澹版槑___________________________
+
+        /// <summary>
+        /// 瀹夊崜钃濈墮鐨勯�昏緫
+        /// </summary>
+        private static HdlBluetoothLogic m_Current = null;
+        /// <summary>
+        /// 瀹夊崜钃濈墮鐨勯�昏緫
+        /// </summary>
+        public static HdlBluetoothLogic Current
+        {
+            get
+            {
+                if (m_Current == null)
+                {
+                    m_Current = new HdlBluetoothLogic();
+                }
+                return m_Current;
+            }
+        }
+        /// <summary>
+        /// 鎴戜篃涓嶇煡閬撹繖鏄粈涔堜笢瑗�
+        /// </summary>
+        private HdlBlufi.HdlBluWi hdlBluWiShare;
+        /// <summary>
+        /// 鎴戜篃涓嶇煡閬撹繖鏄粈涔堜笢瑗�
+        /// </summary>
+        private HdlBlufi.BlufiClient blufiClient;
+        /// <summary>
+        /// 鎺ユ敹浜嬩欢
+        /// </summary>
+        private Action<string> ReceiveEvent = null;
+        /// <summary>
+        /// 鍙戦�佺姸鎬�(0:鍙戦�佸け璐� 1:鍙戦�佹垚鍔�)
+        /// </summary>
+        private int sendStatuValue = -1;
+        /// <summary>
+        /// 钃濈墮鏄惁鎵撳紑
+        /// </summary>
+        private bool IsBlufiOpen = false;
+
+        #endregion
+
+        #region 鈻� 鍒濆鍖朹__________________________
+
+        /// <summary>
+        /// 鍒濆鍖�
+        /// </summary>
+        private bool InitHdlBlufi()
+        {
+            if (hdlBluWiShare != null) { return true; }
+
+            try
+            {
+                this.hdlBluWiShare = HdlBlufi.HdlBluWi.Share();
+                this.blufiClient = new HdlBlufi.BlufiClient();
+
+                blufiClient.CentralManagerDelete = new BlueCBCentralManagerDelegate();
+                //娣诲姞鍥炶皟浜嬩欢
+                ((BlueCBCentralManagerDelegate)blufiClient.CentralManagerDelete).StateEvent += (div, data) =>
+                {
+                    //-1:寮傚父 1:姝e父
+                    if (div == StatuEnum.A寮傚父)
+                    {
+                        //钃濈墮娌℃湁鎵撳紑
+                        this.IsBlufiOpen = false;
+                    }
+                    else if (div == StatuEnum.A姝e父)
+                    {
+                        //钃濈墮鎵撳紑鐫�
+                        this.IsBlufiOpen = true;
+                    }
+                };
+
+                blufiClient.BlufiDelegate = new BlueWifiDelegate();
+                return true;
+            }
+            catch { return false; }
+        }
+
+        #endregion
+
+        #region 鈻� 钃濈墮鎵�闇�鍔熻兘妫�娴媉__________________
+
+        /// <summary>
+        /// 妫�娴嬫槸鍚﹁兘澶熸悳绱㈣摑鐗�(鍐呴儴浼氬脊鍑篗sg妗�,鍥犱负鍐呴儴闇�瑕佹娴嬬郴缁熸潈闄�,鎵�浠ュ弬鏁伴噰鐢ㄥ洖璋冪殑鏂瑰紡)
+        /// </summary>
+        /// <param name="resultEvent">妫�娴嬬粨鏋滀簨浠�</param>
+        public void CheckCanScanBluetooth(Action<bool> resultEvent)
+        {
+            try聽
+            {
+                //鍏堝垵濮嬪寲
+                if (this.InitHdlBlufi() == false)
+                {
+                    resultEvent?.Invoke(false);
+                    //璇锋墦寮�钃濈墮
+                    HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Shared.Language.StringByID(StringId.PleaseTurnOnBluetooth));
+                    return;
+                }
+                   
+                if (this.IsBlufiOpen == true)
+                {
+                    //鍥犱负鏄竴鐩寸洃鍚潃锛屾墍浠ュ鏋滄槸true锛岀洿鎺ヨ繑鍥�
+                    resultEvent?.Invoke(this.IsBlufiOpen);
+                    return;
+                }
+
+                HdlThreadLogic.Current.RunThread(() =>
+                {
+                    //ios闇�瑕佺洃鍚墠鑳藉鑾峰緱钃濈墮鐨勭姸鎬�
+                    System.Threading.Thread.Sleep(500);
+                    if (this.IsBlufiOpen == false)
+                    {
+                        //璇锋墦寮�钃濈墮
+                        HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Shared.Language.StringByID(StringId.PleaseTurnOnBluetooth));
+                    }
+                    HdlThreadLogic.Current.RunMain(() =>
+                    {
+                        resultEvent?.Invoke(this.IsBlufiOpen);
+                    });
+                }, ShowErrorMode.NO);
+            }
+            catch
+            {
+                resultEvent?.Invoke(false);
+                //璇锋墦寮�钃濈墮
+                HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, Shared.Language.StringByID(StringId.PleaseTurnOnBluetooth));
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 钃濈墮鎵弿___________________________
+
+        /// <summary>
+        /// 鎼滅储钃濈墮
+        /// </summary>
+        /// <param name="waitTime">鎼滅储鏃堕棿(绉�)</param>
+        /// <param name="FinishEvent">鎼滅储缁撴潫鐨勪簨浠�</param>
+        public void ScanBluetooth(int waitTime, Action<List<BluetoothInfo>> FinishEvent)
+        {
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                //鍐嶆妫�娴嬫槸鍚﹁兘澶熸悳绱㈣摑鐗�
+                this.CheckCanScanBluetooth((result) =>
+                {
+                    if (result == true)
+                    {
+                        HdlThreadLogic.Current.RunThread(() =>
+                        {
+                            //寮�濮嬫悳绱㈣摑鐗�
+                            this.DoScanBluetooth(waitTime, FinishEvent);
+                        });
+                    }
+                });
+            });
+        }
+
+        /// <summary>
+        /// 寮�濮嬫悳绱㈣摑鐗�
+        /// </summary>
+        /// <param name="waitTime">鎼滅储鏃堕棿(绉�)</param>
+        /// <param name="FinishEvent">鎼滅储缁撴潫鐨勪簨浠�</param>
+        private void DoScanBluetooth(int waitTime, Action<List<BluetoothInfo>> FinishEvent)
+        {
+            //钃濈墮鍒楄〃
+            var listData = new List<BluetoothInfo>();
+            //閲嶅妫�娴�
+            var listCheck = new List<string>();
+            //瀹炵幇钃濈墮鎺ユ敹浜嬩欢
+            var ReceiveBlufiDeviceEvent = new HdlBlufi.FBYBleDeviceBackBlock((arg0) =>
+            {
+                var address = arg0.Uuid.ToString();
+                if (listCheck.Contains(address) == false)
+                {
+                    listCheck.Add(address);
+                    var data = new BluetoothInfo();
+                    data.Address = address;
+                    data.Name = arg0.Name == null ? string.Empty : arg0.Name;
+                    listData.Add(data);
+                }
+            });
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                //寮�鍚摑鐗欐悳绱�
+                this.hdlBluWiShare.StartScan(ReceiveBlufiDeviceEvent);
+            }, ShowErrorMode.NO);
+            System.Threading.Thread.Sleep(waitTime * 1000);
+
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                //鍏抽棴钃濈墮鎼滅储
+                this.hdlBluWiShare.StopScan();
+                ReceiveBlufiDeviceEvent = null;
+
+            }, ShowErrorMode.NO);
+            //鍥炶皟浜嬩欢
+            FinishEvent?.Invoke(listData);
+        }
+
+        #endregion
+
+        #region 鈻� 钃濈墮閾炬帴___________________________
+
+        /// <summary>
+        /// 钃濈墮閾炬帴(false:杩炴帴澶辫触 true:杩炴帴鎴愬姛)
+        /// </summary>
+        /// <param name="bluetooth">闇�瑕侀摼鎺ョ殑钃濈墮瀵硅薄</param>
+        /// <param name="connectEvent">鍥犱负闇�瑕佸鏂瑰弽棣�,鎵�浠ヤ娇鐢ㄥ洖璋�(閾炬帴缁撴灉 false:杩炴帴澶辫触 true:杩炴帴鎴愬姛)</param>
+        public void ContectBluetooth(BluetoothInfo bluetooth, Action<bool> connectEvent)
+        {
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                try
+                {
+                    //娣诲姞浜嬩欢
+                    ((BlueWifiDelegate)blufiClient.BlufiDelegate).StateEvent += (div, data) =>
+                    {
+                        //-1:寮傚父 1:姝e父 2:鍙戦�佹暟鎹垚鍔� 3:鍙戦�佹暟鎹け璐�
+                        if (div == StatuEnum.A寮傚父)
+                        {
+                            //鍏抽棴閾炬帴
+                            this.DisContectBluetooth();
+                            connectEvent?.Invoke(false);
+                            //鍙�氱煡涓�娆�
+                            connectEvent = null;
+                        }
+                        else if (div == StatuEnum.A姝e父)
+                        {
+                            //閾炬帴寤虹珛鎴愬姛
+                            connectEvent?.Invoke(true);
+                            //鍙�氱煡涓�娆�
+                            connectEvent = null;
+                        }
+                        else if (div == StatuEnum.A鍙戦�佹垚鍔� || div == StatuEnum.A鍙戦�佸け璐�)
+                        {
+                            sendStatuValue = div == StatuEnum.A鍙戦�佹垚鍔� ? 1 : 0;
+                        }
+                        else if (div == StatuEnum.A钃濈墮鍙嶉)
+                        {
+                            //钃濈墮杩斿洖鐨勭粨鏋�
+                            this.ReceiveEvent?.Invoke(data);
+                        }
+                    };
+                    //鎵ц閾炬帴
+                    this.blufiClient.Connect(bluetooth.Address);
+                }
+                catch
+                {
+                    connectEvent?.Invoke(false);
+                    connectEvent = null;
+                }
+            });
+        }
+
+        #endregion
+
+        #region 鈻� 钃濈墮鍏抽棴___________________________
+
+        /// <summary>
+        ///  鍏抽棴钃濈墮閾炬帴
+        /// </summary>
+        public void DisContectBluetooth()
+        {
+            HdlThreadLogic.Current.RunMain(() =>
+            {
+                this.blufiClient?.Close();
+                this.blufiClient = null;
+                this.hdlBluWiShare = null;
+
+            }, ShowErrorMode.NO);
+        }
+
+        /// <summary>
+        /// 鎽ф瘉
+        /// </summary>
+        public void Dispone()
+        {
+            //鍏抽棴钃濈墮閾炬帴
+            this.DisContectBluetooth();
+            this.ReceiveEvent = null;
+            m_Current = null;
+        }
+
+        #endregion
+
+        #region 鈻� 鍙戦�佹暟鎹甠__________________________
+
+        /// <summary>
+        /// 鍙戦�佹暟鎹粰钃濈墮
+        /// </summary>
+        /// <param name="i_data">鍙戦�佺殑鏁版嵁</param>
+        /// <param name="waiTime">绛夊緟鏃堕棿(绉�),濡傛灉璁剧疆涓�0,鍒欏彧瑕佸彂閫佷笉鍑虹幇寮傚父,鐩存帴鍒ゅ畾涓烘垚鍔�</param>
+        public bool SendData(string i_data, int waiTime = 0)
+        {
+            if (this.blufiClient == null)
+            {
+                return false;
+            }
+
+            try
+            {
+                this.sendStatuValue = -1;
+                HdlThreadLogic.Current.RunMain(() =>
+                {
+                    //鍙戦�佹暟鎹�
+                    var data = new Foundation.NSData();
+                    data = i_data;
+                    blufiClient.PostCustomData(data);
+
+                }, ShowErrorMode.NO);
+
+                if (waiTime == 0) { return true; }
+
+                waiTime *= 5;
+                while (this.sendStatuValue == -1 && waiTime > 0)
+                {
+                    System.Threading.Thread.Sleep(200);
+                    waiTime--;
+                }
+                return this.sendStatuValue == 1;
+            }
+            catch { return false; }
+        }
+
+        #endregion
+
+        #region 鈻� 涓�鑸柟娉昣__________________________
+
+        /// <summary>
+        /// 娣诲姞钃濈墮鐨勬帴鏀朵簨浠�
+        /// </summary>
+        /// <param name="i_ReceiveEvent">钃濈墮鎺ユ敹浜嬩欢</param>
+        public void AddReceiveEvent(Action<string> i_ReceiveEvent)
+        {
+            this.ReceiveEvent = i_ReceiveEvent;
+        }
+
+        /// <summary>
+        /// 绉婚櫎钃濈墮鐨勬帴鏀朵簨浠�
+        /// </summary>
+        public void RemoveReceiveEvent()
+        {
+            this.ReceiveEvent = null;
+        }
+
+        #endregion
+
+        #region 鈻� 绯荤粺钃濈墮鍥炶皟_______________________
+
+        private class BlueWifiDelegate : HdlBlufi.BlufiDelegate
+        {
+            /// <summary>
+            /// 鐘舵�佷簨浠跺洖璋� 褰撶涓�涓弬鏁颁负"A钃濈墮鍙嶉"鏃�,绗簩涓弬鏁颁负钃濈墮杩斿洖鐨勪俊鎭�
+            /// </summary>
+            public Action<StatuEnum, string> StateEvent = null;
+
+            public override void Blufi_didNegotiateSecurity(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusCode status)
+            {
+                //Console.WriteLine("Blufi_didNegotiateSecurity");
+            }
+
+            public override void Blufi_didPostCustomData(HdlBlufi.BlufiClient client, Foundation.NSData data, HdlBlufi.BlufiStatusCode status)
+            {
+                if (status == HdlBlufi.BlufiStatusCode.Success)
+                {
+                    //鍙戦�佽摑鐗欐暟鎹垚鍔�
+                    StateEvent?.Invoke(StatuEnum.A鍙戦�佹垚鍔�, null);
+                }
+                else
+                {
+                    //鍙戦�佽摑鐗欐暟鎹け璐�
+                    StateEvent?.Invoke(StatuEnum.A鍙戦�佸け璐�, null);
+                }
+            }
+
+            public override void Blufi_didReceiveDeviceScanResponse(HdlBlufi.BlufiClient client, HdlBlufi.BlufiScanResponse[] scanResults, HdlBlufi.BlufiStatusCode status)
+            {
+                //Console.WriteLine("Blufi_didReceiveDeviceScanResponse");
+            }
+
+            public override void Blufi_didReceiveDeviceVersionResponse(HdlBlufi.BlufiClient client, HdlBlufi.BlufiVersionResponse response, HdlBlufi.BlufiStatusCode status)
+            {
+                //Console.WriteLine("Blufi_didReceiveDeviceVersionResponse");
+            }
+
+            public override void Blufi_didPostConfigureParams(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusCode status)
+            {
+                //Console.WriteLine("Blufi_didPostConfigureParams");
+            }
+
+            public override void Blufi_didReceiveCustomData(HdlBlufi.BlufiClient client, Foundation.NSData data, HdlBlufi.BlufiStatusCode status)
+            {
+                //鎺ユ敹钃濈墮鍙戦�佽繃鏉ョ殑鏁版嵁
+                StateEvent?.Invoke(StatuEnum.A钃濈墮鍙嶉, data.ToString());
+            }
+
+            public override void Blufi_didReceiveDeviceStatusResponse(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusResponse response, HdlBlufi.BlufiStatusCode status)
+            {
+                //Console.WriteLine("Blufi_didReceiveDeviceStatusResponse");
+            }
+
+            public override void Blufi_didReceiveError(HdlBlufi.BlufiClient client, nint errCode)
+            {
+                //Console.WriteLine("Blufi_didReceiveError");
+            }
+
+            public override void Blufi_gattPrepared(HdlBlufi.BlufiClient client, HdlBlufi.BlufiStatusCode status, CoreBluetooth.CBService service, CoreBluetooth.CBCharacteristic writeChar, CoreBluetooth.CBCharacteristic notifyChar)
+            {
+                if (status == HdlBlufi.BlufiStatusCode.Success)
+                {
+                    //钃濈墮杩炴帴鎴愬姛
+                    StateEvent?.Invoke(StatuEnum.A姝e父, null);
+                }
+                else
+                {
+                    //钃濈墮杩炴帴澶辫触
+                    StateEvent?.Invoke(StatuEnum.A寮傚父, null);
+                }
+            }
+        }
+
+        private class BlueCBCentralManagerDelegate : CoreBluetooth.CBCentralManagerDelegate
+        {
+            /// <summary>
+            /// 鐘舵�佷簨浠跺洖璋�
+            /// </summary>
+            public Action<StatuEnum, string> StateEvent = null;
+
+            public override void UpdatedState(CoreBluetooth.CBCentralManager central)
+            {
+                //鍙娌℃湁鎵撳紑钃濈墮锛岄兘绠楀紓甯稿鐞�
+                if (central.State == CoreBluetooth.CBCentralManagerState.PoweredOn)
+                {
+                    StateEvent?.Invoke(StatuEnum.A姝e父, null);
+                }
+                else
+                {
+                    StateEvent?.Invoke(StatuEnum.A寮傚父, null);
+                }
+            }
+        }
+        #endregion
+
+        #region 鈻� 缁撴瀯浣揰____________________________
+
+        /// <summary>
+        /// 钃濈墮杩斿洖鐨勪俊鎭�
+        /// </summary>
+        public class BluetoothInfo
+        {
+            /// <summary>
+            /// 鍚嶅瓧(姝ゅ悕瀛椾笉浼歯ull,濡傛灉瀹冩湰韬槸null,鍙細鏄痵tring.empty)
+            /// </summary>
+            public string Name = string.Empty;
+            /// <summary>
+            /// 鍦板潃
+            /// </summary>
+            public string Address = string.Empty;
+        }
+
+        /// <summary>
+        /// 鐘舵�佹灇涓�
+        /// </summary>
+        private enum StatuEnum
+        {
+            A寮傚父 = -1,
+            A姝e父 = 1,
+            A鍙戦�佹垚鍔� = 2,
+            A鍙戦�佸け璐� = 3,
+            A钃濈墮鍙嶉 = 4
+        }
+
+        #endregion
+    }
+#endif
+}

--
Gitblit v1.8.0