SafeNet/Teltonika_SOC/ConnectionThread.cs

941 lines
37 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SafeNetLib;
using System.Net.Sockets;
using System.Threading;
using System.Net.NetworkInformation;
namespace Teltonika_SOC
{
// ---------------------------------------------------
// This class handles a client connection
// ---------------------------------------------------
class ConnectionThread
{
public TcpClient client;
public static int connections = 0;
public static int count = 0;
// ------------------------------------------------------
public ConnectionThread()
{
Utils.ConsWrite(DebugMSG_Type.Debug, " Connection Thread created ....");
LOGS.LOG(DateTime.Now.ToString() + " : Connection Thread created ....");
}
~ConnectionThread()
{
}
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");
LOGS.LOG(DateTime.Now.ToString() + " : New client accepted: " + connections + " active connections");
StringBuilder IMEIString = new StringBuilder();
//get IMEI
byte[] myReadBuffer2 = new byte[2048];
//Int64 IMEI = 0;
int numberOfBytesRead2 = 0;
Thread.Sleep(1);
try
{
do
{
numberOfBytesRead2 = ns.Read(myReadBuffer2, 0, myReadBuffer2.Length);
IMEIString.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer2, 2, numberOfBytesRead2 - 2));
}
while (ns.DataAvailable);
Utils.ConsWrite(DebugMSG_Type.Debug, "Retrived imei:" + IMEIString);
LOGS.LOG(DateTime.Now.ToString() + " : Retrived imei:" + IMEIString);
byte[] response = { 0x01 };
ns.Write(response, 0, response.Length);
ns.Flush();
}
catch (Exception ee)
{
Utils.ConsWrite(DebugMSG_Type.always, "Error on Reading IMEI \n:" + ee.ToString());
LOGS.LOG(DateTime.Now.ToString() + " : Error on Reading IMEI \n:" + ee.ToString());
}
//end of get IMEI
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);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
}
while (ns.DataAvailable);
if (myCompleteMessage.Length == 0)
{
break;
}
}
catch (Exception ee)
{
//Console.WriteLine(ee.ToString());
break;
}
Utils.ConsWrite(DebugMSG_Type.GPS, "Received: (len=" + numberOfBytesRead + ")");
LOGS.LOG(DateTime.Now.ToString() + " : Received: (len=" + numberOfBytesRead + ")");
// process the message
Byte toreturn = ProcessPacket2(myReadBuffer, numberOfBytesRead, IMEIString.ToString().Trim());
if (toreturn != 0)
{
byte[] response2 = { 0x00, 0x00, 0x00, 0x00 };
response2[3] = toreturn;
ns.Write(response2, 0, response2.Length);
ns.Flush();
#region setup mode
if (Program.setupMode)
{
string imei = IMEIString.ToString();
if(Program.ImeiHT.Contains(imei))
{
if ((int)Program.ImeiHT[imei] < Program.parametersCount)
{
string str = Program.commands[(int)Program.ImeiHT[imei]];
response2 = getByteCommand(str);
ns.Write(response2, 0, response2.Length);
ns.Flush();
Program.ImeiHT[imei] = (int)Program.ImeiHT[imei] + 1;
Utils.WriteLine("Command <<" + str + ">> has been sent to imei " + IMEIString.ToString(), ConsoleColor.Yellow,Program.isUnix);
if ((int)Program.ImeiHT[imei] == Program.parametersCount)
{
Utils.WriteLine("Setup finish for imei: " + IMEIString.ToString(), ConsoleColor.Yellow, Program.isUnix);
}
}
}
}
#endregion setup mode
}
else
{
string response = getDeviceResponse(myReadBuffer);
Utils.WriteLine("Response from unit " + IMEIString.ToString().Trim() + ": " + response, ConsoleColor.Yellow, Program.isUnix);
//byte[] response2 = { 0x00, 0x00, 0x00, 0x00 };
//response2[3] = toreturn;
//ns.Write(response2, 0, response2.Length);
//ns.Flush();
}
}
else
{
Utils.ConsWrite(DebugMSG_Type.Debug, "Sorry. You cannot read from this NetworkStream.");
LOGS.LOG(DateTime.Now.ToString() + " : Sorry. You cannot read from this NetworkStream.");
break;
}
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, "HandleConnection ERRROR!!! \n: " + ex.ToString());
LOGS.LOG(DateTime.Now.ToString() + " : HandleConnection ERRROR!!! \n: " + ex.ToString());
break;
}
}
ns.Flush();
ns.Close();
//client.Close();
Utils.CloseClient(client);
connections--;
Utils.ConsWrite(DebugMSG_Type.Debug, "Client disconnected: " + connections + " active connections");
LOGS.LOG(DateTime.Now.ToString() + " : 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)
{
Utils.ConsWrite(DebugMSG_Type.always, "Error in ProcessGPSLat" + ee.ToString());
LOGS.LOG(DateTime.Now.ToString() + " : 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)
{
Utils.ConsWrite(DebugMSG_Type.always, "Error in ProcessGPSLong" + ee.ToString());
LOGS.LOG(DateTime.Now.ToString() + " : Error in ProcessGPSLong" + ee.ToString());
return 0;
}
}
#region old code
// ---------------------------------------------------
// Packet and command processing
// ---------------------------------------------------
public Byte ProcessPacket_beforeAdrian(byte[] data, int len, String imei)
{
String pLat = "0.0", pLong = "0.0";
Int64 itime70 = 0;
Int32 iSpeed = 0;
Int64 ilat, ilong;
//first 4 bytes are 0x00,0x00,
//second 4 bytes lenght i don't need on first view
//code for GPS data 0x08
if (data[8] != 0x08) { return 0x00; }
//number of message
Int32 numberofMessage = 0;
numberofMessage = data[9];
Byte numberofMessByte = data[9];
Int32 step = 10;
for (int i = 0; i < numberofMessage; i++)
{
//itime70 = data[step]*256+data[step]*256
//get time
//Console.WriteLine();
//Console.Write("Bytes for time:");
itime70 = data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
step++;
for (int j = 0; j < 7; j++)
{
itime70 <<= 8;
itime70 |= (Int64)data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
//jump priority 0
step++;
//proccess LONG
//Console.WriteLine();
//Console.Write("Bytes for LONG:");
bool sign = false;
if ((data[step] & 0x80) != 0)
{
sign = true;
}
ilong = data[step];
Console.Write(" byte: 0x" + data[step].ToString("X2"));
step++;
for (int j = 0; j < 3; j++)
{
ilong <<= 8;
ilong |= (Int64)data[step];
Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
if (sign)
{
ilong = ilong - 0xFFFFFFFF;
}
double dlong = (Double)((Double)ilong / 10000000);
pLong = Convert.ToString(dlong);
//proccess LAT
// Console.WriteLine();
// Console.Write("Bytes for LAT:");
sign = false;
if ((data[step] & 0x80) != 0)
{
sign = true;
}
ilat = data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
step++;
for (int j = 0; j < 3; j++)
{
ilat <<= 8;
ilat |= (Int64)data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
if (sign)
ilat = ilat - 0xFFFFFFFF;
double dlat = (Double)((Double)ilat / 10000000);
pLat = Convert.ToString(dlat);
//jump altitude 2 bytes
step += 2;
//jump angle 2 bytes
step += 2;
//jump number of sattelites
step++;
//proccess speed
// Console.WriteLine();
//Console.Write("Bytes for Speed:");
iSpeed = data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
iSpeed <<= 8;
step++;
iSpeed |= (Int32)data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
step++;
int IOID = (Int32)data[step];
Console.WriteLine("IOID:" + IOID);
step++;
int IOrecords = (Int32)data[step];
Console.WriteLine("IOrecords:" + IOrecords);
step++;
int DImask =0;
int NR1ByteIO = (Int32)data[step];
Console.WriteLine("NR1ByteIO:" + NR1ByteIO);
step++;
for (int k = 0; k < NR1ByteIO; k++)
{
Console.WriteLine("DI 1 byte: <elementID: 0x" + data[step].ToString("X2")
+ " value: 0x" + data[step+1].ToString("X2") +">");
step += 2; //1 byte ID 1 byte value
if (data[step + 1] == 1)
DImask +=(int) Math.Pow(2, data[step]-1);
}
int NR2ByteIO = (Int32)data[step];
Console.WriteLine("NR2ByteIO:" + NR2ByteIO);
step++;
for (int k = 0; k < NR2ByteIO; k++)
{
Console.WriteLine("DI 2 byte: <elementID: 0x" + data[step].ToString("X2")
+ " value: 0x" + data[step + 1].ToString("X2")
+ " 0x"+ data[step + 2].ToString("X2") + ">");
step += 3; //1 byte ID 2 byte value
}
int NR4ByteIO = (Int32)data[step];
Console.WriteLine("NR4ByteIO:" + NR4ByteIO);
step++;
for (int k = 0; k < NR2ByteIO; k++)
{
Console.WriteLine("DI 4 byte: <elementID: 0x" + data[step].ToString("X2")
+ " value: 0x" + data[step + 1].ToString("X2")
+ " 0x" + data[step + 2].ToString("X2")
+ " 0x" + data[step + 4].ToString("X2")
+ " 0x" + data[step + 5].ToString("X2") + ">");
step += 5; //1 byte ID 4 byte value
}
int NR8ByteIO = (Int32)data[step];
Console.WriteLine("NR8ByteIO:" + NR8ByteIO);
step++;
for (int k = 0; k < NR2ByteIO; k++)
{
Console.WriteLine("DI 8 byte: <elementID: 0x" + data[step].ToString("X2")
+ " value: 0x" + data[step + 1].ToString("X2")
+ " 0x" + data[step + 2].ToString("X2")
+ " 0x" + data[step + 3].ToString("X2")
+ " 0x" + data[step + 4].ToString("X2")
+ " 0x" + data[step + 5].ToString("X2")
+ " 0x" + data[step + 6].ToString("X2")
+ " 0x" + data[step + 7].ToString("X2")
+ " 0x" + data[step + 8].ToString("X2") + ">");
step += 9; //1 byte ID 8 byte value
}
//Console.WriteLine();
//Console.WriteLine("Time:"+itime70+" LONG:"+ilong+" LAT:"+ilat+" Speed:"+iSpeed);
//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 = iSpeed.ToString();
cell.lat = pLat;
cell.lng = pLong;
cell.d_lat = dlat;
cell.d_lng = dlong;
cell.location_time = Utils.UnixTimeStampToDateTime(itime70 / 1000);
Utils.WriteLine("GPS for SUID: " + imei + " with time: " + cell.location_time + " lat: " + pLat + " lng: " + pLong, ConsoleColor.Gray,Program.isUnix);
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: " + DImask);
SUinfo sui = (SUinfo)SN_Queues.ht_SUInfo[imei];
foreach (Alert alert in sui.alertList)
{
if (alert.Type == Alert_TYPE.DI)
if (alert.DImask1 == DImask)
{
SN_Queues.alertQueue.PostItem(alert);
Utils.ConsWrite(DebugMSG_Type.ALERTS, "Alert: " + 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());
}
}
return numberofMessByte;
}
#endregion old code
// ---------------------------------------------------
// Packet and command processing
// ---------------------------------------------------
public Byte ProcessPacket2(byte[] data, int len, String imei)
{
String pLat = "0.0", pLong = "0.0";
Int64 itime70 = 0;
Int32 iSpeed = 0;
Int64 ilat, ilong;
Int16 IOID;
//first 4 bytes are 0x00,0x00,
//second 4 bytes lenght i don't need on first view
//code for GPS data 0x08
if (data[8] != 0x08) { return 0x00; }
//number of message
Int32 numberofMessage = 0;
numberofMessage = data[9];
Byte numberofMessByte = data[9];
Int32 step = 10;
for (int i = 0; i < numberofMessage; i++)
{
//itime70 = data[step]*256+data[step]*256
//get time
//Console.WriteLine();
//Console.Write("Bytes for time:");
itime70 = data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
step++;
for (int j = 0; j < 7; j++)
{
itime70 <<= 8;
itime70 |= (Int64)data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
//jump priority 0
step++;
//proccess LONG
//Console.WriteLine();
//Console.Write("Bytes for LONG:");
bool sign = false;
if ((data[step] & 0x80) != 0)
{
sign = true;
}
ilong = data[step];
//Console.Write(" byte: 0x" + data[step].ToString("X2"));
step++;
for (int j = 0; j < 3; j++)
{
ilong <<= 8;
ilong |= (Int64)data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
if (sign)
{
ilong = ilong - 0xFFFFFFFF;
}
double dlong = (Double)((Double)ilong / 10000000);
pLong = Convert.ToString(dlong);
//proccess LAT
// Console.WriteLine();
// Console.Write("Bytes for LAT:");
sign = false;
if ((data[step] & 0x80) != 0)
{
sign = true;
}
ilat = data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
step++;
for (int j = 0; j < 3; j++)
{
ilat <<= 8;
ilat |= (Int64)data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
if (sign)
ilat = ilat - 0xFFFFFFFF;
double dlat = (Double)((Double)ilat / 10000000);
pLat = Convert.ToString(dlat);
//jump altitude 2 bytes
step += 2;
//jump angle 2 bytes
step += 2;
//jump number of sattelites
step++;
//proccess speed
// Console.WriteLine();
//Console.Write("Bytes for Speed:");
#region SPEED
// get MSB
iSpeed = data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
// LEFT SHIFT == multiply with 2^8
iSpeed <<= 8;
step++;
// LOGIC OR
iSpeed |= (Int32)data[step];
//Console.Write(" 0x" + data[step].ToString("X2"));
#endregion
step++;
#region IOID
List<Telemetry> sourceTelemetry = new List<Telemetry>();
IOID = (Int16)data[step++];
//Console.WriteLine("IOID:" + IOID);
int IOrecords = (Int32)data[step];
//Console.WriteLine("IOrecords:" + IOrecords);
step++;
int DImask = 0;
int NR1ByteIO = (Int32)data[step];
//Console.WriteLine("NR1ByteIO:" + NR1ByteIO);
step++;
for (int k = 0; k < NR1ByteIO; k++)
{
Telemetry tel = new Telemetry();
tel.ID = (Int32)data[step];
tel.TelemetryValue = (Int32)data[step + 1];
sourceTelemetry.Add(tel);
//Console.WriteLine("DI 1 byte: <elementID: 0x" + data[step].ToString("X2")
// + " value: 0x" + data[step+1].ToString("X2") +">");
if (data[step + 1] == 1)
DImask += (int)Math.Pow(2, data[step]);
step += 2; //1 byte ID 1 byte value
}
int NR2ByteIO = (Int32)data[step];
Console.WriteLine("NR2ByteIO:" + NR2ByteIO);
step++;
for (int k = 0; k < NR2ByteIO; k++)
{
Telemetry tel = new Telemetry();
tel.ID = (Int32)data[step];
step++;
tel.TelemetryValue = data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
// LEFT SHIFT == multiply with 2^8
tel.TelemetryValue <<= 8;
step++;
// LOGIC OR
tel.TelemetryValue |= (Int32)data[step + 2];
sourceTelemetry.Add(tel);
//Console.WriteLine("DI 2 byte: <elementID: 0x" + data[step].ToString("X2")
// + " value: 0x" + data[step + 1].ToString("X2")
// + " 0x"+ data[step + 2].ToString("X2") + ">");
step++; //1 byte ID 2 byte value
}
int NR4ByteIO = (Int32)data[step];
//Console.WriteLine("NR4ByteIO:" + NR4ByteIO);
step++;
for (int k = 0; k < NR4ByteIO; k++)
{
Telemetry tel = new Telemetry();
tel.ID = (Int32)data[step];
step++;
for (int j = 0; j < 3; j++)
{
tel.TelemetryValue <<= 8;
tel.TelemetryValue |= (Int32)data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
sourceTelemetry.Add(tel);
//Console.WriteLine("DI 4 byte: <elementID: 0x" + data[step].ToString("X2")
// + " value: 0x" + data[step + 1].ToString("X2")
// + " 0x" + data[step + 2].ToString("X2")
// + " 0x" + data[step + 4].ToString("X2")
// + " 0x" + data[step + 5].ToString("X2") + ">");
//step += 5; //1 byte ID 4 byte value
step++;
}
int NR8ByteIO = (Int32)data[step];
//Console.WriteLine("NR8ByteIO:" + NR8ByteIO);
step++;
for (int k = 0; k < NR8ByteIO; k++)
{
Telemetry tel = new Telemetry();
tel.ID = (Int32)data[step];
step++;
for (int j = 0; j < 7; j++)
{
tel.TelemetryValue <<= 8;
tel.TelemetryValue |= (Int32)data[step];
// Console.Write(" 0x" + data[step].ToString("X2"));
step++;
}
sourceTelemetry.Add(tel);
//Console.WriteLine("DI 8 byte: <elementID: 0x" + data[step].ToString("X2")
// + " value: 0x" + data[step + 1].ToString("X2")
// + " 0x" + data[step + 2].ToString("X2")
// + " 0x" + data[step + 3].ToString("X2")
// + " 0x" + data[step + 4].ToString("X2")
// + " 0x" + data[step + 5].ToString("X2")
// + " 0x" + data[step + 6].ToString("X2")
// + " 0x" + data[step + 7].ToString("X2")
// + " 0x" + data[step + 8].ToString("X2") + ">");
//step += 9; //1 byte ID 8 byte value
step++;
}
#endregion
//Console.WriteLine();
//Console.WriteLine("Time:"+itime70+" LONG:"+ilong+" LAT:"+ilat+" Speed:"+iSpeed);
//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 = iSpeed.ToString();
cell.lat = pLat;
cell.lng = pLong;
cell.d_lat = dlat;
cell.d_lng = dlong;
cell.location_time = Utils.UnixTimeStampToDateTime(itime70 / 1000);
cell.telemetryList = new List<Telemetry>(sourceTelemetry);
Utils.ConsWrite(DebugMSG_Type.GPS, "GPS for SUID: " + imei + " with time: " + cell.location_time + " lat: " + pLat + " lng: " + pLong);
LOGS.LOG(DateTime.Now.ToString() + " : 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!!!");
LOGS.LOG(DateTime.Now.ToString() + " : 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: " + DImask);
SUinfo sui = (SUinfo)SN_Queues.ht_SUInfo[imei];
foreach (Alert alert in sui.alertList)
{
if (alert.Type == Alert_TYPE.DI)
if (alert.DImask1 == DImask)
{
alert.Alert_latitude = pLat;
alert.Alert_longitude = pLong;
alert.Speed = iSpeed;
alert.Digital_in = DImask;
alert.Position_time = Utils.UnixTimeStampToDateTime(itime70 / 1000).ToString("yyyy:MM:dd HH:mm:ss");
SN_Queues.alertQueue.PostItem(alert);
Utils.ConsWrite(DebugMSG_Type.ALERTS, "Alert: " + alert.Alert_name + " added to queue");
LOGS.LOG(DateTime.Now.ToString() + " : Alert: " + 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());
}
}
return numberofMessByte;
}
public static Byte[] getByteCommand(string str)
{
#region Command
string hex = "";
foreach (char letter in str)
{
hex += String.Format("{0:X}", Convert.ToInt32(letter));
}
string chunk = "";
List<byte> sendByteArray = new List<byte>();
foreach (char c in hex)
{
chunk += c;
if (chunk.Length == 2)
{
sendByteArray.Add((byte)(Int32.Parse(chunk, System.Globalization.NumberStyles.HexNumber)));
chunk = "";
}
}
#endregion Command
#region Carriage Return + Line feed
sendByteArray.Add(0x0D);
sendByteArray.Add(0x0A);
#endregion Carriage Return + Line feed
#region Quantity of commands
sendByteArray.Add(0x01);
#endregion Quantity of commands
#region Command size
int command_Size = sendByteArray.ToArray().Length;
sendByteArray.Insert(0, (byte)command_Size);
sendByteArray.Insert(0, 0x00);
sendByteArray.Insert(0, 0x00);
sendByteArray.Insert(0, 0x00);
#endregion Command size
#region Command type
sendByteArray.Insert(0, 0x05);
#endregion Command type
#region Quantity of commands
sendByteArray.Insert(0, 0x01);
#endregion Quantity of commands
#region Codec
sendByteArray.Insert(0, 0x0C);
#endregion Codec
#region packet length
int packet_length = sendByteArray.ToArray().Length;
byte[] bytes = new byte[4];
bytes[0] = (byte)(packet_length >> 24);
bytes[1] = (byte)(packet_length >> 16);
bytes[2] = (byte)(packet_length >> 8);
bytes[3] = (byte)packet_length;
sendByteArray.Insert(0, bytes[3]);
sendByteArray.Insert(0, bytes[2]);
sendByteArray.Insert(0, bytes[1]);
sendByteArray.Insert(0, bytes[0]);
#endregion packet length
#region Preamble
sendByteArray.Insert(0, 0x00);
sendByteArray.Insert(0, 0x00);
sendByteArray.Insert(0, 0x00);
sendByteArray.Insert(0, 0x00);
List<byte> newList = sendByteArray.GetRange(8, sendByteArray.ToArray().Length - 8);
byte[] byteArray = newList.ToArray();
#endregion Preamble
#region crc
UInt16 crc = Crc16.ComputeChecksum(byteArray);
bytes = new byte[4];
bytes[0] = (byte)(crc >> 24);
bytes[1] = (byte)(crc >> 16);
bytes[2] = (byte)(crc >> 8);
bytes[3] = (byte)crc;
sendByteArray.Add(bytes[0]);
sendByteArray.Add(bytes[1]);
sendByteArray.Add(bytes[2]);
sendByteArray.Add(bytes[3]);
#endregion crc
return sendByteArray.ToArray();
}
public static string getDeviceResponse(byte[] data)
{
string response = string.Empty;
//ignoring preamble & packet length
Int32 step = 8;
int codec = data[step++];
if (codec != 12) return response;
int qtyOfCommands = data[step++];
if (qtyOfCommands != 1) return response;
int commandType = data[step++];
if (commandType != 6) return response;
int messageLength = 0;
for (int j = 0; j < 4; j++)
{
messageLength <<= 8;
messageLength |= data[step];
step++;
}
response = System.Text.Encoding.ASCII.GetString(data, step, messageLength).Trim();
return response;
}
//CRC-16-ANSI LSB-reverse (with 0xA001 coefficient)
//CRC-16-ANSI MSB-normal (with 0x8005 coefficient)
//CRC-XMODEM LSB-reverse (with 0x8408 coefficient)
//CRC-CCITT MSB-normal (with 0x1021 coefficient)
}
#region CRC 16 0xA001
//http://www.goobbe.biz/questions/5764811/how-to-generate-a-crc-16-from-c-sharp
public static class Crc16
{
const ushort polynomial = 0xA001;
static readonly ushort[] table = new ushort[256];
public static ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0;
for (int i = 0; i < bytes.Length; ++i)
{
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
}
return crc;
}
static Crc16()
{
ushort value;
ushort temp;
for (ushort i = 0; i < table.Length; ++i)
{
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
{
if (((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}
#endregion
}