From d6578b10542226650e263815dea75e598a7090f9 Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期三, 17 八月 2022 13:22:02 +0800
Subject: [PATCH] tcp状态更新,iOS扫描

---
 HDL_ON/DAL/DriverLayer/Control_TcpClient.cs |  178 ++++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 126 insertions(+), 52 deletions(-)

diff --git a/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs b/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
index aa8aeff..d6f61f1 100644
--- a/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
+++ b/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
@@ -1,7 +1,11 @@
 锘縰sing System;
+using System.Collections.Generic;
 using System.Net;
 using System.Net.Sockets;
+using System.Threading;
 using System.Threading.Tasks;
+using HDL_ON.Entity;
+using Newtonsoft.Json;
 
 namespace HDL_ON.DriverLayer
 {
@@ -18,6 +22,16 @@
         public Action<string> ReceiveEvent;
 
         /// <summary>
+        /// 杩炴帴娆℃暟
+        /// </summary>
+        private int reconnectIndex = 0;
+        /// <summary>
+        /// 鏄惁杩炴帴鎴愬姛
+        /// </summary>
+        public bool isConnected = false;
+
+
+        /// <summary>
         /// 鏋勯�犲嚱鏁�
         /// </summary>
         public Control_TcpClient(string serverIp)
@@ -26,18 +40,22 @@
         }
 
         //TCP杩炴帴
-        public bool Connect(int _port = 8586)
+        private bool ConnectToTcp( )
         {
-            if (string.IsNullOrEmpty(_ip) || _port == 0)
+            if (string.IsNullOrEmpty(_ip) )
             {
                 return false;
             }
-            _tcpClient = new TcpClient();
+            if (_tcpClient == null)
+            {
+                _tcpClient = new TcpClient();
+            }
             try
             {
-                _tcpClient.Connect(IPAddress.Parse(_ip), _port);
+                _tcpClient.Connect(IPAddress.Parse(_ip), 8586);
                 Task.Run(new Action(ReceiveMessage));//寮�鍚嚎绋嬶紝涓嶅仠鎺ユ敹娑堟伅
-                MainPage.Log($"鎵撳紑tcp client{_ip}:{_port}");
+                MainPage.Log($"鎵撳紑tcp client{_ip}:8586");
+                isConnected = true;
             }
             catch (Exception e)
             {
@@ -46,6 +64,53 @@
             }
             return true;//杩斿洖杩炴帴鐘舵��
         }
+        /// <summary>
+        /// 杩炴帴tcp绾跨▼
+        /// </summary>
+        private Thread connectThread;
+
+        /// <summary>
+        /// 杩炴帴绾跨▼
+        /// </summary>
+        public void Connect()
+        {
+            if(connectThread == null)
+            {
+                connectThread = new Thread(() => {
+                    while (Control.Ins.GatewayOnline_Local)
+                    {
+                        if (_tcpClient == null)
+                        {
+                            ConnectToTcp();
+                        }
+                        else
+                        {
+                            if (!_tcpClient.Connected)
+                            {
+                                try
+                                {
+                                    //_tcpClient.ReceiveTimeout = 
+                                    _tcpClient.Connect(IPAddress.Parse(_ip), 8586);
+                                    Task.Run(new Action(ReceiveMessage));//寮�鍚嚎绋嬶紝涓嶅仠鎺ユ敹娑堟伅
+                                }
+                                catch (Exception ex)
+                                {
+                                    MainPage.Log($"tcp閲嶈繛寮傚父:{ex.Message}");
+                                    _tcpClient.Close();
+                                    _tcpClient = null;
+                                }
+                            }
+                        }
+                        Thread.Sleep(1000);
+
+
+                    }
+                });
+                connectThread.Start();
+            }
+        }
+
+
         /// <summary>
         /// 鍏抽棴杩炴帴
         /// </summary>
@@ -65,67 +130,76 @@
         /// <param name="bytes">闇�瑕佸彂閫佺殑瀛楄妭</param>
         public void SendMessage(byte[] bytes)
         {
-            NetworkStream networkStream = _tcpClient.GetStream();
-            if (networkStream.CanWrite)
+            if (_tcpClient.GetStream().CanWrite)
             {
-                networkStream.Write(bytes, 0, bytes.Length);
+                _tcpClient.GetStream().Write(bytes, 0, bytes.Length);
             }
-            //networkStream.Close();
         }
-
         /// <summary>
-        /// 鑾峰彇鍒楄〃鏁版嵁鍥炶皟鏂规硶
+        /// 蹇冭烦鍖呯嚎绋�
         /// </summary>
-        public Action<string> GetListResponseAction;
+        private Thread heartBeatThread;
+        private DateTime heartBeatTime;
+        public void HeartBeat()
+        {
+            if(heartBeatThread == null)
+            {
+                heartBeatThread = new Thread(() => {
+                    if(_tcpClient.Connected&&10 *1000 <(System.DateTime.Now - heartBeatTime).TotalMilliseconds)
+                    {
+                        var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.ct.HeartBeat, "");
+                        SendMessage(sendBytes);
+                    }
+                    Thread.Sleep(100);
+                });
+                heartBeatThread.Start();
+            }
+        }
+        /// <summary>
+        /// 鎺ユ敹鏁版嵁绾跨▼
+        /// </summary>
+        private Thread receiveThread;
+
         //鎺ユ敹娑堟伅
         public void ReceiveMessage()
         {
-            NetworkStream networkStream = _tcpClient.GetStream();
-            while (true)
+            if(receiveThread == null)
             {
-                // 瀹氫箟涓�涓�2M鐨勭紦瀛樺尯锛�
-                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
-                int size = networkStream.Read(arrMsgRec, 0, arrMsgRec.Length);
-                var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length);
-                if (!string.IsNullOrEmpty(tcpDataString))
-                {
-                    ReceiveEvent?.Invoke(tcpDataString);
-                }
+                receiveThread = new Thread(() => {
+                    while (true)
+                    {
+                        if(_tcpClient == null)
+                        {
+                            receiveThread.Abort();
+                            receiveThread = null;
+                            return;
+                        }
+                        if (!_tcpClient.Connected)
+                        {
+                            MainPage.Log("tcp瀹㈡埛绔柇寮�浜嗚繛鎺�...");
+                            receiveThread.Abort();
+                            receiveThread = null;
+                            isConnected = false;
+                            return;
+                        }
 
-                //// 灏嗘帴鍙楀埌鐨勬暟鎹瓨鍏ュ埌杈撳叆  arrMsgRec涓紱
-                //int length = -1;
-                //try
-                //{
-                //    length = socketClient.Receive(arrMsgRec); // 鎺ユ敹鏁版嵁锛屽苟杩斿洖鏁版嵁鐨勯暱搴︼紱
-                //}
-                //catch (Exception ex)
-                //{
-                //    MainPage.Log($"tcpListener  error 1 :  {ex.Message}");
+                        // 瀹氫箟涓�涓�2M鐨勭紦瀛樺尯锛�
+                        byte[] arrMsgRec = new byte[1024 * 1024 * 2];
+                        int size = _tcpClient.GetStream().Read(arrMsgRec, 0, arrMsgRec.Length);
+                        var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length);
 
-                //    Flag_Receive = false;
-                //    // 浠庨�氫俊绾跨▼闆嗗悎涓垹闄よ涓柇杩炴帴鐨勯�氫俊绾跨▼瀵硅薄锛�
-                //    string keystr = socketClient.RemoteEndPoint.ToString();
-                //    dic_ClientSocket.Remove(keystr);//鍒犻櫎瀹㈡埛绔瓧鍏镐腑璇ocket
-                //    dic_ClientThread[keystr].Abort();//鍏抽棴绾跨▼
-                //    dic_ClientThread.Remove(keystr);//鍒犻櫎瀛楀吀涓绾跨▼
 
-                //    tcpClient = null;
-                //    socketClient = null;
-                //    break;
-                //}
-                //byte[] buf = new byte[length];
-                //Array.Copy(arrMsgRec, buf, length);
-                //lock (tcpClient.m_Buffer)
-                //{
-                //    var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length);
-                //    if (!string.IsNullOrEmpty(tcpDataString))
-                //    {
-                //        ReceiveEvent?.Invoke(tcpDataString);
-                //    }
+                        if (!string.IsNullOrEmpty(tcpDataString))
+                        {
+                            MainPage.Log($"灞�鍩熺綉tcp鏁版嵁鎺ユ敹");
+                            Control.Ins.ConvertReceiveData(arrMsgRec, null);
 
-                //    MainPage.Log($"鎺ユ敹鏈嶅姟绔暟鎹�:{tcpDataString}");
-                //}
+                        }
+                    }
 
+                });
+                //receiveThread.IsBackground = true;
+                receiveThread.Start();
             }
         }
 

--
Gitblit v1.8.0