571 lines
28 KiB
C#
571 lines
28 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading;
|
||
using System.Net;
|
||
using System.Net.Sockets;
|
||
using SafeMobileLib;
|
||
|
||
|
||
namespace MotoTrbo_GW
|
||
{
|
||
class TallysmanSendThread
|
||
{
|
||
//public static IPEndPoint iep;
|
||
//public static Socket server;
|
||
private Int32 Port = 0;
|
||
//private string radioIP;
|
||
private UdpMulticast udpMulticastBusConnection = null;
|
||
DBvehiclesManager vehiclesManager;
|
||
UdpClient udpClient;
|
||
private String mIP;
|
||
private Int32 mPort;
|
||
private static System.Threading.Timer tCheckMissingIds;
|
||
|
||
public TallysmanSendThread(Int32 port, String multicastID, String multicastPort, int TallysmanRequestInterval)
|
||
{
|
||
Port = port;
|
||
mIP = multicastID;
|
||
mPort = Int32.Parse(multicastPort);
|
||
vehiclesManager = new DBvehiclesManager(Main.DBServer, Main.DBSchema, Main.DBUser, Main.DBPass, Main.DBPort);
|
||
//retrive tallysman missing log ids
|
||
if (TallysmanRequestInterval >= 1)
|
||
tCheckMissingIds = new Timer(Check4MissingIds, null, new TimeSpan(0, 0, 0), new TimeSpan(0, TallysmanRequestInterval, 0));
|
||
}
|
||
|
||
public void resetCheckTimer(int newvalue)
|
||
{
|
||
if (newvalue == 0)
|
||
tCheckMissingIds?.Dispose();
|
||
else
|
||
tCheckMissingIds = new Timer(Check4MissingIds, null, new TimeSpan(0, 0, 0), new TimeSpan(0, newvalue, 0));
|
||
}
|
||
|
||
public void handleConnection()
|
||
{
|
||
try
|
||
{
|
||
udpMulticastBusConnection = new UdpMulticast(mIP, mPort);
|
||
udpMulticastBusConnection.OnNewDataRecv += new UdpMulticast.newData4Send(udp_OnNewDataReceived);
|
||
udpMulticastBusConnection.StartListen(Main.LocalIP);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SafeMobileLib.Utils.WriteLine("TallysmanSendThread exception while joining the multicast group: " + ex.ToString());
|
||
}
|
||
|
||
SafeMobileLib.Utils.WriteLine("TallysmanSendThread initialized on port " + Port, ConsoleColor.Yellow);
|
||
try
|
||
{
|
||
udpClient = new UdpClient();
|
||
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
|
||
udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, Port));
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SafeMobileLib.Utils.WriteLine("TallysmanSendThread handleConnection exception while creating udpClient: " + ex.ToString());
|
||
}
|
||
|
||
while (true)
|
||
{
|
||
/*
|
||
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
||
Byte[] receivedBytes = udpClient.Receive(ref remoteIpEndPoint);
|
||
char[] separator = { '.' };
|
||
string[] su = remoteIpEndPoint.Address.ToString().Split(separator);
|
||
uint radioID = (Convert.ToUInt32(su[1])) * 256 * 256 + (Convert.ToUInt32(su[2])) * 256 + Convert.ToUInt32(su[3]);
|
||
string suid = radioID.ToString();
|
||
Byte toreturn = TallysmanReceiveThread.ProcessPacket2(receivedBytes, receivedBytes.Length, radioID.ToString().Trim());
|
||
*/
|
||
Thread.Sleep(100);
|
||
}
|
||
|
||
#region test
|
||
////ping
|
||
////Byte[] sendBytes = { 0xFA,
|
||
//// 0x08,
|
||
//// 0x04,
|
||
//// 0x01,
|
||
//// 0x4D,
|
||
//// 0xB1,
|
||
//// 0x04
|
||
//// };
|
||
|
||
////List<byte> myByteArray = new List<byte>();
|
||
////myByteArray.Add((byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("08", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("09", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("04", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("11", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("05", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("84", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("00", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("02", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("EA", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("5E", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("EA", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("5F", System.Globalization.NumberStyles.HexNumber)));
|
||
////Byte[] sendBytes = myByteArray.ToArray();
|
||
|
||
////string galeata = "";
|
||
////List<byte> myByteArray = new List<byte>();
|
||
////myByteArray.Add((byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("08", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("0E", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("04", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("11", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("05", System.Globalization.NumberStyles.HexNumber)));
|
||
////myByteArray.Add((byte)(Int32.Parse("03", System.Globalization.NumberStyles.HexNumber)));
|
||
|
||
|
||
////double startDate = DateTime.Today.Year * (double)Math.Pow(2, 26) +
|
||
//// DateTime.Today.Month * (double)Math.Pow(2, 22) +
|
||
//// DateTime.Today.Day * (double)Math.Pow(2, 17) +
|
||
//// DateTime.Today.Hour * (double)Math.Pow(2, 12) +
|
||
//// DateTime.Today.Minute * (double)Math.Pow(2, 6) +
|
||
//// DateTime.Today.Second;
|
||
////string startDateHex = ((Int64)startDate).ToString("X2");
|
||
////foreach (char c in startDateHex)
|
||
////{
|
||
//// galeata += c;
|
||
//// if (galeata.Length == 2)
|
||
//// {
|
||
//// myByteArray.Add((byte)(Int32.Parse(galeata, System.Globalization.NumberStyles.HexNumber)));
|
||
//// galeata = "";
|
||
//// }
|
||
////}
|
||
////double stopDate = DateTime.Now.Year * (double)Math.Pow(2, 26) +
|
||
//// DateTime.Now.Month * (double)Math.Pow(2, 22) +
|
||
//// DateTime.Now.Day * (double)Math.Pow(2, 17) +
|
||
//// DateTime.Now.Hour * (double)Math.Pow(2, 12) +
|
||
//// DateTime.Now.Minute * (double)Math.Pow(2, 6) +
|
||
//// DateTime.Now.Second;
|
||
////string stopDateHex = ((Int64)stopDate).ToString("X2");
|
||
////foreach (char c in stopDateHex)
|
||
////{
|
||
//// galeata += c;
|
||
//// if (galeata.Length == 2)
|
||
//// {
|
||
//// myByteArray.Add((byte)(Int32.Parse(galeata, System.Globalization.NumberStyles.HexNumber)));
|
||
//// galeata = "";
|
||
//// }
|
||
////}
|
||
////Byte[] sendBytes = myByteArray.ToArray();
|
||
|
||
////Byte[] sendBytes = {
|
||
//// (byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)), // protocol
|
||
//// 0x08, // version
|
||
//// 0x06, // length in Bytes -> 6 bytes follow
|
||
//// 0x04, // message type -> Log Retrieval Request message
|
||
//// 0x11, // transaction id -> I’ve put a random int, I don’t know it’s ok like this
|
||
//// 0x05, // request lat, long, speed
|
||
//// 0x10, // Search Form request S4 log id binar 10000 = dec 16 hex 10
|
||
//// 0xEA,
|
||
//// 0x75,
|
||
//// 0X01,
|
||
//// 0x01 // requested log id is 13685 – encoded into BE 58
|
||
//// };
|
||
|
||
//var missing = GetTallysmanMissingLogIDLastDay();
|
||
//RequestTallysmanLogsOneByOne(missing);
|
||
|
||
////Byte[] sendBytes = {
|
||
//// (byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)), // protocol
|
||
//// 0x08, // version
|
||
//// 0x08, // length in Bytes -> 6 bytes follow
|
||
//// 0x04, // message type -> Log Retrieval Request message
|
||
//// 0x11, // transaction id -> I’ve put a random int, I don’t know it’s ok like this
|
||
//// 0xFF, // request lat, long, speed
|
||
//// 0xFF, // request lat, long, speed
|
||
//// 0x1F, // request lat, long, speed
|
||
//// 0x81, // Search Form request S4 log id binar 10000 = dec 16 hex 10
|
||
//// 0xA6,
|
||
//// 0x29 // requested log id is 13685 – encoded into BE 58
|
||
//// };
|
||
|
||
////Byte[] sendBytes = { 0xFA,
|
||
//// 0x08,
|
||
//// 0x04,
|
||
//// 0x01,
|
||
//// 0x4D,
|
||
//// 0xB1,
|
||
//// 0x04
|
||
//// };
|
||
|
||
////Byte[] sendBytes = {
|
||
//// (byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)), // protocol
|
||
//// 0x08, // version
|
||
//// 0x08, // length in Bytes -> 6 bytes follow
|
||
//// 0x04, // message type -> Log Retrieval Request message
|
||
//// 0x11, // transaction id -> I’ve put a random int, I don’t know it’s ok like this
|
||
//// 0x05, // request lat, long, speed
|
||
//// 0x80, // request lat, long, speed
|
||
//// 0x08, // request lat, long, speed
|
||
//// 0x01, // Search Form request S4 log id binar 10000 = dec 16 hex 10
|
||
//// 0xF8,
|
||
//// 0x05
|
||
|
||
//// };
|
||
|
||
|
||
|
||
//bool send = true;
|
||
//while (true)
|
||
//{
|
||
// //if (send)
|
||
// //{
|
||
// // udpClient.Client.SendTo(sendBytes, new IPEndPoint(IPAddress.Parse(Utils.ID2IP("12", "70")), 4069));
|
||
// // SM.Debug("POLL location request sent to radio ID " + "70");
|
||
// // Thread.Sleep(10000);
|
||
// // IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
||
// // send = false;
|
||
// //}
|
||
// //try
|
||
// //{
|
||
// // // Blocks until a message returns on this socket from a remote host.
|
||
// // SafeMobileLib.Utils.WriteLine("Before read ");
|
||
// // Byte[] receivedBytes = udpClient.Receive(ref remoteIpEndPoint);
|
||
// // SafeMobileLib.Utils.WriteLine("After read ");
|
||
// // char[] separator = { '.' };
|
||
// // string[] su = remoteIpEndPoint.Address.ToString().Split(separator);
|
||
// // uint radioID = (Convert.ToUInt32(su[1])) * 256 * 256 + (Convert.ToUInt32(su[2])) * 256 + Convert.ToUInt32(su[3]);
|
||
// // string suid = radioID.ToString();
|
||
|
||
// // SafeMobileLib.Utils.WriteLine("TEST TALLYSMAN Thread received data from radio " + radioID);
|
||
// // //Utils.printBytesArray(receivedBytes);
|
||
|
||
// // Thread.Sleep(100);
|
||
// //}
|
||
// //catch (Exception ex)
|
||
// //{
|
||
// // SafeMobileLib.Utils.WriteLine("Exception: "+ex.ToString());
|
||
// //}
|
||
//}
|
||
#endregion
|
||
}
|
||
|
||
void udp_OnNewDataReceived(byte[] data, int dataLen)
|
||
{
|
||
try
|
||
{
|
||
string str = System.Text.Encoding.ASCII.GetString(data, 0, dataLen);
|
||
String[] tempArray = str.Trim().Split('#');
|
||
if (tempArray.Length > 3)
|
||
{
|
||
if (tempArray[3].Equals("154"))
|
||
{
|
||
Int64 gwid_recv = Convert.ToInt64((tempArray[4].Split('.'))[0]);
|
||
if (gwid_recv == Main.GWID)
|
||
{
|
||
|
||
SafeMobileLib.Utils.WriteLine("Poll request received from multicast bus: " + str.Trim());
|
||
string SUID = (tempArray[4].Split('.'))[2];
|
||
SendPollRequest(SUID);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SafeMobileLib.Utils.WriteLine(ex.ToString());
|
||
}
|
||
}
|
||
|
||
public void SendPollRequest(string suid)
|
||
{
|
||
try
|
||
{
|
||
long radioID = (long)Convert.ToDouble(suid);
|
||
#region prepare payload
|
||
//ping Tallysman
|
||
//copied from Sprite 3.5
|
||
//3.5 Immediate Request (0x01)
|
||
Byte[] sendBytes = { 0xFA, 0x08, 0x04, 0x01, 0x4D, 0xB1, 0x04 };
|
||
#endregion
|
||
sendTallysmanCommand(sendBytes, radioID);
|
||
}
|
||
catch
|
||
{
|
||
|
||
}
|
||
}
|
||
public void sendTallysmanCommand(String ID, String _gpio, String _type, int transactionID)
|
||
{
|
||
}
|
||
|
||
List<TallysmanLostLog> logIDS = null;
|
||
private void Check4MissingIds(Object state)
|
||
{
|
||
logIDS = vehiclesManager.getGetTallysmanLogs(Main.TallysmanRequestInterval);
|
||
//3.8 Log Retrieval Request (0x04)
|
||
RequestTallysmanLogsOneByOne(GetTallysmanMissingLogIDLastDay(logIDS));
|
||
}
|
||
|
||
public List<TallysmanLostLog> GetTallysmanMissingLogIDLastDay(List<TallysmanLostLog> LogIds)
|
||
{
|
||
//List<TallysmanLostLog> LogIds = new List<TallysmanLostLog>();
|
||
//LogIds.Add(new TallysmanLostLog { RadioID = 70, LogId = 13665 });
|
||
//LogIds.Add(new TallysmanLostLog { RadioID = 70, LogId = 13681 });
|
||
//LogIds.Add(new TallysmanLostLog { RadioID = 70, LogId = 13685 });
|
||
//LogIds.Add(new TallysmanLostLog { RadioID = 70, LogId = 13695 });
|
||
//LogIds.Add(new TallysmanLostLog { RadioID = 70, LogId = 13895 });
|
||
List<TallysmanLostLog> MissingLogID = new List<TallysmanLostLog>();
|
||
|
||
var RadioList = LogIds.Select(t => t.RadioID).Distinct().ToList();
|
||
foreach (var RadioID in RadioList)
|
||
{
|
||
var terminalList = LogIds.Where(t => t.RadioID == RadioID).Select(t => t.LogId).ToList();
|
||
|
||
|
||
for (Int64 i = terminalList.Min(); i < terminalList.Max(); i++)
|
||
{
|
||
if (!terminalList.Contains(i))
|
||
//logid's to be send
|
||
MissingLogID.Add(new TallysmanLostLog { RadioID = RadioID, LogId = i });
|
||
}
|
||
//send result to radio id current tagList
|
||
if (MissingLogID.Count > 0)
|
||
{
|
||
//
|
||
}
|
||
}
|
||
return MissingLogID;
|
||
}
|
||
|
||
public string GetTallysmanUintvarEncoding(int number)
|
||
{
|
||
string ret = "";
|
||
bool firstByte = true;
|
||
string result = string.Empty;
|
||
int i = 0, j = 0;
|
||
var temp = Convert.ToString(number, 2);
|
||
i = temp.Length - 1;
|
||
do
|
||
{
|
||
result += temp.Substring(i, 1);
|
||
i--;
|
||
j++;
|
||
if (j % 7 == 0)
|
||
{
|
||
result += (firstByte) ? "0" : "1";
|
||
firstByte = false;
|
||
}
|
||
}
|
||
while (i >= 0);
|
||
//complete final byte
|
||
int nrOfBytes = result.Length / 8;
|
||
if (nrOfBytes > 0)
|
||
{
|
||
if ((result.Length % 8) > 0)
|
||
{
|
||
nrOfBytes++;
|
||
for (int k = result.Length; k < 8 * nrOfBytes - 1; k++)
|
||
result += "0";
|
||
result += "1";
|
||
}
|
||
}
|
||
//reverse string
|
||
char[] charArray = result.ToCharArray();
|
||
Array.Reverse(charArray);
|
||
int uintvar = (int)(Convert.ToInt32(new string(charArray), 2));
|
||
ret = uintvar.ToString("X2");
|
||
return ret;
|
||
}
|
||
|
||
public void RequestTallysmanLogsOneByOne(List<TallysmanLostLog> missing)
|
||
{
|
||
var RadioList = missing.Select(t => t.RadioID).Distinct().ToList();
|
||
foreach (var radioID in RadioList)
|
||
{
|
||
string UintvarLogId = "";
|
||
List<byte> byteArray = new List<byte>();
|
||
string chunk = "";
|
||
var terminalList = missing.Where(t => t.RadioID == radioID).Select(t => t.LogId).ToList();
|
||
foreach (var item in terminalList)
|
||
{
|
||
UintvarLogId = GetTallysmanUintvarEncoding((int)item);
|
||
|
||
#region prepare payload
|
||
List<byte> sendByteArray = new List<byte>();
|
||
#region Message Header
|
||
sendByteArray.Add((byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)));//protocol
|
||
sendByteArray.Add((byte)(Int32.Parse("08", System.Globalization.NumberStyles.HexNumber)));//version
|
||
#endregion
|
||
#region Message Length
|
||
int messageTypeLength = 1; // 0x04
|
||
int transactionIdLength = 1; // 0x11
|
||
int reportFormLength = 3; // 0xFF 0xFF 0x1D
|
||
int searchFormLength = 1; // 0x10
|
||
int maxResultLength = 1; //0x01
|
||
int messageLength = messageTypeLength + transactionIdLength + reportFormLength +
|
||
searchFormLength + maxResultLength + UintvarLogId.Length / 2;
|
||
string uintvarMessageLenght = GetTallysmanUintvarEncoding(messageLength);
|
||
foreach (char c in uintvarMessageLenght)
|
||
{
|
||
chunk += c;
|
||
if (chunk.Length == 2)
|
||
{
|
||
sendByteArray.Add((byte)(Int32.Parse(chunk, System.Globalization.NumberStyles.HexNumber)));
|
||
chunk = "";
|
||
}
|
||
}
|
||
#endregion
|
||
#region Message Static elements
|
||
sendByteArray.Add((byte)(Int32.Parse("04", System.Globalization.NumberStyles.HexNumber)));//message type
|
||
sendByteArray.Add((byte)(Int32.Parse("11", System.Globalization.NumberStyles.HexNumber)));//transaction id
|
||
//3 bytes for report form request all
|
||
sendByteArray.Add((byte)(Int32.Parse("FF", System.Globalization.NumberStyles.HexNumber)));//report form
|
||
sendByteArray.Add((byte)(Int32.Parse("FF", System.Globalization.NumberStyles.HexNumber)));//report form
|
||
sendByteArray.Add((byte)(Int32.Parse("1D", System.Globalization.NumberStyles.HexNumber)));//report form
|
||
//END
|
||
//search form by logid Indicates that the search includes Search Fields S4 (Log ID) and S5 (Max Result)
|
||
sendByteArray.Add((byte)(Int32.Parse("30", System.Globalization.NumberStyles.HexNumber)));
|
||
|
||
#endregion
|
||
#region Parse LogId Add to byte array
|
||
foreach (char c in UintvarLogId)
|
||
{
|
||
chunk += c;
|
||
if (chunk.Length == 2)
|
||
{
|
||
sendByteArray.Add((byte)(Int32.Parse(chunk, System.Globalization.NumberStyles.HexNumber)));
|
||
chunk = "";
|
||
}
|
||
}
|
||
#endregion
|
||
#region Max Result
|
||
sendByteArray.Add((byte)(Int32.Parse("01", System.Globalization.NumberStyles.HexNumber))); //Max Result = 1
|
||
#endregion
|
||
Byte[] sendBytes = sendByteArray.ToArray();
|
||
//send bytearray to radio id
|
||
SafeMobileLib.Utils.WriteLine($"Send request to Tallysman radio id: {radioID}, log id: {item}", ConsoleColor.DarkMagenta);
|
||
#endregion
|
||
sendTallysmanCommand(sendBytes, radioID);
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
public void sendTallysmanCommand(Byte[] sendBytes, long radioID)
|
||
{
|
||
udpClient.Client.SendTo(sendBytes, new IPEndPoint(IPAddress.Parse(Utils.ID2IP("12", radioID.ToString())), Port));
|
||
Thread.Sleep(1000);
|
||
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
||
|
||
try
|
||
{
|
||
#region send request
|
||
// Blocks until a message returns on this socket from a remote host.
|
||
//SafeMobileLib.Utils.WriteLine("Before read ");
|
||
Byte[] receivedBytes = udpClient.Receive(ref remoteIpEndPoint);
|
||
//SafeMobileLib.Utils.WriteLine("After read ");
|
||
char[] separator = { '.' };
|
||
string[] su = remoteIpEndPoint.Address.ToString().Split(separator);
|
||
uint radioID1 = (Convert.ToUInt32(su[1])) * 256 * 256 + (Convert.ToUInt32(su[2])) * 256 + Convert.ToUInt32(su[3]);
|
||
string suid = radioID.ToString();
|
||
#endregion
|
||
#region process response
|
||
//SafeMobileLib.Utils.WriteLine("TEST TALLYSMAN Thread received data from radio " + radioID1);
|
||
//Utils.printBytesArray(receivedBytes);
|
||
Byte toreturn = TallysmanReceiveThread.ProcessPacket2(receivedBytes, receivedBytes.Length, radioID.ToString().Trim());
|
||
|
||
//put information on message bus
|
||
//string sequenceID = "";
|
||
//Byte[] toSendMulticast = Utils.createMulticastMessage(233, suid, receivedBytes, out sequenceID);
|
||
//udpMulticastBusConnection.Send(toSendMulticast, toSendMulticast.Length);
|
||
SafeMobileLib.Utils.WriteLine("TallysmanReceiveThread successfully sent data to message bus");
|
||
Thread.Sleep(100);
|
||
#endregion
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
SafeMobileLib.Utils.WriteLine("Exception: " + ex.ToString());
|
||
}
|
||
}
|
||
public void RequestTallysmanLogsBundle(List<TallysmanLostLog> missing)
|
||
{
|
||
var RadioList = missing.Select(t => t.RadioID).Distinct().ToList();
|
||
foreach (var radioID in RadioList)
|
||
{
|
||
string UintvarLogIdBundle = "";
|
||
List<byte> byteArray = new List<byte>();
|
||
string chunk = "";
|
||
var terminalList = missing.Where(t => t.RadioID == radioID).Select(t => t.LogId).ToList();
|
||
foreach (var item in terminalList)
|
||
{
|
||
UintvarLogIdBundle += GetTallysmanUintvarEncoding((int)item);
|
||
}
|
||
//prepare bundle message
|
||
#region send request to tallysman one by one
|
||
List<byte> sendByteArray = new List<byte>();
|
||
#region Message Header
|
||
sendByteArray.Add((byte)(Int32.Parse("FA", System.Globalization.NumberStyles.HexNumber)));//protocol
|
||
sendByteArray.Add((byte)(Int32.Parse("08", System.Globalization.NumberStyles.HexNumber)));//version
|
||
#endregion
|
||
#region Message Length
|
||
int messageTypeLength = 1; // 0x04
|
||
int transactionIdLength = 1; // 0x11
|
||
int reportFormLength = 3; // 0xFF 0xFF 0x1D
|
||
int searchFormLength = 2; // 0x84 0x00 Indicates that the search includes Search Fields S10
|
||
int nrOfLogIDs = terminalList.Count;
|
||
string uintvarNrOfLogIDs = GetTallysmanUintvarEncoding(nrOfLogIDs);
|
||
int messageLength = messageTypeLength + transactionIdLength + reportFormLength + searchFormLength + UintvarLogIdBundle.Length / 2 + uintvarNrOfLogIDs.Length / 2;
|
||
|
||
string uintvarMessageLenght = GetTallysmanUintvarEncoding(messageLength);
|
||
foreach (char c in uintvarMessageLenght)
|
||
{
|
||
chunk += c;
|
||
if (chunk.Length == 2)
|
||
{
|
||
sendByteArray.Add((byte)(Int32.Parse(chunk, System.Globalization.NumberStyles.HexNumber)));
|
||
chunk = "";
|
||
}
|
||
}
|
||
#endregion
|
||
#region Message Static elements
|
||
sendByteArray.Add((byte)(Int32.Parse("04", System.Globalization.NumberStyles.HexNumber)));//message type
|
||
sendByteArray.Add((byte)(Int32.Parse("11", System.Globalization.NumberStyles.HexNumber)));//transaction id
|
||
//3 bytes for report form request all
|
||
sendByteArray.Add((byte)(Int32.Parse("FF", System.Globalization.NumberStyles.HexNumber)));//report form
|
||
sendByteArray.Add((byte)(Int32.Parse("FF", System.Globalization.NumberStyles.HexNumber)));//report form
|
||
sendByteArray.Add((byte)(Int32.Parse("1D", System.Globalization.NumberStyles.HexNumber)));//report form
|
||
//END
|
||
sendByteArray.Add((byte)(Int32.Parse("80", System.Globalization.NumberStyles.HexNumber)));//search form by logid
|
||
sendByteArray.Add((byte)(Int32.Parse("08", System.Globalization.NumberStyles.HexNumber)));//Indicates that the search includes Search Fields S10
|
||
|
||
#endregion
|
||
#region Parse uintvarNrOfLogIDs
|
||
foreach (char c in uintvarNrOfLogIDs)
|
||
{
|
||
chunk += c;
|
||
if (chunk.Length == 2)
|
||
{
|
||
sendByteArray.Add((byte)(Int32.Parse(chunk, System.Globalization.NumberStyles.HexNumber)));
|
||
chunk = "";
|
||
}
|
||
}
|
||
#endregion
|
||
#region Parse LogId Add to byte array
|
||
foreach (char c in UintvarLogIdBundle)
|
||
{
|
||
chunk += c;
|
||
if (chunk.Length == 2)
|
||
{
|
||
sendByteArray.Add((byte)(Int32.Parse(chunk, System.Globalization.NumberStyles.HexNumber)));
|
||
chunk = "";
|
||
}
|
||
}
|
||
#endregion
|
||
Byte[] sendBytes = sendByteArray.ToArray();
|
||
//send bytearray to radio id
|
||
SafeMobileLib.Utils.WriteLine($"Send bundle request to Tallysman radio id: {radioID}", ConsoleColor.DarkMagenta);
|
||
udpClient.Client.SendTo(sendBytes, new IPEndPoint(IPAddress.Parse(Utils.ID2IP("12", radioID.ToString())), Port));
|
||
#endregion
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|