489 lines
19 KiB
Plaintext
489 lines
19 KiB
Plaintext
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using SafeNetLib;
|
|
using System.Net.Sockets;
|
|
using System.Threading;
|
|
using System.Collections;
|
|
|
|
namespace PAL_SOC
|
|
{
|
|
// ---------------------------------------------------
|
|
// This class handles a client connection
|
|
// ---------------------------------------------------
|
|
class ConnectionThread
|
|
{
|
|
public TcpClient client;
|
|
private static int connections = 0;
|
|
|
|
private static int MAX_IMEI = 14;
|
|
private static int MAX_XML = 600;
|
|
private static int MAX_BUFFER = 2000;
|
|
string imei = "";
|
|
|
|
enum ERR
|
|
{
|
|
NO_ERROR,
|
|
CRC_ERROR,
|
|
LEN_ERROR
|
|
};
|
|
|
|
enum CLIENT
|
|
{
|
|
GPRS,
|
|
COMMAND
|
|
};
|
|
|
|
enum CMD_RSP
|
|
{
|
|
IMEI_NOT_REG,
|
|
IMEI_PROCESSING_CMD,
|
|
CMD_ACCEPTED
|
|
};
|
|
|
|
CLIENT threadType;
|
|
|
|
// ------------------------------------------------------
|
|
|
|
public ConnectionThread()
|
|
{
|
|
|
|
}
|
|
|
|
~ConnectionThread()
|
|
{
|
|
|
|
}
|
|
static string old = "";
|
|
public void HandleConnection()
|
|
{
|
|
byte[] data = new byte[2048];
|
|
|
|
NetworkStream ns = client.GetStream();
|
|
ns.ReadTimeout = 60000;
|
|
//Console.WriteLine("read timeout = " + ns.ReadTimeout);
|
|
connections++;
|
|
Utils.ConsWrite(DebugMSG_Type.Debug, "New client accepted: " + connections + " active connections");
|
|
|
|
while (true)
|
|
{
|
|
try
|
|
{
|
|
if (ns.CanRead)
|
|
{
|
|
byte[] myReadBuffer = new byte[2048];
|
|
StringBuilder myCompleteMessage = new StringBuilder();
|
|
int numberOfBytesRead = 0;
|
|
Thread.Sleep(1);
|
|
|
|
// check for new data available on the socket
|
|
try
|
|
{
|
|
do
|
|
{
|
|
numberOfBytesRead = ns.Read(myReadBuffer, 0, myReadBuffer.Length);
|
|
old = ProcessPacket(myReadBuffer, numberOfBytesRead, old);
|
|
}
|
|
while (ns.DataAvailable);
|
|
if (myCompleteMessage.Length == 0)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception ee)
|
|
{
|
|
//Console.WriteLine(ee.ToString());
|
|
break;
|
|
}
|
|
|
|
Utils.ConsWrite(DebugMSG_Type.GPS, "Recived : (len=" + numberOfBytesRead + ")\n");
|
|
|
|
}
|
|
else
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.Debug, "Sorry. You cannot read from this NetworkStream.");
|
|
break;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.always, "HandleConnection ERRROR!!! \n: " + ex.ToString());
|
|
break;
|
|
}
|
|
}
|
|
ns.Close();
|
|
client.Close();
|
|
connections--;
|
|
Utils.ConsWrite(DebugMSG_Type.Debug, "Client disconnected: " + connections + " active connections");
|
|
}
|
|
|
|
|
|
float ProcessGPSLat(String latitude, String lat_dir)
|
|
{
|
|
try
|
|
{
|
|
long LAT, LAT2;
|
|
char LAT3;
|
|
long llat, grade, zec;
|
|
char[] param = new char[50];
|
|
String[] latList;
|
|
float flat;
|
|
|
|
param = lat_dir.ToCharArray();
|
|
if (param[0] != 'N' && param[0] != 'S')
|
|
return 0;
|
|
|
|
//Console.WriteLine("Latitude " + latitude + " dir " + lat_dir);
|
|
|
|
latList = latitude.Split('.');
|
|
LAT = Convert.ToInt32(latList[0]);
|
|
if (latList[1].Length > 4)
|
|
latList[1] = latList[1].Remove(4);
|
|
LAT2 = Convert.ToInt32(latList[1]);
|
|
LAT3 = param[0];
|
|
|
|
// process the lat and lng for display
|
|
grade = (LAT / 100L);
|
|
zec = (LAT % 100L) * 1000L + LAT2 / 10; // get MMMMM*1000, from MM.mmmmm by MM*1000+mmm (0-59999)
|
|
zec = (zec * 100L) / 60L; // translate MMMMM*1000 to DD * 100 * 1000 (0-99998)
|
|
grade = grade * 100000 + zec; // translate all to DDddddd
|
|
llat = grade;
|
|
|
|
flat = (float)llat / 100000;
|
|
|
|
if (param[0] == 'S')
|
|
flat = -flat;
|
|
|
|
if (flat < -90 || flat > 90)
|
|
{
|
|
Console.WriteLine("[warning \"overflow lat\": flat={0} llat={1}]",
|
|
flat, llat);
|
|
return 0;
|
|
}
|
|
|
|
return flat;
|
|
}
|
|
catch (Exception ee)
|
|
{
|
|
Console.WriteLine("Error in ProcessGPSLat" + ee.ToString());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
float ProcessGPSLong(String longitude, String lng_dir)
|
|
{
|
|
try
|
|
{
|
|
long LNG, LNG2;
|
|
char LNG3;
|
|
long llng, grade, zec;
|
|
char[] param = new char[50];
|
|
String[] lngList;
|
|
float flong;
|
|
|
|
param = lng_dir.ToCharArray();
|
|
if (param[0] != 'E' && param[0] != 'W')
|
|
return 0;
|
|
|
|
lngList = longitude.Split('.');
|
|
LNG = Convert.ToInt32(lngList[0]);
|
|
if (lngList[1].Length > 4)
|
|
lngList[1] = lngList[1].Remove(4);
|
|
LNG2 = Convert.ToInt32(lngList[1]);
|
|
LNG3 = param[0];
|
|
|
|
grade = LNG / 100; // get DD (0-90)
|
|
zec = (LNG % 100L) * 1000L + LNG2 / 10; // get MMMMM*1000, from MM.mmmmm by MM*1000+mmm (0-59999)
|
|
zec = (zec * 100L) / 60L; // translate MMMMM*1000 to DD * 100 * 1000 (0-99998)
|
|
grade = grade * 100000 + zec; // translate all to DDddddd
|
|
llng = grade;
|
|
|
|
flong = (float)llng / 100000;
|
|
|
|
if (param[0] == 'W')
|
|
flong = -flong;
|
|
|
|
if (flong < -180 || flong > 180)
|
|
{
|
|
Console.WriteLine("[warning \"overflow lng\": flng={0} llng={1}]",
|
|
flong, llng);
|
|
return 0;
|
|
}
|
|
|
|
return flong;
|
|
}
|
|
catch (Exception ee)
|
|
{
|
|
Console.WriteLine("Error in ProcessGPSLong" + ee.ToString());
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------
|
|
// Packet and command processing
|
|
// ---------------------------------------------------
|
|
public string ProcessPacket(byte[] data, int len, String remains)
|
|
{
|
|
try
|
|
{
|
|
int i, pos, pos1, itime70, xmlnr;
|
|
string xml = "", auxStr = ""; // this is the xml message that will be feeded into the DB
|
|
char[] dataC = new char[30000];
|
|
char[] auxC = new char[3500];
|
|
String[] pList;
|
|
ArrayList xmls = new ArrayList();
|
|
String cmdCS = "", latDir = "", longDir = "", param;
|
|
|
|
String imei = "", pTime, pLat, pLong, hdop, alt, fix, cog, skmh, sknt, date, nsat, gpio = "", gpi = "", gpo = "", RFID = "",Alarm ="";
|
|
int year = 0, mon = 0, day = 0, hour = 0, min = 0, sec = 0;
|
|
pLong = "0.0";
|
|
pLat = "0.0";
|
|
float flat, flong;
|
|
double fhdop;
|
|
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
dataC[i] = (char)data[i];
|
|
auxStr += dataC[i];
|
|
}
|
|
//add unprocessed string bits from last command
|
|
//Console.WriteLine("\r\nLength:{0}:\r\n({1})\r\n({2})\r\n", len, remains, auxStr);
|
|
auxStr = remains + auxStr;
|
|
|
|
xmlnr = 0;
|
|
|
|
i = 0;
|
|
while (auxStr.Contains("<<<") && auxStr.Contains(">>>"))
|
|
{
|
|
i++;
|
|
|
|
pos = auxStr.IndexOf("<<<");
|
|
pos1 = auxStr.IndexOf(">>>");
|
|
cmdCS = auxStr.Substring(pos + 3, pos1 - pos - 3);
|
|
auxStr = auxStr.Substring(pos1 + 3, auxStr.Length - pos1 - 3);
|
|
|
|
Console.WriteLine("got{0}:<{1}>", i, cmdCS);
|
|
|
|
//valid...
|
|
pList = cmdCS.Split(',');
|
|
|
|
if (pList[1].IndexOf("gna") == 0)
|
|
continue;
|
|
|
|
pTime = pList[1];
|
|
date = pList[10];
|
|
nsat = pList[11];
|
|
|
|
//get only the integer part
|
|
pos = pList[8].IndexOf(".");
|
|
if (pos > 0)
|
|
skmh = pList[8].Remove(pos);
|
|
else
|
|
skmh = "0";
|
|
|
|
//Console.WriteLine("ID param: " + pList[0]);
|
|
//extract '<<<' from the imei
|
|
if (pList[0].Contains("<<<"))
|
|
{
|
|
//!!!! testez daca e imei de telit //ar trebui +3 - din cauza ca db are 14 lungime imei si telit are 15
|
|
if (pList[0].Length == 18)
|
|
{
|
|
pos = pList[0].IndexOf("<<<") + 4;
|
|
}
|
|
else
|
|
{
|
|
pos = pList[0].IndexOf("<<<") + 3;
|
|
}
|
|
pList[0] = pList[0].Substring(pos, pList[0].Length - pos);
|
|
}
|
|
else
|
|
{
|
|
//!!!! testez daca imei de telit //ar trebui 0 nu 1 - din cauza ca db are 14 lungime imei si telit are 15
|
|
if (pList[0].Length == 15)
|
|
{
|
|
//pList[0] = pList[0].Substring(1, pList[0].Length - 1);
|
|
}
|
|
}
|
|
//extract '>>>' from the gpio
|
|
gpi = "0";
|
|
gpo = "0";
|
|
imei = pList[0];
|
|
//if the fix is valid - 2d or 3d
|
|
if (pList[6].Contains("2") || pList[6].Contains("3"))
|
|
{
|
|
hdop = pList[4];
|
|
|
|
if (pList[2].Length > 1)
|
|
{
|
|
pos = pList[2].Length - 1;
|
|
latDir = pList[2].Substring(pos, 1);
|
|
pLat = pList[2].Remove(pos);
|
|
}
|
|
else
|
|
{
|
|
latDir = "N";
|
|
pLat = "0.0";
|
|
}
|
|
|
|
if (pList[3].Length > 1)
|
|
{
|
|
pos = pList[3].Length - 1;
|
|
longDir = pList[3].Substring(pos, 1);
|
|
pLong = pList[3].Remove(pos);
|
|
}
|
|
else
|
|
{
|
|
longDir = "E";
|
|
pLong = "0.0";
|
|
}
|
|
|
|
param = pTime.Substring(0, 2);
|
|
hour = Convert.ToInt32(param);
|
|
param = pTime.Substring(2, 2);
|
|
min = Convert.ToInt32(param);
|
|
param = pTime.Substring(4, 2);
|
|
sec = Convert.ToInt32(param);
|
|
|
|
param = date.Substring(0, 2);
|
|
day = Convert.ToInt32(param);
|
|
param = date.Substring(2, 2);
|
|
mon = Convert.ToInt32(param);
|
|
param = date.Substring(4, 2);
|
|
year = Convert.ToInt32(param);
|
|
|
|
System.DateTime dateTime = new DateTime(2000 + year, mon, day, hour, min, sec, DateTimeKind.Utc);
|
|
|
|
if (2000 + year != DateTime.Now.Year)
|
|
{
|
|
Console.WriteLine("{0}:::::{1}", 2000 + year, DateTime.Now.Year);
|
|
return auxStr;
|
|
}
|
|
|
|
TimeSpan diff = new DateTime(2000 + year, mon, day, hour, min, sec, DateTimeKind.Utc) -
|
|
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
|
|
DateTime d = new DateTime();
|
|
if (d.IsDaylightSavingTime())
|
|
{
|
|
Console.WriteLine("Time: Is daylight");
|
|
itime70 = Convert.ToInt32(diff.TotalSeconds) + 3600;
|
|
}
|
|
else
|
|
itime70 = Convert.ToInt32(diff.TotalSeconds);
|
|
|
|
flat = ProcessGPSLat(pLat, latDir);
|
|
flong = ProcessGPSLong(pLong, longDir);
|
|
|
|
cog = pList[7].Remove(pList[7].IndexOf("."));
|
|
if (pList.Length > 13)
|
|
{
|
|
gpio = pList[13];
|
|
if (gpio.Length == 5)
|
|
{
|
|
int tmpgp = 0;
|
|
if (gpio[0] == '1') tmpgp = tmpgp + 1;
|
|
if (gpio[1] == '1') tmpgp = tmpgp + 2;
|
|
gpo = tmpgp.ToString();
|
|
tmpgp = 0;
|
|
if (gpio[2] == '1') tmpgp = tmpgp + 1;
|
|
if (gpio[3] == '1') tmpgp = tmpgp + 2;
|
|
if (gpio[4] == '1') tmpgp = tmpgp + 4;
|
|
gpi = tmpgp.ToString();
|
|
}
|
|
}
|
|
|
|
//check for alarm
|
|
if (pList.Length > 14)
|
|
{
|
|
Alarm = pList[14];
|
|
|
|
}
|
|
|
|
String plat, plong;
|
|
plat = Convert.ToString(flat);
|
|
plong = Convert.ToString(flong);
|
|
plat = plat.Replace(',', '.');
|
|
plong = plong.Replace(',', '.');
|
|
|
|
xml += "\" time=\"" + itime70.ToString() + "\" latitude=\"" + plat + "\" longitude=\"" + plong;
|
|
xml += "\" speed=\"" + skmh + "\" dgr=\"" + cog;
|
|
xml += "\" ai1=\"" + "0" + "\" ai2=\"" + "0";
|
|
xml += "\" ai3=\"" + "0" + "\" ai4=\"" + "0";
|
|
xml += "\" ai5=\"" + "0" + "\" ai6=\"" + "0";
|
|
xml += "\" ai7=\"" + "0" + "\" ai8=\"" + "0";
|
|
xml += "\" di=\"" + gpi + "\" do=\"" + gpo;
|
|
xml += "\" RFID=\"" + RFID + "\"";
|
|
|
|
//add data to location QUEUE
|
|
try
|
|
{
|
|
//locManager.SendLoc2messagebus(imei, (Int32)(itime70/1000), iSpeed.ToString(), pLat, pLong);
|
|
htCell_t cell = new htCell_t();
|
|
cell.suid = imei;
|
|
cell.spd = skmh.ToString();
|
|
cell.lat = pLat;
|
|
cell.lng = pLong;
|
|
cell.d_lat = flat;
|
|
cell.d_lng = flong;
|
|
cell.location_time = dateTime;//Utils.UnixTimeStampToDateTime(itime70 / 1000);
|
|
Utils.ConsWrite(DebugMSG_Type.GPS, "GPS for SUID: " + imei + " with time: " + cell.location_time + " lat: " + pLat + " lng: " + pLong);
|
|
|
|
SN_Queues.DBQueueLocation.PostItem(cell);
|
|
Utils.ConsWrite(DebugMSG_Type.GPS, "Message added to queue!!!");
|
|
|
|
//process ALERTS
|
|
if (SN_Queues.ht_SUInfo.ContainsKey(imei))
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.ALERTS, "Processing alerts for: " + imei);
|
|
Utils.ConsWrite(DebugMSG_Type.ALERTS, "Message mask: " + gpi);
|
|
Utils.ConsWrite(DebugMSG_Type.ALERTS, "Message contains alarm token: " + Alarm);
|
|
SUinfo sui = (SUinfo)SN_Queues.ht_SUInfo[imei];
|
|
foreach (Alert alert in sui.alertList)
|
|
{
|
|
|
|
if (Alarm.Contains("!") || Alarm.Contains("ALARM"))
|
|
{
|
|
|
|
if (alert.Type == Alert_TYPE.DI)
|
|
if (alert.DImask1 == Convert.ToInt32(gpi))
|
|
{
|
|
SN_Queues.alertQueue.PostItem(alert);
|
|
Utils.ConsWrite(DebugMSG_Type.ALERTS, "********* Alert (DI): " + alert.Alert_name + " added to queue ********");
|
|
}
|
|
}
|
|
|
|
if (alert.Type == Alert_TYPE.SPEED)
|
|
{
|
|
if (((alert.Speed *16)/10) < Int32.Parse(skmh))
|
|
{
|
|
SN_Queues.alertQueue.PostItem(alert);
|
|
Utils.ConsWrite(DebugMSG_Type.ALERTS, "@@@@@@@@@@ Alert (SPEED): " + alert.Alert_name + " added to queue @@@@@@@@");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.always, "ConnectionThread.cs =>> Error adding location to queue!!!");
|
|
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
|
|
}
|
|
|
|
}
|
|
} // while
|
|
|
|
|
|
return auxStr;
|
|
}
|
|
catch (Exception ee)
|
|
{
|
|
Console.WriteLine("Erorr in Procces packet" + ee.ToString());
|
|
return " ";
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|