Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }