private static void Manager() { while (true) { Thread.Sleep(10000); //检查所有实时信息服务socket连接 foreach (RDSConfigModel rm in RDSClient.Values) { TcpCli tc = rm.TcpClient; try { if (tc.IsConnected) { tc.SendData(new byte[] { }); } else { LogHelper.WriteInfo("RDS服务(" + rm.RDSMark + "),连接中断准备重连!" + tc.IP + ":" + tc.Port); tc.Connect(); if (tc.IsConnected) { LogHelper.WriteInfo("RDS服务(" + rm.RDSMark + "),重连成功!" + tc.IP + ":" + tc.Port); } else { LogHelper.WriteInfo("RDS服务(" + rm.RDSMark + "),重连失败!" + tc.IP + ":" + tc.Port); } } } catch (Exception ex) { LogHelper.WriteError("RDS服务(" + rm.RDSMark + "),重连失败!" + tc.IP + ":" + tc.Port, ex); } } //处理超时未处理的 命令或命令执行结果 List <string> TimeoutOrderAndResult = new List <string>(); foreach (string key in OrderAndResultTime.Keys) { DateTime dt = (DateTime)OrderAndResultTime[key]; if (dt.AddMinutes(10) < DateTime.Now) { TimeoutOrderAndResult.Add(key); } } foreach (string key in TimeoutOrderAndResult) { OrderAndResultTime.Remove(key); } if (TimeoutOrderAndResult.Count > 0) { LogHelper.WriteInfo("清除超时的命令,或未处理的命令结果,总计:" + TimeoutOrderAndResult.Count); } } }
public static bool SendMsg(string sysflag, string token, long cid, QMDPartnerPackage package) { RDSConfigModel rcm = GetRDS(sysflag, cid); if (rcm == null) { return(false); } TcpCli tc = rcm.TcpClient; try { if (tc.IsConnected) { byte[] sfdata = Encoding.ASCII.GetBytes(sysflag); byte[] ciddata = System.BitConverter.GetBytes(cid); MemoryStream ms = new MemoryStream(); ProtoBuf.Serializer.Serialize(ms, package); byte[] bytes = new byte[ms.Length]; ms.Seek(0, SeekOrigin.Begin); ms.Read(bytes, 0, bytes.Length); ms.Close(); //将系统标示加入数据头部长度20字节,CID数据 8个字节 byte[] data = new byte[bytes.Length + 20 + 8]; Array.Copy(sfdata, data, sfdata.Length); Array.Copy(ciddata, 0, data, 20, 8); Array.Copy(bytes, 0, data, 28, bytes.Length); tc.SendData(data); if (package.dwPackageType == 30 && (package.dwOperation1 == 10 || package.dwOperation1 == 33 || package.dwOperation1 == 41 || package.dwOperation1 == 99)) //需要回传数据的记录指令,以便于应答 时确认发送者 { if (package.dwOperation1 == 41) //行驶记录仪参数查询特殊处理同时加入命令字做为指令细分 { MemoryStream msc = new MemoryStream(package.byteContext); CTS_DriveRecordDataCollectionRequest reqdata = ProtoBuf.Serializer.Deserialize <CTS_DriveRecordDataCollectionRequest>(msc); AddOrder(sysflag, token, cid, package.dwPackageType, package.dwOperation1, reqdata.nCMD.ToString()); } else if (package.dwOperation1 == 99)//透传指令 下发加入透传id作为细分指令 { MemoryStream msc = new MemoryStream(package.byteContext); CTS_TransmissionProtocol reqdata = ProtoBuf.Serializer.Deserialize <CTS_TransmissionProtocol>(msc); string extflag = reqdata.nTransID.ToString("X2"); if (reqdata.nTransID == 0x8F02)//解放消贷控制指令特殊处理,因为上行和下行nTransID不一致。此处填充上行id方便回指令结果 { int respnTransID = reqdata.nTransID == 0x8F02 ? 0x0f01 : reqdata.nTransID; extflag = respnTransID.ToString("X2") + reqdata.sData[0].ToString("X2") + reqdata.sData[1].ToString("X2"); AddOrder(sysflag, token, cid, package.dwPackageType, package.dwOperation1, extflag); } } else { AddOrder(sysflag, token, cid, package.dwPackageType, package.dwOperation1); } } return(true); } else { LogHelper.WriteInfo(sysflag + "RDS连接中断发送数据失败(" + string.Join(",", rcm.SysFlag) + ")"); if (ReConnect(tc)) { LogHelper.WriteInfo(sysflag + "RDS服务(" + rcm.RDSMark + ")重连成功发送数据!"); return(SendMsg(sysflag, token, cid, package)); } else { return(false); } } } catch (Exception ex) { LogHelper.WriteError(sysflag + "程序异常发送数据失败! ", ex); return(false); } }