/// <summary> /// 组装查询终端属性消息 /// </summary> /// <param name="msgBodyProps"></param> /// <param name="phone"></param> /// <param name="flowId"></param> /// <returns></returns> public static byte[] rtnServerSelectRespMsg(int msgBodyProps, string phone, int flowId) { List <byte> byteSource = new List <byte>(); // 1. 0x7e byte[] bt1 = ExplainUtils.integerTo1Bytes(pkg_delimiter); // 2. 消息ID word(16) byte[] bt2 = ExplainUtils.integerTo2Bytes(cmd_terminal_prop_query); // 3.消息体属性 byte[] bt3 = ExplainUtils.integerTo2Bytes(msgBodyProps); // 4. 终端手机号 bcd[6] byte[] bt4 = ExplainUtils.string2Bcd(phone); // 5. 消息流水号 word(16),按发送顺序从 0 开始循环累加 byte[] bt5 = ExplainUtils.integerTo2Bytes(flowId); byteSource.AddRange(bt1); byteSource.AddRange(bt2); byteSource.AddRange(bt3); byteSource.AddRange(bt4); byteSource.AddRange(bt5); // 6.校验码 int checkSum = ExplainUtils.getCheckSum4JT808(byteSource.ToArray(), 1, (int)(byteSource.Count)); byte[] bt9 = ExplainUtils.integerTo1Bytes(checkSum); byteSource.AddRange(bt9); // 7. 0x7e byteSource.AddRange(bt1); // 转义 return(ExplainUtils.DoEscape4Send(byteSource.ToArray(), 1, byteSource.ToArray().Length - 1)); }
/// <summary> /// 主动下发校时信息(定时任务) /// </summary> /// <param name="code"></param> public static void SendCheckTimerInfo(NewEnergySession session, string code) { //68 0C 0C 68 5C 12 12 00 08 09 17 10 12 13 23 28 90 16 char[] a = code.ToCharArray(); string[] strArr = ExplainUtils.str2StrArr(code); byte[] msg = new byte[18]; msg[0] = 0x68; msg[1] = 0x0C; msg[2] = 0x0C; msg[3] = 0x68; msg[4] = 0x5C; msg[5] = ExplainUtils.strToToHexByte(strArr[0])[0]; msg[6] = ExplainUtils.strToToHexByte(strArr[1])[0]; msg[7] = ExplainUtils.strToToHexByte(strArr[2])[0]; msg[8] = ExplainUtils.strToToHexByte(strArr[3])[0]; msg[9] = 0x09; System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = int.Parse(ConfigurationManager.AppSettings["interval"]); timer.Enabled = true; timer.Elapsed += (obj, e) => { DateTime now = DateTime.Now; string[] timeArr = now.ToString("yy-MM-dd-HH-mm-ss").Split('-'); msg[10] = ExplainUtils.string2Bcd(timeArr[0])[0]; msg[11] = ExplainUtils.string2Bcd(timeArr[1])[0]; msg[12] = ExplainUtils.string2Bcd(timeArr[2])[0]; msg[13] = ExplainUtils.string2Bcd(timeArr[3])[0]; msg[14] = ExplainUtils.string2Bcd(timeArr[4])[0]; msg[15] = ExplainUtils.string2Bcd(timeArr[5])[0]; int index = Array.LastIndexOf(msg, (byte)0x68); int len = msg.Length - 2 - index; byte[] newArr = new byte[len]; Buffer.BlockCopy(msg, index, newArr, 0, len); msg[msg.Length - 2] = ExplainUtils.makeCheckSum(newArr); msg[17] = 0x16; String str = BitConverter.ToString(msg).Replace("-", " "); //Console.WriteLine("{0} 定时任务 >> 主动下发校时:{1}", DateTime.Now, str); logger.Info("<<" + code + ">>timer start,send checking time info to<<" + session.RemoteEndPoint + ">>:" + str); session.Send(msg, 0, msg.Length); }; timer.Start(); if (!timers.ContainsKey(code)) { timers.TryAdd(code, timer); } else { timers[code] = timer; } }
/// <summary> /// 下发校时消息 /// </summary> /// <param name="sendMsg"></param> /// <param name="session"></param> /// <param name="typeIndex"></param> /// <param name="index"></param> public static void SendCheckTimerInfo(byte[] sendMsg, NewEnergySession session, int typeIndex, int index) { DateTime now = DateTime.Now; string[] timeArr = now.ToString("yy-MM-dd-HH-mm-ss").Split('-'); sendMsg[typeIndex + 1] = ExplainUtils.string2Bcd(timeArr[0])[0]; sendMsg[typeIndex + 2] = ExplainUtils.string2Bcd(timeArr[1])[0]; sendMsg[typeIndex + 3] = ExplainUtils.string2Bcd(timeArr[2])[0]; sendMsg[typeIndex + 4] = ExplainUtils.string2Bcd(timeArr[3])[0]; sendMsg[typeIndex + 5] = ExplainUtils.string2Bcd(timeArr[4])[0]; sendMsg[typeIndex + 6] = ExplainUtils.string2Bcd(timeArr[5])[0]; int len = sendMsg.Length - 2 - index; byte[] newArr = new byte[len]; Buffer.BlockCopy(sendMsg, index, newArr, 0, len); sendMsg[sendMsg.Length - 2] = ExplainUtils.makeCheckSum(newArr); String reply = BitConverter.ToString(sendMsg).Replace("-", " "); logger.Info("checking time reply<<" + session.RemoteEndPoint + ">>: " + reply); Console.WriteLine("checking time reply<<{0}>>: {1}", session.RemoteEndPoint, reply); session.Send(sendMsg, 0, sendMsg.Length);//回复客户端 }
//组装平台通用应答消息 public static byte[] rtnServerCommonRespMsg(int msgBodyProps, string phone, int flowId, int msgId) { //7E //8001 消息ID //0005 消息体属性 //018512345678 手机号 //0015 消息流水号 //0015 应答流水号 //04 结果(00成功, 01失败, 02消息有误, 03不支持,04报警处理确认) //BA 鉴权码 //7E MemoryStream ms = new MemoryStream(); List <byte> byteSource = new List <byte>(); // 1. 0x7e //ms.Write(ExplainUtils.integerTo1Bytes(pkg_delimiter), 0, 1); byte[] bt1 = ExplainUtils.integerTo1Bytes(pkg_delimiter); // 2. 消息ID word(16) //ms.Write(ExplainUtils.integerTo2Bytes(cmd_terminal_register_resp), 0, 2); byte[] bt2 = ExplainUtils.integerTo2Bytes(cmd_common_resp); // 3.消息体属性 byte[] bt3 = ExplainUtils.integerTo2Bytes(msgBodyProps); // 4. 终端手机号 bcd[6] //ms.Write(ExplainUtils.string2Bcd(phone), 0, 6); byte[] bt4 = ExplainUtils.string2Bcd(phone); // 5. 消息流水号 word(16),按发送顺序从 0 开始循环累加 //ms.Write(ExplainUtils.integerTo2Bytes(flowId), 0, 2); byte[] bt5 = ExplainUtils.integerTo2Bytes(flowId); // 6. 应答流水号 //ms.Write(ExplainUtils.integerTo2Bytes(flowId), 0, 2); byte[] bt6 = ExplainUtils.integerTo2Bytes(flowId); // 7. 对应终端消息ID byte[] bt7 = ExplainUtils.integerTo2Bytes(msgId); // 8. 成功 //ms.Write(ExplainUtils.integerTo1Bytes(0), 0, 1); byte[] bt8 = ExplainUtils.integerTo1Bytes(0); byteSource.AddRange(bt1); byteSource.AddRange(bt2); byteSource.AddRange(bt3); byteSource.AddRange(bt4); byteSource.AddRange(bt5); byteSource.AddRange(bt6); byteSource.AddRange(bt7); byteSource.AddRange(bt8); // 9. BA 校验码 // 校验码 int checkSum = ExplainUtils.getCheckSum4JT808(byteSource.ToArray(), 1, (int)(byteSource.Count)); //ms.Write(ExplainUtils.integerTo1Bytes(checkSum), 0, 1); byte[] bt9 = ExplainUtils.integerTo1Bytes(checkSum); // 11. 0x7e //ms.Write(ExplainUtils.integerTo1Bytes(pkg_delimiter), 0, 1); byteSource.AddRange(bt9); byteSource.AddRange(bt1); // 转义 return(ExplainUtils.DoEscape4Send(byteSource.ToArray(), 1, byteSource.ToArray().Length - 1)); }
//组装终端应答消息 public static byte[] rtnTerminalRespMsg(int msgBodyProps, string phone, int flowId) { //7E //8100 消息ID //0004 消息体属性 //018512345678 手机号 //0015 消息流水号 //0015 应答流水号 //04 结果(00成功, 01车辆已被注册, 02数据库中无该车辆, 03终端已被注册, 04数据库中无该终端) 无车辆与无终端有什么区别 ? //313C 鉴权码 //7E MemoryStream ms = new MemoryStream(); List <byte> byteSource = new List <byte>(); // 1. 0x7e //ms.Write(ExplainUtils.integerTo1Bytes(pkg_delimiter), 0, 1); byte[] bt1 = ExplainUtils.integerTo1Bytes(pkg_delimiter); // 2. 消息ID word(16) //ms.Write(ExplainUtils.integerTo2Bytes(cmd_terminal_register_resp), 0, 2); byte[] bt2 = ExplainUtils.integerTo2Bytes(cmd_terminal_register_resp); // 3.消息体属性 byte[] bt3 = ExplainUtils.integerTo2Bytes(msgBodyProps); // 4. 终端手机号 bcd[6] //ms.Write(ExplainUtils.string2Bcd(phone), 0, 6); byte[] bt4 = ExplainUtils.string2Bcd(phone); // 5. 消息流水号 word(16),按发送顺序从 0 开始循环累加 //ms.Write(ExplainUtils.integerTo2Bytes(flowId), 0, 2); byte[] bt5 = ExplainUtils.integerTo2Bytes(flowId); // 6. 应答流水号 //ms.Write(ExplainUtils.integerTo2Bytes(flowId), 0, 2); byte[] bt6 = ExplainUtils.integerTo2Bytes(flowId); // 7. 成功 //ms.Write(ExplainUtils.integerTo1Bytes(0), 0, 1); byte[] bt7 = ExplainUtils.integerTo1Bytes(0); // 8. 鉴权码 //ms.Write(System.Text.Encoding.GetEncoding(string_encoding).GetBytes(replyToken), 0, replyToken.Length); byte[] bt8 = System.Text.Encoding.GetEncoding(string_encoding).GetBytes(replyToken); byteSource.AddRange(bt1); byteSource.AddRange(bt2); byteSource.AddRange(bt3); byteSource.AddRange(bt4); byteSource.AddRange(bt5); byteSource.AddRange(bt6); byteSource.AddRange(bt7); byteSource.AddRange(bt8); // 9. BA 校验码 // 校验码 int checkSum = ExplainUtils.getCheckSum4JT808(byteSource.ToArray(), 1, (int)(byteSource.Count)); //ms.Write(ExplainUtils.integerTo1Bytes(checkSum), 0, 1); byte[] bt9 = ExplainUtils.integerTo1Bytes(checkSum); // 11. 0x7e //ms.Write(ExplainUtils.integerTo1Bytes(pkg_delimiter), 0, 1); byteSource.AddRange(bt9); byteSource.AddRange(bt1); // 转义 return(ExplainUtils.DoEscape4Send(byteSource.ToArray(), 1, byteSource.ToArray().Length - 1)); }