using SafeMobileLib; using SDRGatewayService.Enums; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SDRGatewayService { class MessageBuss { private string messageBusIP; private int messageBusPort; private GeneralLocationManager GM; private Thread t_GPS; private Thread t_EVENT; private Thread t_SMS; private static UdpMulticast udp; private SDR parentSDR = null; public MessageBuss(string messageBusIP, string messageBusPort, SDR _parentSDR) { this.messageBusIP = messageBusIP; this.messageBusPort = Convert.ToInt32(messageBusPort); this.parentSDR = _parentSDR; try { udp = new UdpMulticast(messageBusIP, this.messageBusPort); Utils.WriteEventLog(Program.COMPANY, "MessageBuss ip:" + messageBusIP + " port:" + this.messageBusPort, EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("MessageBuss ip:" + messageBusIP + " port:" + this.messageBusPort, Color.Green)); udp.OnNewDataRecv += new UdpMulticast.newData4Send(udp_OnNewDataRecv); udp.StartListen(); } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, "MessageBuss exception while joining the message bus: " + ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Error:" + ex.Message, Color.Red)); } //start messageBus for location GM = new GeneralLocationManager(udp); //start Process thread (handle GPS) t_GPS = new Thread(new ThreadStart(Process_GPS)); t_GPS.IsBackground = true; t_GPS.Start(); //start Process thread (handle EVENTS) t_EVENT = new Thread(new ThreadStart(Process_EVENT)); t_EVENT.IsBackground = true; t_EVENT.Start(); //start Process thread (handle SMS) t_SMS = new Thread(new ThreadStart(Process_SMS)); t_SMS.IsBackground = true; t_SMS.Start(); } public static DateTime UnixTimeStampToDateTime(int unixTimeStamp) { // Unix timestamp is seconds past epoch System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); dtDateTime = dtDateTime.AddSeconds(unixTimeStamp).ToLocalTime(); return dtDateTime; } void udp_OnNewDataRecv(byte[] data, int dataLen) { try { string str = System.Text.Encoding.ASCII.GetString(data, 0, dataLen); //Utils.WriteLine($"--- MB [{str}]", ConsoleColor.Green); String[] tempArray = str.Trim().Split(new char[] { '#' });//, StringSplitOptions.RemoveEmptyEntries); if (tempArray.Length > 3) { //SMS message if (tempArray[3].Equals("142") || tempArray[3].Equals("143")) { Utils.WriteEventLog(Program.COMPANY, "On SMS Request received [" + str.Trim() + "]", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("RX(multi SMS): " + str.Trim(), Color.DarkOrange)); // Console.WriteLine("SMSSendThread received from multicast bus: " + str.Trim()); int sched_timeGMT = 0; if (tempArray.Length > 6) sched_timeGMT = Convert.ToInt32(tempArray[6]); // Console.WriteLine("SMS sched time={0} and current time ={1}",sched_timeGMT, DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime())); int gwid_recv = Convert.ToInt32((tempArray[4].Split('.'))[0]); OnSDSRequest(Int64.Parse(tempArray[4].Split('.')[2]), gwid_recv, Convert.ToInt32((tempArray[4].Split('.'))[1]), tempArray[5], sched_timeGMT, tempArray[2]); } if (tempArray[3].Equals("154")) { Utils.WriteEventLog(Program.COMPANY, "On Poll Request received [" + str.Trim() + "]", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("RX(multi POLL): " + str.Trim(), Color.DarkOrange)); string SUID = (tempArray[4].Split('.'))[2]; try { if (tempArray.Length > 6) OnPollRequest?.Invoke(Int64.Parse(SUID), int.Parse(tempArray[5]) == 1 ? true : false, tempArray[2]); else OnPollRequest?.Invoke(Int64.Parse(SUID), true, tempArray[2]); } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, "Exception Poll request received: " + ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); OnPollRequest?.Invoke(Int64.Parse(SUID), true, tempArray[2]); } //parentSDR.Send_Imed_Loc_req(Convert.ToUInt32(SUID), false); } if (tempArray[3].Equals("209")) { // raise event for units changed in the admin module OnUnitsUpdated?.Invoke(); } //receive CallOut if (tempArray[3].Equals("177")) { string SUID = (tempArray[4]); Utils.WriteEventLog(Program.COMPANY, "On CallOut Request received [" + str.Trim() + "]", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); try { OnCallOutRequest?.Invoke(UInt32.Parse(tempArray[4]), UInt16.Parse(tempArray[5]), tempArray[6]); } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, "Exception CallOut request received: " + ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); OnCallOutRequest?.Invoke(UInt32.Parse(tempArray[4]), UInt16.Parse(tempArray[5]), tempArray[6]); } } //receive CallOut Stop if (tempArray[3].Equals("178")) { string SUID = (tempArray[4]); Utils.WriteEventLog(Program.COMPANY, "On CallOut Stop Request received [" + str.Trim() + "]", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); OnCallOutStopRequest?.Invoke(UInt32.Parse(tempArray[4]), UInt16.Parse(tempArray[5])); } }//if (tempArray.Length > 3) } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Error:" + ex.Message, Color.Red)); } } private double LATtest = 0; private double LNGtest = 0; private double Speedtest = 0; private void Process_GPS() { Utils.WriteEventLog(Program.COMPANY, "Message buss message handler for GPS started!!!", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Message buss message handler for GPS started!!!", Color.DarkOrange)); while (true) { try { msgCell cell = Program.gpsQueue.GetItem(100); if (cell != null) { if (cell.msg == MSG_TYPE.GPS || cell.msg == MSG_TYPE.GPSpoll) { uint time70 = cell.time.DateTo70Format(); //if (cell.time70 != 0) time70 = cell.time70; //double tempSpeed = double.Parse(cell.spd); //tempSpeed = tempSpeed * 3.6; // convert from knots to KM //cell.spd = ((int)tempSpeed).ToString(); // test before LAT LNG SPEED before put on the message bus if ((Double.TryParse(cell.lat, out LATtest)) && (Double.TryParse(cell.lng, out LNGtest)) && (Double.TryParse(cell.spd, out Speedtest))) if ((LATtest < 90) && (LATtest > -90) && (LNGtest < 180) && (LNGtest > -180) && (Speedtest < 250)) GM.SendLoc2messagebus(cell.IMEI, time70, cell.spd, cell.lat, cell.lng, cell.poll); else GM.SendLoc2messagebus(cell.IMEI, time70, "0", "0", "0", cell.poll); //Main.activityQueue.PostItem(new RepString("GPS sent on messagebuss", Color.DarkOrange)); } } Thread.Sleep(1); } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, "Error in MessageBuss/Process \n" + ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); Thread.Sleep(1000); //Main.activityQueue.PostItem(new RepString("Error:" + ex.Message, Color.Red)); } } } private void Process_EVENT() { Utils.WriteEventLog(Program.COMPANY, "Message buss message handler for EVENTS started!!!", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Message buss message handler for EVENTS started!!!", Color.DarkOrange)); while (true) { try { msgCell cell = Program.eventQueue.GetItem(100); if (cell != null) { if (cell.msg == MSG_TYPE.ARS) { String seqID = "0." + (DateTime.Now.GetSecondsLocalFromDT()) + DateTime.Now.Millisecond.ToString(); string msg = "#130#" + cell.IMEI + "#" + ((cell.ars == 1) ? "ON" : "OFF") + "#"; SendOnMsgBuss(seqID, msg); //Main.activityQueue.PostItem(new RepString("ARS sent on messagebuss", Color.DarkOrange)); } if (cell.msg == MSG_TYPE.Emergency) { String seqID = "0." + (DateTime.Now.GetSecondsLocalFromDT()) + DateTime.Now.Millisecond.ToString(); string msg = "#138#" + cell.IMEI + "#"; SendOnMsgBuss(seqID, msg); // request gps position after each emergency if (OnPollRequest != null) OnPollRequest(Int64.Parse(cell.IMEI), true, seqID); } } Thread.Sleep(1); } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, "Error in MessageBuss/Process \n" + ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Error:" + ex.Message, Color.Red)); Thread.Sleep(1000); } } } private void Process_SMS() { Utils.WriteEventLog(Program.COMPANY, "###################"+ Environment.NewLine + "Message buss message handler for SMS started!!!" + Environment.NewLine + "###################", EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Message buss message handler for SMS started!!!", Color.DarkOrange)); while (true) { try { msgCell cell = Program.smsINQueue.GetItem(100); if (cell != null) { if (cell.msg == MSG_TYPE.SMS) { String seqID = "0." + (DateTime.Now.GetSecondsLocalFromDT()) + DateTime.Now.Millisecond.ToString(); string msg = "#132#" + cell.IMEI + "#" + cell.sms + "#hyt#"; Utils.WriteEventLog(Program.COMPANY, "SMS [" + cell.sms + "] Received from " + cell.IMEI, EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); SendOnMsgBuss(seqID, msg); } } Thread.Sleep(1); } catch (Exception ex) { Utils.WriteEventLog(Program.COMPANY, "Error in MessageBuss/Process \n" + ex.ToString(), EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); //Main.activityQueue.PostItem(new RepString("Error:" + ex.Message, Color.Red)); Thread.Sleep(1000); } } } public static void SendOnMsgBuss(string seqID, string test) { if (udp != null) { byte[] toSend = SafeMobileLib.Utils.Convert_text_For_multicast("#" + seqID + test); udp.Send(toSend, toSend.Length); Utils.WriteEventLog(Program.COMPANY, String.Format("+++ MB [{0}] ", Utils.ConvertBytesToString(toSend)), EventLogEntryType.Information, (int)EventId.EVENT_MSGBUS); } else { Utils.WriteEventLog(Program.COMPANY, "Error!!! SendOnMsgBuss messagebus =null", EventLogEntryType.Error, (int)EventId.EVENT_MSGBUS); } } #region EVENTS REGION public delegate void UnitsUpdated(); public event UnitsUpdated OnUnitsUpdated; public delegate void PollRequest(Int64 radioID, bool isLong, string seqNumber); public event PollRequest OnPollRequest; public delegate void SDSRequest(Int64 radioID, Int64 gatewayID, Int64 gatewayRadioID, string message, int type, string seqID); public event SDSRequest OnSDSRequest; public delegate void CallOut(UInt64 destISSI, UInt16 callOutSeverity, string GeoName); public event CallOut OnCallOutRequest; public delegate void CallOutStop(UInt64 destISSI, UInt16 callOutSeverity); public event CallOutStop OnCallOutStopRequest; #endregion } }