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
            }
        }
Example #2
0
        // 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
            }
        }