Exemplo n.º 1
0
        /// <summary>
        /// 网关通讯状态变化通知
        /// </summary>
        /// <param name="stateChangeArgs">通讯状态变化参数</param>
        public void CommunicationStateChangeNotify(CommunicationStateChangeArgs stateChangeArgs)
        {
            bool         flag = false;
            CacheNetWork curnet;
            int          curid = 0;

            if (stateChangeArgs.CommunicationState == CommunicationState.Connect)
            {
                //网络连接成功处理
                flag = true;
                NetworkDeviceInfo net = Cache.CacheManager.QueryFrist <NetworkDeviceInfo>(p => p.IP == stateChangeArgs.UniqueCode, true);
                if (net == null)
                {
                    net = new NetworkDeviceInfo();
                }
                net.NetID = (int)stateChangeArgs.ConntecionId;
                net.State = 3;
                net.IP    = stateChangeArgs.UniqueCode;
                lock (Cache.LockWorkNet)
                {
                    curnet = Cache.LstWorkNet.Find(delegate(CacheNetWork p) { return(p.IP == stateChangeArgs.UniqueCode); });
                    flag   = false;
                    if (curnet == null)
                    {
                        flag   = true;
                        curnet = new Driver.CacheNetWork();
                    }
                    curnet.DttBridgeReceiveTime = DateTime.Now;
                    curnet.State          = 3;
                    curnet.IP             = stateChangeArgs.UniqueCode;
                    curnet.NetID          = (int)stateChangeArgs.ConntecionId;
                    curnet.BBridgeRevMark = false;
                    if (flag)
                    {
                        Cache.LstWorkNet.Add(curnet);
                    }
                }
                SendNetStateToCenter(net);
                LogHelper.Info("收到" + curnet.IP + "-请求连接命令!");
            }
            else if (stateChangeArgs.CommunicationState == CommunicationState.Disconnect)
            {
                //网络断开处理
                NetworkDeviceInfo net = Cache.CacheManager.QueryFrist <NetworkDeviceInfo>(p => p.IP == stateChangeArgs.UniqueCode, true);
                if (net == null)
                {
                    net = new NetworkDeviceInfo();
                }
                curid = GetMacConnectionID(stateChangeArgs.UniqueCode);
                if (curid > 0)
                {
                    if (stateChangeArgs.ConntecionId < curid)
                    {
                        LogHelper.Info("断开连接不处理:ConnectIdOld=" + curid + ",ConnectIdNew=" + stateChangeArgs.ConntecionId);
                        return;
                    }
                }
                net.IP    = stateChangeArgs.UniqueCode;
                net.NetID = 0;
                net.State = (short)ItemState.EquipmentInterrupted;

                lock (Cache.LockWorkNet)//更新网络模块缓存
                {
                    curnet = Cache.LstWorkNet.Find(delegate(CacheNetWork p) { return(p.IP == stateChangeArgs.UniqueCode); });
                    if (curnet != null)
                    {
                        curnet.DttBridgeReceiveTime = DateTime.Now.AddSeconds(-(ReDoSetTime - 10));
                        curnet.State          = 0;
                        curnet.NetID          = 0;
                        curnet.BBridgeRevMark = false;
                    }
                }
                SendNetStateToCenter(net);
                LogHelper.Info("收到" + curnet.IP + "-断开连接请求!");
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 处理网络接收的数据(上行)
        /// </summary>
        /// <param name="data">收到的网络数据包</param>
        /// <param name="net">接收到此数据包的网络模块</param>
        public void HandleNetData(byte[] data, string ip)
        {
            CacheNetWork      curnet;
            bool              tcnet = false;
            NetworkDeviceInfo net   = Cache.CacheManager.QueryFrist <NetworkDeviceInfo>(p => p.IP == ip, true);

            //增加交换机处理
            if (net == null)
            {//再找一下交换机对应的串口服务器IP
                tcnet = true;
                net   = Cache.CacheManager.QueryFrist <NetworkDeviceInfo>(p => p.Bz6 == ip, true);
            }
            if (Cache.ShowYmOut == 1)           //有源码输出才进行相关的处理
            {
                Cache.AddCommData(data, ip, 1); //源码输出
            }
            if (net == null)
            {
                return;
            }
            KJ73NCommand command = KJ73NCommand.ToCommand(data, net);

            if (!command.IsSuccess)
            {
                lock (Cache.LockWorkNet)//用缓存的网络设备进行操作
                {
                    curnet = Cache.LstWorkNet.Find(delegate(CacheNetWork p) { return(p.IP == net.IP); });
                    if (curnet != null)
                    {
                        curnet.BBridgeRevMark = false;
                    }
                }
                LogHelper.Info(command.errorMessage);
                return;
            }
            SendNetStateToCenter(net); //发送网络模块的实时数据至中心站;
            lock (Cache.LockWorkNet)   //用缓存的网络设备进行操作
            {
                if (tcnet)
                {
                    curnet = Cache.LstWorkNet.Find(delegate(CacheNetWork p) { return(p.IP == net.Bz6); });
                }
                else
                {
                    curnet = Cache.LstWorkNet.Find(delegate(CacheNetWork p) { return(p.IP == net.IP); });
                }
                if (curnet != null)
                {
                    curnet.BBridgeRevMark       = true;         //表示数据包接收正常
                    curnet.DttBridgeReceiveTime = DateTime.Now; //用于存储最新接收到数据时的时间
                }
                else
                {//是不正常情况,输出日志,但是在此,也先行进行处理。
                    LogHelper.Error("错误日志:" + net.MAC + "  当数据包上行时,未找到未相应的缓存网络模块链表!!");
                    curnet       = new Driver.CacheNetWork();
                    curnet.State = 3;
                    curnet.MAC   = net.MAC;
                    curnet.IP    = net.IP;
                    curnet.NetID = 0;
                    curnet.DttBridgeReceiveTime = DateTime.Now;//用于存储最新接收到数据时的时间
                    curnet.BBridgeRevMark       = false;
                    Cache.LstWorkNet.Add(curnet);
                }
            }
            switch (command.PackageType)
            {
            case 1:    //上行的数据包
                SendDevicDataAffirmToCenter(net, data);
                LogHelper.Info("收到数据包:" + net.IP + "-" + net.MAC + "  长度:" + data.Length);
                break;

            case 2:    //交换机信息
                SendSwicthBaseInfo(net, data);
                break;
            }
        }