//main wotk method private void WorkingThread() { try { _listener = new TcpListener(IPAddress.Any, Port); _listener.Start(); //Listener started - now in WaitingDwg state State = DwgSmsServerState.WaitingDwg; _listenSocket = _listener.AcceptSocket(); //Dwg just connected with socket. Now starting to exchange packets State = DwgSmsServerState.Connecting; while (true) { byte[] buffer = new byte[_listenSocket.ReceiveBufferSize]; int size = _listenSocket.Receive(buffer); DwgMessage msg = new DwgMessage(buffer); Console.WriteLine(msg); if (msg.Header.Type == DwgMessageType.AuthenticationRequest) { AuthenticationRequestBody body = msg.Body as AuthenticationRequestBody; if (body.User == User) { if (body.Password == Password) { _macAddress = msg.Header.Mac; SendToDwg(new AuthenticationResponseBody(DwgMessageResult.Succeed)); } else { Error(string.Format("Wrong password. Expected: {0}; Recieved: {1}", Password, body.Password)); Stop(); } } else { Error(string.Format("Wrong user. Expected: {0}; Recieved: {1}", User, body.User)); Stop(); } } if (msg.Header.Type == DwgMessageType.StatusRequest) { SendToDwg(new StatusResponseBody(DwgMessageResult.Succeed)); StatusRequestBody body = msg.Body as StatusRequestBody; PortsCount = body.PortsCount; PortsStatuses = new ReadOnlyCollection <DwgPortStatus>(body.PortsStatuses); } if (msg.Header.Type == DwgMessageType.CsqRssiRequest) { SendToDwg(new CsqRssiResponseBody(DwgMessageResult.Succeed)); //if this is first csq rssi message - then from this moment we connected if (State == DwgSmsServerState.Connecting) { State = DwgSmsServerState.Connected; } } if (msg.Header.Type == DwgMessageType.SendSmsResponse) { SendSmsResponseBody body = msg.Body as SendSmsResponseBody; _sendSmsResult = body.Result; //signal to SendSms method, that response recieved _sendSmsEvent.Set(); } if (msg.Header.Type == DwgMessageType.SendSmsResultRequest) { SendToDwg(new SendSmsResultResponseBody(DwgMessageResult.Succeed)); SendSmsResultRequestBody body = msg.Body as SendSmsResultRequestBody; SmsSendingResult(body.Port, body.Number, body.Result, body.CountOfSlices, body.SucceededSlices); } if (msg.Header.Type == DwgMessageType.SendUssdResponse) { SendUssdResponseBody body = msg.Body as SendUssdResponseBody; _sendUssdResult = body.Result; //signal to SendUssd method, that response recieved _sendUssdEvent.Set(); } if (msg.Header.Type == DwgMessageType.ReceiveUssdMessageRequest) { SendToDwg(new ReceiveUssdMessageResponseBody(DwgMessageResult.Succeed)); ReceiveUssdMessageRequestBody body = msg.Body as ReceiveUssdMessageRequestBody; UssdSendingResult(body.Port, body.Status, body.Content); } if (msg.Header.Type == DwgMessageType.ReceiveSmsMessageRequest) { SendToDwg(new ReceiveSmsMessageResponseBody(DwgMessageResult.Succeed)); ReceiveSmsMessageRequestBody body = msg.Body as ReceiveSmsMessageRequestBody; SmsReceieved(body.Port, body.DateTime, body.Number, body.Content); } if (msg.Header.Type == DwgMessageType.ReceiveSmsReceiptRequest) { SendToDwg(new ReceiveSmsReceiptResponseBody(DwgMessageResult.Succeed)); ReceiveSmsReceiptRequestBody body = msg.Body as ReceiveSmsReceiptRequestBody; SmsReceipt(body.Port, body.DateTime, body.Number, body.ReceiptId, body.State); } if (msg.Header.Type == DwgMessageType.KeepAlive) { SendToDwg(new KeepAliveBody()); } } } catch (ThreadAbortException) { _listenSocket.Close(); _listener.Stop(); } }
public SendSmsResponseBody(byte[] bytes) { Result = (DwgSendSmsResult)bytes[0]; }