/// <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 + "-断开连接请求!"); } }
/// <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; } }