public void ProcessMessages() { UInt16 sendCRC = 0; DateTime date; int year = 0; int month = 0; int day = 0; int hour = 0; int minute = 0; int second = 0; KeyValuePair <List <byte>, StateObject> byteState; KeyValuePair <UNPACK_STATUS, byte[]> status; byte[] receiveMessage = null; StateObject state = null; byte[] serialNumber = null; PROTOCOL_NUMBER protocolNumber = PROTOCOL_NUMBER.NONE; try { Boolean firstMessage = true; acceptDone.Set(); //loop forever while (true) { allDone.WaitOne(); //read fifo until empty while (true) { //read one connection until buffer doesn't contain any more packets byteState = ReadWrite(PROCESS_STATE.PROCESS, null, null, -1); if (byteState.Value.fifoCount == -1) { break; } state = byteState.Value; while (true) { status = Unpack(byteState); if (status.Key == UNPACK_STATUS.NOT_ENOUGH_BYTES) { break; } if (status.Key == UNPACK_STATUS.ERROR) { Console.WriteLine("Error : Bad Receive Message, Data"); break; } //message is 2 start bytes + 1 byte (message length) + 1 byte message length + 2 end bytes receiveMessage = status.Value; int messageLength = receiveMessage[2]; Console.WriteLine("Status : '{0}', Receive Message : '{1}'", status.Key == UNPACK_STATUS.GOOD_MESSAGE ? "Good" : "Bad", BytesToString(receiveMessage.Take(messageLength + 5).ToArray())); if (status.Key != UNPACK_STATUS.GOOD_MESSAGE) { break; } else { if (firstMessage) { if (receiveMessage[3] != 0x01) { Console.WriteLine("Error : Expected Login Message : '{0}'", BytesToString(receiveMessage)); break; } firstMessage = false; } //skip start bytes, message length. then go back 4 bytes (CRC and serial number) serialNumber = receiveMessage.Skip(2 + 1 + messageLength - 4).Take(2).ToArray(); protocolNumber = (PROTOCOL_NUMBER)receiveMessage[3]; Console.WriteLine("Protocol Number : '{0}'", protocolNumber.ToString()); switch (protocolNumber) { case PROTOCOL_NUMBER.LOGIN_MESSAGE: serialNumber.CopyTo(loginResponse, 4); sendCRC = crc_bytes(loginResponse.Skip(2).Take(loginResponse.Length - 6).ToArray()); loginResponse[loginResponse.Length - 4] = (byte)((sendCRC >> 8) & 0xFF); loginResponse[loginResponse.Length - 3] = (byte)((sendCRC) & 0xFF); // string terminalID = Encoding.ASCII.GetString(receiveMessage.Skip(4).Take(messageLength - 5).ToArray()); Console.WriteLine("Received good login message from Serial Number : '{0}', Terminal ID = '{1}'", "0x" + serialNumber[0].ToString("X2") + serialNumber[1].ToString("X2"), terminalID); Console.WriteLine("Send Message : '{0}'", BytesToString(loginResponse)); Send(state.workSocket, loginResponse); StateObjectDB stateObjectDB = new StateObjectDB() { terminalID = terminalID, date = DateTime.Now }; WriteDBAsync.ReadWriteFifo(WriteDBAsync.Mode.WRITE, stateObjectDB); Console.WriteLine("Wrote to database"); break; case PROTOCOL_NUMBER.LOCATION_DATA: year = receiveMessage[4]; month = receiveMessage[5]; day = receiveMessage[6]; hour = receiveMessage[7]; minute = receiveMessage[8]; second = receiveMessage[9]; date = new DateTime(2000 + year, month, day, hour, minute, second); Console.WriteLine("Received good location message from Serial Number '{0}', Time = '{1}'", "0x" + serialNumber[0].ToString("X2") + serialNumber[1].ToString("X2"), date.ToLongDateString()); break; case PROTOCOL_NUMBER.ALARM_DATA: year = receiveMessage[4]; month = receiveMessage[5]; day = receiveMessage[6]; hour = receiveMessage[7]; minute = receiveMessage[8]; second = receiveMessage[9]; date = new DateTime(2000 + year, month, day, hour, minute, second); Console.WriteLine("Received good alarm message from Serial Number '{0}', Time = '{1}'", "0x" + serialNumber[0].ToString("X2") + serialNumber[1].ToString("X2"), date.ToLongDateString()); int packetLen = alarmResponse.Length - 5; alarmResponse[2] = (byte)(packetLen & 0xFF); serialNumber.CopyTo(alarmResponse, packetLen - 1); sendCRC = crc_bytes(alarmResponse.Skip(2).Take(packetLen - 1).ToArray()); alarmResponse[packetLen + 1] = (byte)((sendCRC >> 8) & 0xFF); alarmResponse[packetLen + 2] = (byte)((sendCRC) & 0xFF); Console.WriteLine("Send Message : '{0}'", BytesToString(alarmResponse)); Send(state.workSocket, alarmResponse); break; } //end switch } // End if } //end while } //end while fifo > 0 allDone.Reset(); } //end while true } catch (Exception e) { Console.WriteLine(e.Message); } }
public void ProcessMessages() { UInt16 sendCRC = 0; DateTime date; int year = 0; int month = 0; int day = 0; int hour = 0; int minute = 0; int second = 0; KeyValuePair <List <byte>, StateObject> byteState; KeyValuePair <UNPACK_STATUS, byte[]> status; byte[] receiveMessage = null; StateObject state = null; byte[] serialNumber = null; byte[] serverFlagBit = null; byte[] stringArray = null; string stringMessage = ""; byte lengthOfCommand = 0; PROTOCOL_NUMBER protocolNumber = PROTOCOL_NUMBER.NONE; try { Boolean firstMessage = true; acceptDone.Set(); //loop forever while (true) { allDone.WaitOne(); //read fifo until empty while (true) { //read one connection until buffer doesn't contain any more packets byteState = ReadWrite(PROCESS_STATE.PROCESS, null, null, -1); if (byteState.Value.fifoCount == -1) { break; } state = byteState.Value; while (true) { status = Unpack(byteState); if (status.Key == UNPACK_STATUS.NOT_ENOUGH_BYTES) { break; } if (status.Key == UNPACK_STATUS.ERROR) { Console.WriteLine("Error : Bad Receive Message, Data"); break; } //message is 2 start bytes + 1 byte (message length) + 1 byte message length + 2 end bytes receiveMessage = status.Value; int messageLength = receiveMessage[2]; Console.WriteLine("Status : '{0}', Receive Message : '{1}'", status.Key == UNPACK_STATUS.GOOD_MESSAGE ? "Good" : "Bad", BytesToString(receiveMessage.Take(messageLength + 5).ToArray())); if (status.Key != UNPACK_STATUS.GOOD_MESSAGE) { break; } else { if (firstMessage) { if (receiveMessage[3] != 0x01) { Console.WriteLine("Error : Expected Login Message : '{0}'", BytesToString(receiveMessage)); break; } firstMessage = false; } //skip start bytes, message length. then go back 4 bytes (CRC and serial number) serialNumber = receiveMessage.Skip(2 + 1 + messageLength - 4).Take(2).ToArray(); protocolNumber = (PROTOCOL_NUMBER)receiveMessage[3]; Console.WriteLine("Protocol Number : '{0}'", protocolNumber.ToString()); switch (protocolNumber) { case PROTOCOL_NUMBER.LOGIN_MESSAGE: break; } //end switch } // End if } //end while } //end while fifo > 0 allDone.Reset(); } //end while true } catch (Exception e) { Console.WriteLine(e.Message); } }
public void StartListening(string IP, int port, Boolean test) { // Establish the local endpoint for the socket. // The DNS name of the computer // running the listener is "host.contoso.com". IPHostEntry ipHostInfo = Dns.GetHostEntry(IP); //Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; //IPAddress local = IPAddress.Parse(IP); UInt16 sendCRC = 0; DateTime date; int year = 0; int month = 0; int day = 0; int hour = 0; int minute = 0; int second = 0; IPEndPoint localEndPoint = null; if (test) { localEndPoint = new IPEndPoint(IPAddress.Any, port); } else { localEndPoint = new IPEndPoint(ipAddress, port); } // Create a TCP/IP socket. Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and listen for incoming connections. try { allDone.Reset(); listener.Bind(localEndPoint); listener.Listen(100); //login code, wait for 1st message Console.WriteLine("Wait 5 seconds for login message"); listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); Boolean firstMessage = true; //loop forever while (true) { allDone.WaitOne(); //read fifo until empty while (fifo.Count > 0) { //read one connection until buffer doesn't contain any more packets KeyValuePair <List <byte>, StateObject> byteState = ReadWrite(-1, PROCESS_STATE.PROCESS, null, null); StateObject state = byteState.Value; while (true) { UNPACK_STATUS status = Unpack(byteState.Key); if (status == UNPACK_STATUS.NOT_ENOUGH_BYTES) { break; } //message is 2 start bytes + 1 byte (message length) + 1 byte message length + 2 end bytes byte[] receiveMessage = history.Last().Value.ToArray(); int messageLength = receiveMessage[2]; Console.WriteLine("Status : '{0}', Receive Message : '{1}'", status == UNPACK_STATUS.GOOD_MESSAGE ? "Good" : "Bad", BytesToString(receiveMessage.Take(messageLength + 5).ToArray())); if (status != UNPACK_STATUS.GOOD_MESSAGE) { Console.WriteLine("Error : Bad Login Message, Data : '{0}'", BytesToString(history.Last().Value.ToArray())); break; } else { if (firstMessage) { if (receiveMessage[3] != 0x01) { Console.WriteLine("Error : Expected Login Message : '{0}'", BytesToString(history.Last().Value.ToArray())); break; } firstMessage = false; } //skip start bytes, message length. then go back 4 bytes (CRC and serial number) byte[] serialNumber = receiveMessage.Skip(2 + 1 + messageLength - 4).Take(2).ToArray(); PROTOCOL_NUMBER protocolNumber = (PROTOCOL_NUMBER)receiveMessage[3]; switch (protocolNumber) { case PROTOCOL_NUMBER.LOGIN_MESSAGE: serialNumber.CopyTo(loginResponse, 4); sendCRC = crc_bytes(loginResponse.Skip(2).Take(loginResponse.Length - 6).ToArray()); loginResponse[loginResponse.Length - 4] = (byte)((sendCRC >> 8) & 0xFF); loginResponse[loginResponse.Length - 3] = (byte)((sendCRC) & 0xFF); string terminalID = Encoding.ASCII.GetString(receiveMessage.Skip(4).Take(messageLength - 5).ToArray()); Console.WriteLine("Received good login message from Serial Number : '{0}', Terminal ID = '{1}'", "0x" + serialNumber[0].ToString("X2") + serialNumber[1].ToString("X2"), terminalID); Console.WriteLine("Send Message : '{0}'", BytesToString(loginResponse)); Send(state.workSocket, loginResponse); break; case PROTOCOL_NUMBER.LOCATION_DATA: year = receiveMessage[4]; month = receiveMessage[5]; day = receiveMessage[6]; hour = receiveMessage[7]; minute = receiveMessage[8]; second = receiveMessage[9]; date = new DateTime(2000 + year, month, day, hour, minute, second); Console.WriteLine("Received good location message from Serial Number '{0}', Time = '{1}'", "0x" + serialNumber[0].ToString("X2") + serialNumber[1].ToString("X2"), date.ToLongDateString()); break; case PROTOCOL_NUMBER.ALARM_DATA: year = receiveMessage[4]; month = receiveMessage[5]; day = receiveMessage[6]; hour = receiveMessage[7]; minute = receiveMessage[8]; second = receiveMessage[9]; date = new DateTime(2000 + year, month, day, hour, minute, second); Console.WriteLine("Received good alarm message from Serial Number '{0}', Time = '{1}'", "0x" + serialNumber[0].ToString("X2") + serialNumber[1].ToString("X2"), date.ToLongDateString()); int packetLen = alarmResponse.Length - 5; alarmResponse[2] = (byte)(packetLen & 0xFF); serialNumber.CopyTo(alarmResponse, packetLen - 1); sendCRC = crc_bytes(alarmResponse.Skip(2).Take(packetLen - 1).ToArray()); alarmResponse[packetLen + 1] = (byte)((sendCRC >> 8) & 0xFF); alarmResponse[packetLen + 2] = (byte)((sendCRC) & 0xFF); Console.WriteLine("Send Message : '{0}'", BytesToString(alarmResponse)); Send(state.workSocket, alarmResponse); break; } //end switch } // End if } //end while } //end while fifo > 0 allDone.Reset(); } //end while true } catch (Exception e) { Console.WriteLine(e.Message); } }