internal TraCIResult[] SendMessage(TraCICommand command) { if (!_client.Connected) { return(null); } var msg = TraCIDataConverter.GetMessageBytes(command); _client.Client.Send(msg); try { var bytesRead = _stream.Read(_receiveBuffer, 0, 32768); if (bytesRead < 0) { // Read returns 0 if the client closes the connection throw new IOException(); } var response = _receiveBuffer.Take(bytesRead).ToArray(); #if NLOG _logger.Trace(" << {0}", BitConverter.ToString(response)); #endif var trresponse = TraCIDataConverter.HandleResponse(response); return(trresponse?.Length > 0 ? trresponse : null); } catch { return(null); // TODO } }
// deprecated: below method only works with an outdated patched version of SUMO //public void SetSingleTrafficLightState(string trafficLightId, string signalgroup, char singlestate) //{ // var command = new TraCICommand { Identifier = TraCIConstants.CMD_SET_TL_VARIABLE }; // var bytes = new List<byte> { TraCIConstants.TL_RED_YELLOW_GREEN_SINGLESTATE }; // bytes.AddRange(TraCIDataConverter.GetTraCIBytesFromASCIIString(trafficLightId)); // bytes.Add(TraCIConstants.TYPE_STRING); // bytes.AddRange(BitConverter.GetBytes((signalgroup + ' ' + singlestate).Length).Reverse()); // bytes.AddRange(Encoding.ASCII.GetBytes(signalgroup + ' ' + singlestate)); // // command.Contents = bytes.ToArray(); // // ReSharper disable once UnusedVariable // var response = SendMessage(command); //} #endregion // Set Variable Methods #region Public Methods internal TraCIResult[] SendMessage(TraCICommand command) { if (!_client.Connected) { return(null); } var msg = TraCIDataConverter.GetMessageBytes(command); _client.Client.Send(msg); try { var bytesRead = _stream.Read(_receiveBuffer, 0, 32768); if (bytesRead < 0) { // Read returns 0 if the client closes the connection throw new IOException(); } var revLength = _receiveBuffer.Take(4).Reverse().ToArray(); var totlength = BitConverter.ToInt32(revLength, 0); var response = new List <byte>(); response.AddRange(_receiveBuffer.Take(bytesRead).ToArray()); if (bytesRead != totlength) { while (bytesRead < totlength) { var innerBytesRead = _stream.Read(_receiveBuffer, 0, 32768); response.AddRange(_receiveBuffer.Take(innerBytesRead).ToArray()); bytesRead += innerBytesRead; } } //var response = _receiveBuffer.Take(bytesRead).ToArray(); var trresponse = TraCIDataConverter.HandleResponse(response.ToArray()); return(trresponse?.Length > 0 ? trresponse : null); } catch { return(null); // TODO } }