public TemsInfoHeader(byte sequenceNo, TemsInfoMessageType type, uint messageLength) { startMarker = START_MARKER; this.sequenceNo = sequenceNo; messageType = type; this.messageLength = messageLength; }
private MessageInfo(TemsInfoMessageType type) { Timestamp = DateTime.Now; MessageType = type; }
private void SendMessage(TemsInfoMessageType type, object message) { byte[] content = ByteArrayHelper.GetByteArray(message); SendMessage(type, content); }
/// <summary> /// Sends given message handling the sequence number. /// </summary> /// <param name="type">Type of the message.</param> /// <param name="message">Message payload.</param> /// <returns><c>True</c> if the message was sent successfully, otherwise <c>False</c>.</returns> private bool SendMessage(TemsInfoMessageType type, byte[] message) { bool result; if (sequenceNo < byte.MaxValue) { sequenceNo += 1; } else { sequenceNo = byte.MinValue; } if (State != ConnectionState.Error) { try { Socket localSocket = this.socket; if (localSocket != null && localSocket.Connected) { LogDebug("Sending message ({0}) ...", type); byte[] header = ByteArrayHelper.GetByteArray(new TemsInfoHeader(sequenceNo, type, (uint)message.Length)); byte[] composed = new byte[header.Length + message.Length]; header.CopyTo(composed, 0); message.CopyTo(composed, header.Length); localSocket.Send(composed); LogDebug("... message sent"); result = true; } else if (localSocket == null) { ChangeState(ConnectionState.Error, "Failed sending message: Socket is NULL!"); result = false; } else { ChangeState(ConnectionState.Error, "Failed sending message: Socket is not connected!"); result = false; } } catch (Exception e) { ChangeState(ConnectionState.Error, "Failed sending message: {0}{1}{2}", e.Message, Environment.NewLine, e); result = false; } } else { result = false; } if (!result) { if (sequenceNo > byte.MinValue) { sequenceNo -= 1; } else { sequenceNo = byte.MaxValue; } } return(result); }
private void HandleReceivedMessage(TemsInfoMessageType type, byte[] content) { AbstractMessage message = null; switch (type) { case TemsInfoMessageType.Information: message = new InformationMessage(content); if (State == ConnectionState.Initializing) { // Server accepted the client // => Send interface configuration SendConfigurationMessage(Configuration); // => We're online ChangeState(ConnectionState.Ok); } break; case TemsInfoMessageType.Error: ErrorMessage msgError = new ErrorMessage(content); if (!string.IsNullOrEmpty(msgError.Message)) { ChangeState(ConnectionState.Error, "Received error message with type \"{0}\": {1}", msgError.Code, msgError.Message); } else { ChangeState(ConnectionState.Error, "Received error message with type \"{0}\"!", msgError.Code); } message = msgError; break; case TemsInfoMessageType.Heartbeat: message = new HeartbeatMessage(content); break; case TemsInfoMessageType.Vehicle: message = new VehicleMessage(content); break; case TemsInfoMessageType.ObjectStart: message = new ObjectStartMessage(content); break; case TemsInfoMessageType.ObjectStop: message = new ObjectStopMessage(content); break; case TemsInfoMessageType.ObjectLocation: message = new ObjectLocationMessage(content); break; case TemsInfoMessageType.Status: message = new StatusMessage(content); break; case TemsInfoMessageType.Data: message = new DataMessage(content); break; case TemsInfoMessageType.Value: message = new ValueMessage(content); break; default: Log("Received unexpected message of type \"{0}\" => Ignoring!", type); break; } if (message != null) { OnMessageReceived?.Invoke(message); } }