SafeNet/Simulator/Unit.cs

268 lines
8.6 KiB
C#

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;
}
}
}