/// <summary> /// 创建消息,目前只支持涉及三种:Heart、Vehicle和Wim /// </summary> /// <param name="type">消息类型</param> /// <returns>新创建的消息实例</returns> private static IMsg Create(MsgType type) { switch (type) { case MsgType.Heart: return(new HeartMsg()); case MsgType.Vehicle: VehicleMsg vMsg = new VehicleMsg { FromRTV = true }; return(vMsg); case MsgType.Wim: WIMMsg wMsg = new WIMMsg { FromRTV = true }; return(wMsg); } return(null); }
private static void Main(string[] args) { if (args.Length != 1) { SysLog.WriteError("参数不正确,请以\r\ncmd demo.exe {本机监听端口号} \r\n启动,例如\r\ndemo.exe 20000"); Console.WriteLine("参数不正确,请以\r\ncmd demo.exe {本机监听端口号} \r\n启动,例如\r\ndemo.exe 20000"); return; } timer.Elapsed += Timer_Tick; timer.Interval = 60 * 60 * 1000; timer.Enabled = true; //new Thread(isReceivedLink).Start(); Console.Title = "Demo" + args[0]; port = args[0]; SysLog.LogName = $"port:{args[0]}.log"; //进程通信,给服务端通知这是开启的哪个端口 //Info.ProInfo.GetProcessInfo(args[0]); while (true) { try { //创建消息上下文对象 using (NetMQContext context = NetMQContext.Create()) { //创建Socket对象 NetMQSocket serverSocket = context.CreateResponseSocket(); //绑定本地端口,监听客户端的请求,端口号与配置一致 serverSocket.Bind($"tcp://*:{args[0]}"); Console.WriteLine($"开始监听{args[0]}"); SysLog.WriteLog($"开始监听{args[0]}"); string IP = ""; byte[] data; while (true) { //接收消息 data = serverSocket.Receive(); SysLog.WriteLog($"收到数据,来自:{serverSocket.Options.GetLastEndpoint}"); Console.WriteLine($"收到数据,来自:{serverSocket.Options.GetLastEndpoint}数据类型:{data[2]}"); receivedCount++; //saveInFileBytes(data); IP = serverSocket.Options.GetLastEndpoint; if (IP.Contains(":")) { IP = IP.Split(':')[0]; } try { //解析消息 IMsg msg = MsgParser.Parse(data); //出现错误时,msg会为null,继续等待下次接收到的数据。 if (msg == null) { continue; } //创建回复消息 ConfirmMsg responseMsg = new ConfirmMsg { ReceiveMsgType = msg.Type, ReceiveMsgId = "0" }; //打印消息数据 switch (msg.Type) { //车辆消息--可以根据实际情况获取消息内容 case MsgType.Vehicle: { VehicleMsg vMsg = msg as VehicleMsg; responseMsg.ReceiveMsgId = vMsg.Id; SysLog.WriteLog(string.Format("车辆信息:({0} {1} {2}t {3})", vMsg.Id, vMsg.EvtTime, vMsg.Weight_T, vMsg.Status)); Console.WriteLine(string.Format("车辆信息:({0} {1} {2} {3}t {4} {5})", vMsg.Id, vMsg.Plate, vMsg.EvtTime, vMsg.Weight_T, vMsg.Speed, vMsg.Status)); Intodb(vMsg, IP, args[0]); vMsg = null; break; } //称重消息--可以根据实际情况获取消息内容 case MsgType.Wim: { WIMMsg wMsg = msg as WIMMsg; SysLog.WriteLog(string.Format("称重信息(时间:{0},车道:{1}, 轴数:{2},总重:{3}t, 车速:{4}k/h,车长: {5}m)", wMsg.EvtTime.ToString("yyyy-MM-dd HH:mm:ss"), wMsg.LaneNo, wMsg.AxlesCount, wMsg.Weight_T, wMsg.Speed, wMsg.Length_M)); responseMsg.ReceiveMsgId = wMsg.Id; wMsg = null; break; } //心跳消息 case MsgType.Heart: { SysLog.WriteLog("Heart"); Console.WriteLine("Heart"); break; } } //发送回复消息 serverSocket.Send(responseMsg.Encode()); } catch (Exception ex) { SysLog.WriteError(ex.Message); Console.WriteLine(ex.Message); Console.WriteLine(ex.InnerException.Message); Console.WriteLine("接收数据出现错误"); return; } Console.WriteLine(); } } } catch (SocketException es) { SysLog.WriteError(es.Message); Console.WriteLine(es.Message); SysLog.WriteError("服务出错,正在软件内重启"); Console.WriteLine("服务出错,正在软件内重启"); Thread.Sleep(2000); } catch (NetMQException e2) { SysLog.WriteError("error" + e2.InnerException.Message); Console.WriteLine("error" + e2.InnerException.Message); SysLog.WriteError("服务出错,正在软件内重启"); Console.WriteLine("服务出错,正在软件内重启"); Thread.Sleep(2000); } catch (Exception eall) { SysLog.WriteError(eall.Message); Console.WriteLine(eall.Message); SysLog.WriteError("服务出错,正在软件内重启"); Console.WriteLine("服务出错,正在软件内重启"); Thread.Sleep(2000); } } }