using centralController.model; using nettyCommunication; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace centralController.WebServer { class MyWebServer : IWebServer { private Queue reserveQueue = null; private object reserveLock = new object(); private Communication comm = null; private Thread receiveMsg = null; private bool isClosing { get; set; } private bool connected { get; set; } public void BookFetchRecord() { throw new NotImplementedException(); } public void BookParkRecord() { throw new NotImplementedException(); } /// /// 更新预约车车辆状态 /// /// /// /// /// /// private bool UpdateVehicleState(bool localDB, int state, int orderRecordsID, string license) { string vehicleUpdateSql = ""; string vehicleInsertSql = ""; if (state >= 0) { vehicleUpdateSql = "update vehicle set vehiclepParkState = " + state + " ,orderRecordsID = " + orderRecordsID + " where numberPlate = '" + license + "';"; vehicleInsertSql = "insert into vehicle (numberPlate,vehiclepParkState,orderRecordsID) values " + "('" + license + "'," + state + "," + orderRecordsID + ");"; } else { vehicleUpdateSql = "update vehicle set orderRecordsID = " + orderRecordsID + " where numberPlate = '" + license + "';"; vehicleInsertSql = "insert into vehicle (numberPlate,orderRecordsID) values " + "('" + license + "'," + orderRecordsID + ");"; } List vehicleUpdateList = new List(); List vehicleInsertList = new List(); vehicleUpdateList.Add(vehicleUpdateSql); vehicleInsertList.Add(vehicleInsertSql); if (localDB) { if (!Monitor.Monitor.localDBOper.UpdateTransaction(vehicleUpdateList)) { if (!Monitor.Monitor.localDBOper.Insert(vehicleInsertList)) return false; else return true; } else return true; } else { if (!Monitor.Monitor.remoteDBOper.UpdateTransaction(vehicleUpdateList)) { if (!Monitor.Monitor.remoteDBOper.Insert(vehicleInsertList)) return false; else return true; } else return true; } } /// /// 预约数据库操作 /// /// /// /// /// /// /// /// private bool OrderDBOperation(bool localDB, string userID, bool parking, string license, string orderTime, int orderLength) { //预约记录插入db string orderRecordInsertSql; if (parking) { orderRecordInsertSql = "insert into orderrecords (userID,numberPlate,garageID, bookParkTime, bookHour, bookPrice,bookState) " + "VALUES (" + userID + ", '" + license + "', '" + Monitor.Monitor.garageID + "', '" + orderTime + "', " + orderLength + ",NULL, '0');"; } else { orderRecordInsertSql = "insert into orderrecords (userID,numberPlate,garageID, bookFetchTime, bookHour, bookPrice,bookState) " + "VALUES (" + userID + ", '" + license + "', '" + Monitor.Monitor.garageID + "', '" + orderTime + "', " + orderLength + ",NULL, '2');"; } List orderList = new List(); orderList.Add(orderRecordInsertSql); if (localDB) Monitor.Monitor.localDBOper.Insert(orderList); else Monitor.Monitor.remoteDBOper.Insert(orderList); //查询预约记录id号 int currentID = 0; List orderRecords = Monitor.Monitor.GetOrderRecords(localDB, license, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")); if (orderRecords.Count != 0) { currentID = (int)(UInt32)orderRecords[0][0]; } else { /*反馈web,预约失败*/ return false; } //更新车辆状态 UpdateVehicleState(localDB, parking ? 4 : 5, currentID, license); return true; } private bool ReservationValidate(MessageUTF8 msg) { //可预约车位总数 int allBookableSpace = Monitor.Monitor.ins.GetFreeSpaceCount(3); int count = 0; DateTime start, end; try { start = DateTime.Parse(msg.bookTime); end = start.AddHours(msg.bookLength); } catch { return false; } lock (reserveLock) { Queue.Enumerator enumer = reserveQueue.GetEnumerator(); while (enumer.MoveNext()) { DateTime tempStart, tempEnd; try { tempStart = DateTime.Parse(enumer.Current.bookTime); tempEnd = start.AddHours(enumer.Current.bookLength); } catch { return false; } if(!((tempStart-end).TotalMinutes>0 || (start - tempEnd).TotalMinutes > 0)) { count += 1; } } } if (allBookableSpace >= count) return false; else return true; } private void MsgHandling(MessageUTF8 msg) { try { switch (msg.cmd) { //预约停 case "RESERVE": lock (reserveLock) { reserveQueue.Enqueue(msg); } //预约记录与车辆状态写入数据库 OrderDBOperation(true, msg.sender, true, msg.context, msg.bookTime, 3); OrderDBOperation(false, msg.sender, true, msg.context, msg.bookTime, 3); //回复给web msg.cmd = "0"; comm.SendMessage(msg); break; //预约取 case "PREFETCH": break; //停车 case "PARK": break; //取车 case "FETCH": break; //连接断开消息 case "DISCONNECT": Monitor.Monitor.SetNotification("收到连接断开提示消息"); break; //更新广告 case "ADVERT": string adAlert = ""; bool result = Monitor.Monitor.advertMgr.UpdateAdvert(out adAlert); if (!result) { Monitor.Monitor.SetNotification("广告更新失败,请尝试手动更新"); } else { Monitor.Monitor.SetNotification("广告更新成功\n" + adAlert); } break; default: Monitor.Monitor.SetNotification("接收到无法识别的指令"); break; } } catch (Exception ex) { Console.WriteLine("收消息," + ex.Message + "\n" + ex.StackTrace); } } /// /// 启动消息接收,启动超时指令处理 /// /// /// public bool Start(int port) { isClosing = false; reserveQueue = new Queue(); //MessageUTF8 message = new MessageUTF8(); //message.context = "sending message test"; //message.cmd = "S"; //message.parkingRecordsID = 1; Task.Factory.StartNew(() => { //初始化后与web持续连接 while (!isClosing) { try { Connections.Connection(); connected = true; comm = new Communication(); break; } catch (Exception) { connected = false; Console.WriteLine("服务没有开启,请检查服务器"); } Thread.Sleep(2000); } //持续判断连接状态并重连 while (!isClosing) { Console.WriteLine(Connections.isAlive() + ", " + receiveMsg.ThreadState.ToString()); if (Connections.isAlive()) { if (!connected) { comm = new Communication(); } connected = true; if (receiveMsg.ThreadState == ThreadState.Aborted) { try { receiveMsg.Start(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } else { connected = false; try { if (receiveMsg.ThreadState == ThreadState.WaitSleepJoin) { receiveMsg.Interrupt(); } } catch (Exception ex) { Monitor.Monitor.SetNotification("连接断开,终止消息接收线程"); } Console.WriteLine(" 连接关闭,需要重新连接注册"); try { Connections.Connection(); } catch (Exception) { Console.WriteLine("服务没有开启,请检查服务器"); } } Thread.Sleep(1000); } }); //持续接收消息 receiveMsg = new Thread(() => { while (!isClosing) { try { if (connected && comm != null) { MessageUTF8 msg = ((MessageUTF8)comm.ReceiveMessage()); MsgHandling(msg); Monitor.Monitor.SetNotification(msg.context); } } catch { Console.WriteLine("线程已中断"); } } }); receiveMsg.Start(); //处理超时预约指令 Task.Factory.StartNew(() => { while (!isClosing) { lock (reserveLock) { for (int i = 0; i < reserveQueue.Count; i++) { try { MessageUTF8 msg = reserveQueue.Dequeue(); DateTime startTime = DateTime.Parse(msg.bookTime); TimeSpan ts = DateTime.Now - startTime; if (ts.TotalMinutes > msg.bookLength * 60) { //通知PLC将可预约车位数恢复一个 } else if (ts.TotalMinutes >= 0) { //通知PLC减少一个可预约车位数 reserveQueue.Enqueue(msg); } else { reserveQueue.Enqueue(msg); } } catch { } } } Thread.Sleep(5000); } }); return true; } public void Stop() { isClosing = true; Connections.close(); //throw new NotImplementedException(); } /// /// 预约车辆检测 /// /// /// public bool ReservedCarCheck(string license) { lock (reserveLock) { for (int i = 0; i < reserveQueue.Count; i++) { MessageUTF8 msg = reserveQueue.Dequeue(); if (msg.context == license) { if((DateTime.Now - DateTime.Parse(msg.bookTime)).TotalMinutes >= 0) { return true; } else { //车辆提前入场,不算为预约车辆 } } else { reserveQueue.Enqueue(msg); } } } return false; } } }