예제 #1
0
 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);
         }
     }
 }
예제 #2
0
        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);
            }
        }