Beispiel #1
0
        /// <summary>
        /// 接受到数据并处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void onDataReceived(object sender, YTcpSrvEventArgs e)
        {
            if (!isRunning)
            {
                return;
            }

            var ip = e.State.TcpClientIP;

            //一分钟输出一次,某个ip正在活动
            Logger.Debug($"{ip} 正在活动", ConsoleColor.DarkGreen, 60000);
            if (e.State.BufferCount >= e.State.Buffer.Length)
            {
                e.State.BufferCount = 0;
            }
            var reBuffer = e.State.Buffer;
            var reCount  = e.State.BufferCount;

            //取得ip对应的缓存区
            if (!SmClientManager.IPSessionBuffer.ContainsKey(ip))
            {
                SmClientManager.IPSessionBuffer[ip] = SmClientManager.DefaultBuffer();
            }

            List <SmModel> smModels;

            //解析套接字数据
            using (var analysis = new SmAnalysis(SmClientManager.IPSessionBuffer[ip], Logger)) {
                smModels = analysis.ThroughAnalysisStack(reBuffer, 0, reCount);
                if (smModels?.Count == 0)
                {
                    Logger.Debug($"{ip} 包解析失败", ConsoleColor.Red);
                    return;
                }
                smModels?.ForEach(sm => {
                    //按协议应给客户端回复
                    if (sm.PackageType == SmPackageType.ParamPackage || sm.PackageType == SmPackageType.HeartbeatPackage)
                    {
                        var replayPkg = SmParamApi.BuildParamPackage((byte)(sm.Cmd + 0x80), null, 2, sm.ModuleAddr);
                        try {
                            tcpServer.Send(e.State.TcpClient, replayPkg);
                        } catch {
                            Logger.Error($"回复客户端:{ip} 异常");
                        }
                    }
                });
                //设置模块地址
                if (smModels?.Count > 0 && e.State.ModuleAddr == null)
                {
                    e.State.ModuleAddr = smModels[0].ModuleAddr;
                }
            }
            if (smModels?.Count > 0)
            {
                OnDataReceivedAction?.Invoke(ip, smModels);
            }
        }
Beispiel #2
0
 /// <summary>
 /// 客户端连接
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void onConnected(object sender, YTcpSrvEventArgs e)
 {
     if (!isRunning)
     {
         return;
     }
     //管理可报警ip客户端
     //以100结尾的ip都可以收命令
     if (e.State.TcpClientIP.EndsWith("100"))
     {
         ActionClientDict[e.State.TcpClientIP] = e.State;
     }
     SmClientManager.TpClientStates = ((YTcpServer)sender).Clicents;
     OnConnectedAction?.Invoke(e.State.TcpClientIP);
 }
Beispiel #3
0
 /// <summary>
 /// 客户端断连
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void onDisConnected(object sender, YTcpSrvEventArgs e)
 {
     if (!isRunning)
     {
         return;
     }
     using (ActionLock.Lock()) {
         try {
             if (ActionClientDict.ContainsKey(e.Msg))
             {
                 ActionClientDict.Remove(e.Msg);
             }
         } catch (Exception ex) {
             Logger.Error("移除命令客户端异常" + ex);
         }
     }
     OnDisConnectedAction?.Invoke(e.State.TcpClientIP);
 }