/// <summary> ///终端参数设置指令(启明自定义扩展参数) /// </summary> /// <param name="sysflag"></param> /// <param name="token"></param> /// <param name="cid"></param> /// <param name="tno"></param> /// <param name="paramlist"></param> /// <returns></returns> public static bool Send_CTS_SetTermParamDownQMExtend(string sysflag, string token, long cid, long tno, List <CTS_SetTermParamDown.TerminalParamItem> paramlist) { foreach (var sa in paramlist) { List <CTS_SetTermParamDown.TerminalParamItem> paramlist_one = new List <CTS_SetTermParamDown.TerminalParamItem>(); paramlist_one.Add(sa); QMDPartnerPackage package = RequestPackage.getSetTermParamDown(tno, paramlist_one, 85); bool sd = RDSConfig.SendMsg(sysflag, token, cid, package); if (!sd) { return(false); } } return(true); }
/// <summary> /// 数据包晚自习检查 /// </summary> /// <param name="data"></param> /// <param name="rMsg"></param> /// <returns></returns> private static Boolean checkPackage(byte[] data, ref QMDPartnerPackage rMsg) { Boolean isFlag = false; try { //处理返回的数据包 MemoryStream ms = new MemoryStream(data); rMsg = ProtoBuf.Serializer.Deserialize <QMDPartnerPackage>(ms); isFlag = true; } catch (Exception ex) { isFlag = false; } return(isFlag); }
/// <summary> /// 下发透传指令 /// </summary> /// <param name="sysflag"></param> /// <param name="token"></param> /// <param name="cid"></param> /// <param name="tno"></param> /// <param name="TransId">透传ID</param> /// <param name="TransmissionData">透传数据</param> /// <returns></returns> public static bool Send_CTS_TransmissionProtocol(string sysflag, string token, long cid, long tno, int TransId, byte[] TransmissionData) { QMDPartnerPackage package = RequestPackage.getCTS_TransmissionProtocol(tno, TransId, TransmissionData); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
/// <summary> /// 下发车辆点名指令 /// </summary> /// <param name="sysflag"></param> /// <param name="token"></param> /// <param name="cid"></param> /// <param name="tno"></param> /// <returns></returns> public static bool Send_CTS_TermSearchRequest(string sysflag, string token, long cid, long tno) { QMDPartnerPackage package = RequestPackage.getTermSearchRequest(tno); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
public static bool Send_DriveRecordDownCMDDown_VIN_NUM_TYPE(string sysflag, string token, long cid, long tno, string vin, string platenum, string plateType) { QMDPartnerPackage package = RequestPackage.getDriveRecordDownCMDDown_VIN_NUM_TYPE(tno, vin, platenum, plateType); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
public static bool Send_DriveRecordDownCMDDown_CharacterQuotient(string sysflag, string token, long cid, long tno, uint quotient) { QMDPartnerPackage package = RequestPackage.getDriveRecordDownCMDDown_CharacterQuotient(tno, quotient); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
/// <summary> /// 下发行驶记录数据采集命令 /// 命令字0x00 采集记录仪执行标准版本 /// 命令字0x01 采集当前驾驶人信息(机动车驾驶证号码) /// 命令字0x02 采集记录仪的实时时钟 /// 命令字0x03 采集累计行程里程 /// 命令字0x04 采集记录仪脉冲系数 /// 命令字0x05 采集车辆信息(车辆识别代号、机动车号牌号码、机动车号牌分类) /// 命令字0x06 采集记录仪状态信号配置信息 /// 命令字0x07 采集记录仪唯一性编号 /// 命令字0x08 采集指定的行驶速度记录,有时间参数,跨度不超过1小时 /// 命令字0x09 采集指定的位置信息记录,有时间参数,跨度不超过1小时 /// 命令字0x10 采集指定的事故疑点记录,有时间参数,跨度不超过1分钟 /// 命令字0x11 采集指定的超时驾驶记录,有时间参数,跨度不超过7天 /// 命令字0x12 采集指定的驾驶人身份记录,有时间参数,跨度不超过7天 /// 命令字0x13 采集指定的外部供电记录,有时间参数,跨度不超过7天 /// 命令字0x14 采集指定的参数修改记录,有时间参数,跨度不超过7天 /// 命令字0x15 采集指定的速度状态日志,有时间参数,跨度不超过1分钟 /// </summary> /// <param name="sysflag"></param> /// <param name="token"></param> /// <param name="cid"></param> /// <param name="tno"></param> /// <param name="ncmd"></param> /// <param name="nType"></param> /// <param name="nBeginDateTime"></param> /// <param name="nEndDateTime"></param> /// <returns></returns> public static bool Send_CTS_DriveRecordDataCollectionRequest(string sysflag, string token, long cid, long tno, uint ncmd, uint nType = 0, long nBeginDateTime = 0, long nEndDateTime = 0) { QMDPartnerPackage package = RequestPackage.getDriveRecordDataCollectionRequest(tno, ncmd, nType, nBeginDateTime, nEndDateTime); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
/// <summary> /// 下发立即牌照指令 /// </summary> /// <param name="sysflag"></param> /// <param name="token"></param> /// <param name="cid"></param> /// <param name="tno"></param> /// <returns></returns> public static bool Send_CTS_ImageRequestDown(string sysflag, string token, long cid, long tno, uint ch = 0) { QMDPartnerPackage package = RequestPackage.getImageRequestDown(tno, ch); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
/// <summary> ///终端参数设置指令 /// </summary> /// <param name="sysflag"></param> /// <param name="token"></param> /// <param name="cid"></param> /// <param name="tno"></param> /// <param name="paramlist"></param> /// <returns></returns> public static bool Send_CTS_SetTermParamDown(string sysflag, string token, long cid, long tno, List <CTS_SetTermParamDown.TerminalParamItem> paramlist) { QMDPartnerPackage package = RequestPackage.getSetTermParamDown(tno, paramlist); return(RDSConfig.SendMsg(sysflag, token, cid, package)); }
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); } }
static void tc_ReceivedDatagram(object sender, NetEventArgs e) { //LogHelper.WriteInfo("接收到RDS推送数据包"); List <byte[]> DataPakages = e.Client.Datagram; foreach (byte[] vdata in DataPakages) { byte[] recdata = vdata; if (recdata.Length < 28) { return; } byte[] sfdata = new byte[20]; byte[] ciddata = new byte[8]; byte[] data = new byte[recdata.Length - 20 - 8]; Array.Copy(recdata, sfdata, 20); Array.Copy(recdata, 20, ciddata, 0, 8); Array.Copy(recdata, 28, data, 0, data.Length); string sysflag = Encoding.ASCII.GetString(sfdata); sysflag = sysflag.Replace("\0", ""); long carid = System.BitConverter.ToInt64(ciddata, 0); QMDPartnerPackage datapag = null; if (checkPackage(data, ref datapag)) { //车辆在线通知信息包 if (datapag.dwOperation1 == 10101 && datapag.dwOperation2 == 20202) { MemoryStream msc = new MemoryStream(datapag.byteContext); if (datapag.byteContext.Length > 0) { Dictionary <long, int> reqdata = ProtoBuf.Serializer.Deserialize <Dictionary <long, int> >(msc); foreach (long cid in reqdata.Keys) { SetCarOnlineStatus(sysflag, cid, reqdata[cid]); } } } string key = sysflag + "|" + carid + "|" + datapag.dwPackageType + "|" + datapag.dwOperation1 + "|"; string extflag = ""; if (datapag.dwOperation1 == 41)//特殊处理行驶记录仪查询同时加入命令字做为指令细分 { MemoryStream msc = new MemoryStream(datapag.byteContext); CTS_DriveRecordDataUpResponse reqdata = ProtoBuf.Serializer.Deserialize <CTS_DriveRecordDataUpResponse>(msc); key += reqdata.nCMD.ToString(); extflag = reqdata.nCMD.ToString(); } else if (datapag.dwOperation1 == 99)//透传指令 下发加入透传id作为细分指令 { MemoryStream msc = new MemoryStream(datapag.byteContext); CTS_TransmissionProtocol reqdata = ProtoBuf.Serializer.Deserialize <CTS_TransmissionProtocol>(msc); extflag = reqdata.nTransID.ToString("X2"); if (reqdata.nTransID == 0x0f01)//解放消贷控制指令特殊处理,因为上行和下行nTransID不一致。此处填充上行id方便回指令结果 { extflag += reqdata.sData[0].ToString("X2") + reqdata.sData[1].ToString("X2"); } key += extflag; } if (UserOrderTable.ContainsKey(key)) { string tokens = UserOrderTable[key].ToString(); OrderResultModel orm = new OrderResultModel(); orm.cid = carid; orm.dwOperation1 = datapag.dwOperation1; orm.dwOperation2 = datapag.dwOperation2; orm.dwPackageType = datapag.dwPackageType; orm.ResData = datapag; orm.sysflag = sysflag; orm.resTime = DateTime.Now; orm.extflag = extflag; List <OrderResultModel> ormlist = new List <OrderResultModel>(); ormlist.Add(orm); string[] tokenarray = tokens.Split(','); foreach (string token in tokenarray) { //命令响应加入hash表 if (OrderResultTable.ContainsKey(token)) { List <OrderResultModel> oldormlist = (List <OrderResultModel>)OrderResultTable[token]; oldormlist.Add(orm); OrderResultTable[token] = oldormlist; } else { OrderResultTable.Add(token, ormlist); } //命令响应时间加入hash表 if (OrderAndResultTime.ContainsKey(token)) { OrderAndResultTime[token] = DateTime.Now; } else { OrderAndResultTime.Add(token, DateTime.Now); } LogHelper.WriteInfo(sysflag + "接收指令执行结果:" + key); } UserOrderTable.Remove(key); } } } }