using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace Simulator { class Unit { private string imei; private int gpsInterval; private NetworkStream ns; private bool arsValue = false; //on/off public UdpClient udp; public double lat = 42.061306; public double lng = -88.025755; public Int64 unitID_Int64; Thread t_ARS; Thread t_GPS; bool arsON = false; bool gpsON = false; public Unit(string _imei, int _gpsInterval, NetworkStream _ns) { imei = _imei; gpsInterval = _gpsInterval; ns = _ns; arsValue = true;//temp all unit are ON unitID_Int64 = Convert.ToInt64(imei); } public void Start() { Console.WriteLine("Starting ARS thread for unit:"+imei); if (t_ARS != null) { arsON = false; Thread.Sleep(3000); t_ARS.Abort(); t_ARS = null; } arsON = true; t_ARS = new Thread(new ThreadStart(SendARS)); t_ARS.IsBackground = false; t_ARS.Start(); Console.WriteLine("Starting GPS thread for unit:" + imei); if (t_GPS != null) { gpsON = false; Thread.Sleep(3000); t_GPS.Abort(); t_GPS = null; } gpsON = true; t_GPS = new Thread(new ThreadStart(SendGPS)); t_GPS.IsBackground = false; t_GPS.Start(); } public void Stop() { if (t_ARS != null) { arsON = false; Thread.Sleep(3000); t_ARS.Abort(); t_ARS = null; } if (t_GPS != null) { gpsON = false; Thread.Sleep(3000); t_GPS.Abort(); t_GPS = null; } } private void SendARS() { while (arsON) { try { Console.WriteLine("Send ARS for unit:" + imei + "arsValue:" + arsValue); byte[] idtmp = Encoding.Unicode.GetBytes(imei); byte[] idtmpX = (arsValue) ? Encoding.Unicode.GetBytes("1") : Encoding.Unicode.GetBytes("0"); int totalLeN = 7 + idtmp.Length + 2 + idtmpX.Length; byte[] msg = new byte[totalLeN]; //length msg[0] = 0x00; msg[1] = 0x13; //decodeID msg[2] = 0x04; //dialogID msg[3] = 0x12; msg[4] = 0x34; // body length msg[5] = 0x0A; msg[6] = (byte)idtmp.Length; for (int i = 0; i < idtmp.Length; i++) { msg[i + 7] = idtmp[i]; } msg[7 + idtmp.Length] = 0x0E; msg[7 + idtmp.Length + 1] = (byte)idtmpX.Length; for (int i = 0; i < idtmpX.Length; i++) { msg[7 + idtmp.Length + 2 + i] = idtmpX[i]; } //Console.WriteLine("Length:" + totalLeN.ToString() + " msg Lenght:" + msg.Length.ToString()); TCPServer.Send(msg, msg.Length, ns); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Thread.Sleep(1000 * 5); } } private void SendGPS() { while (gpsON) { try { //Console.WriteLine("Send Mess ON UDP unit:"+unitID+"unit State:"+unitState); Byte[] sendBytes = { 0x0D, 0x1F, 0x22, 0x04, 0x24, 0x68, 0xAC, 0xE0, 0x26, 0x0C, 0x00, 0x03, 0xEA, 0x34, 0x1F, 0x4D, 0xBC, 0x77, 0x80, 0x51, 0x11, 0x8E, 0xCD, 0x8D, 0x11, 0x8A, 0xD4, 0x7B, 0x00, 0x63, 0x6C, 0x00, 0x06 }; sendBytes[12] = (byte)(unitID_Int64 % 256); sendBytes[11] = (byte)((Int32)(unitID_Int64 / 256) % 256); sendBytes[10] = (byte)(unitID_Int64 / 256 * 256); DateTime timeNow = DateTime.Now; Int64 timeInt = timeNow.Second + 64 * timeNow.Minute + 64 * 64 * timeNow.Hour + 64 * 64 * 32 * timeNow.Day + 64 * 64 * 32 * 32 * timeNow.Month + 64 * 64 * 32 * 32 * 16 * (timeNow.Year % 64); //settime sendBytes[18] = (byte)(timeInt % 256); sendBytes[17] = (byte)((Int64)(timeInt / 256) % 256); sendBytes[16] = (byte)((Int64)(timeInt / (256 * 256)) % 256); sendBytes[15] = (byte)((Int64)(timeInt / (256 * 256 * 256))); sendBytes[14] = (byte)(timeNow.Year / 64); //Int64 latInt = sendBytes[20] * 256 * 256 * 256 + sendBytes[21] * 256 * 256 + sendBytes[22] * 256 + sendBytes[23]; //Console.WriteLine("latINT for 22.3344 ="+latInt); //setLAT Byte[] lat_arr = Invers_Lat(lat); //setLAT sendBytes[23] = lat_arr[0]; sendBytes[22] = lat_arr[1]; sendBytes[21] = lat_arr[2]; sendBytes[20] = lat_arr[3]; //setLNG Byte[] lng_arr = Invers_LNG(lng); sendBytes[27] = lng_arr[0]; sendBytes[26] = lng_arr[1]; sendBytes[25] = lng_arr[2]; sendBytes[24] = lng_arr[3]; ; Random random = new Random(); int numSpeed1 = random.Next(16); int numSpeed2 = random.Next(16); //setSpeed sendBytes[32] = (byte)numSpeed1;//0x0F; sendBytes[31] = (byte)numSpeed2;//0x0F; //incriment LAT LNG double numInc = random.NextDouble(); double d_num = numInc/10000; lat = lat - d_num; lng = lng + d_num; if (arsValue) { udp = new UdpClient(); udp.Send(sendBytes, sendBytes.Length, new IPEndPoint(IPAddress.Parse(Program.UDP_IP), Convert.ToInt32(Program.UDP_PORT))); Console.WriteLine("GPS for:" + imei + " sent date:" + DateTime.Now.ToString()); } } catch (Exception ex) { Console.WriteLine("Error SendGPS !!! \n" + ex.ToString()); } Thread.Sleep(1000 * gpsInterval); }//end while } public static Byte[] Invers_Lat(Double l) { Byte[] ret = new Byte[4]; Double lat = l; bool sign = false; if (lat < 0) { sign = true; lat *= -1; } lat *= 2; lat *= 1024; lat *= 1024; lat *= 1024; lat /= 90; ulong ul = (ulong)lat; ret = BitConverter.GetBytes(ul); if (sign) ret[3] |= 0x80; return ret; } public static Byte[] Invers_LNG(Double l) { Byte[] ret = new Byte[4]; Double lng = l; bool sign = false; if (lng < 0) { sign = true; lng *= -1; lng = 180 - lng; } lng *= 4; lng *= 1024; lng *= 1024; lng *= 1024; lng /= 360; ulong ul = (ulong)lng; ret = BitConverter.GetBytes(ul); if (sign) ret[3] |= 0x80; return ret; } //String DataToSend = "#"+GetRandomNumber(41.708804, 42.07784)+"#"+GetRandomNumber(-88.092499, -87.686005)+"#"; public static double GetRandomNumber(double minimum, double maximum) { Random random = new Random(); double dbl = random.NextDouble() * (maximum - minimum) + minimum; int a = (int)(dbl * 100000); double dbl1 = (double)((double)a / 100000); return dbl1; } } }