using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using SafeMobileLib; using System.Threading; using MotoTRBO_GW; namespace MotoTrbo_GW { class SMSThread { public UInt16 port; private byte[] data = new byte[1024]; private UdpMulticast udpMulticast; private static UdpClient udpClient; private String mIP; private Int32 mPort; public SMSThread(UInt16 smsPort, String multicastID, String multicastPort) { port = smsPort; mIP = multicastID; mPort = Int32.Parse(multicastPort); } public void handleConnection() { Console.WriteLine("SMS Thread - Initialized on port " + port); udpClient = null; try { IPEndPoint ie; ie = new IPEndPoint(IPAddress.Any, port); udpClient = new UdpClient(ie); } catch (Exception ex) { Console.WriteLine("SMS Thread handleConnection exception: " + ex.ToString()); } try { udpMulticast = new UdpMulticast(mIP, mPort); Console.WriteLine("SMS thread successfully registered to multicast group"); } catch (Exception ex) { Console.WriteLine("SMS Thread exception while joining the multicast group: " + ex.ToString()); } IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); while (true) { // Blocks until a message returns on this socket from a remote host. 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(); Console.Write("SMS Thread received data from radio " + radioID + ": "); Utils.printBytesArray(receivedBytes); header_T hret = DecodePacket(receivedBytes); if (hret.ack) { Thread.Sleep(1000); // The client needs an ACK Byte[] sendBytes = new Byte[5]; sendBytes[0] = 0x00; // len (2B) sendBytes[1] = 0x03; sendBytes[2] = 0xBF; // first header (req) sendBytes[3] = 0x00; // addr len sendBytes[4] = hret.seq_no; // 2nd header (opt) Console.WriteLine("SMS thread ACK sent: " + Utils.Byte2String(sendBytes, 0, sendBytes[1] + 2)); udpClient.Send(sendBytes, sendBytes[1] + 2, remoteIpEndPoint); } //put information on message bus Byte[] toSendMulticast = Utils.createMulticastMessage(132, suid, receivedBytes); udpMulticast.Send(toSendMulticast, toSendMulticast.Length); Console.WriteLine("SMS thread sent data to message bus"); Thread.Sleep(1000); } } header_T DecodePacket(Byte[] data) { header_T hret = new header_T(); int i, j, pdata; pdata = (int)data[0]; pdata <<= 8; pdata |= (int)data[1]; // parse header int header = data[2]; hret.header = data[2]; if ((header & 0x80) != 0) hret.ext = true; else hret.ext = false; if ((header & 0x40) != 0) hret.ack = true; else hret.ack = false; if ((header & 0x10) != 0) hret.cntl = true; else hret.cntl = false; // txt message hret.pdu_type = (byte)(header & 0x0f); // parse address int addrsize = data[3]; i = 4; //Console.Write("Address: "); for (j = 0; j < addrsize; j++) { //Console.Write(data[i + j].ToString("X")); } i += j; // parse rest of headers if (hret.ext) { byte h2 = data[i]; if ((h2 & 0x80) != 0) hret.ext2 = true; else hret.ext2 = false; hret.seq_no = (byte)(h2 & 0x1F); i++; if (hret.ext2) { // parse third header hret.encoding = (byte)(data[i] & 0x0f); i++; } } int crc = 0; if ((!hret.cntl) && (hret.pdu_type == 0)) { // the rest is the txt message Char[] cs = new Char[100]; int k; for (j = i, k = 0; j < pdata + 2; j++) { //Console.Write(" 0x" + data[j].ToString("X")); if (data[j] != 0) { cs[k++] = (Char)data[j]; crc |= (Char)data[j]; } } Console.WriteLine(); // save message in inbox ht string s = new string(cs, 0, k); s.Replace("\r\n", ""); s = s.Replace(System.Environment.NewLine, string.Empty); Console.WriteLine("Message [" + s + "]"); } return hret; } } }