2013-04-05 2 views
3

Я использую Unity, чтобы визуализировать симуляцию, где данные от моделирования отправляются на него через UDP-пакеты от Simulink. Проблема, с которой я столкнулся, связана со скоростью, с которой Simulink отправляет UDP-пакеты и скорость, с которой мой скрипт в Unity пытается получить данные от клиента UDP.Получите последний пакет UDP в C#

Для моего единства сценарий, я создаю поток, который выполняет простую функцию с помощью цикла в то время и спит на такое же количество времени, которое требуется для клиента тайм-аут (который произвольно установленным мной):

public void Start() { 
    // Setup listener. 
    this.mSenderAddress = IPAddress.Parse("127.0.0.1"); 
    this.mSender = new IPEndPoint(this.mSenderAddress, 30001); 

    // Setup background UDP listener thread. 
    this.mReceiveThread = new Thread(new ThreadStart(ReceiveData)); 
    this.mReceiveThread.IsBackground = true; 
    this.mReceiveThread.Start(); 
} 

// Function to receive UDP data. 
private void ReceiveData() { 
    try { 
     // Setup UDP client. 
     this.mClient = new UdpClient(30001); 
     this.mClient.Client.ReceiveTimeout = 250; 

     // While thread is still alive. 
     while(Thread.CurrentThread.IsAlive) { 
      try { 
       // Grab the data. 
       byte[] data = this.mClient.Receive(ref this.mSender); 

       // Convert the data from bytes to doubles. 
       double[] convertedData = new double[data.Length/8]; 
       for(int ii = 0; ii < convertedData.Length; ii++) 
        convertedData[ii] = BitConverter.ToDouble(data, 8 * ii); 

       // DO WHATEVER WITH THE DATA 

       // Sleep the thread. 
       Thread.Sleep(this.mClient.Client.ReceiveTimeout); 
      } catch(SocketException e) { 
       continue; 
      } 
     } 
    } catch(Exception e) { 
     Debug.Log(e.ToString()); 
    } 
} 

Здесь, если время ожидания/сна больше, чем разница во времени, что Simulink отправляет UDP-пакет, моя визуализация будет отставать от моделирования, потому что она будет считывать следующий пакет, который был отправлен, а не последний пакет, который был отправлен. Это касается пакетов как очереди.

Есть ли хоть какие-то данные от Последние Полученный пакет? Я знаю, что есть по крайней мере один путь вокруг этого, потому что, если я использую Rate Transfer Block, установленный на равное или большее время выборки в качестве тайм-аута UdpClient, он будет работать; но я хотел бы сделать его более надежным, чем это.

Поскольку мои пакеты содержат полную информацию о состоянии моего моделирования (положение, ориентация, время и т. Д.), Не имеет значения, если я никогда не использую данные из промежуточных пакетов; до тех пор, пока я получаю самые последние данные, которые были бы из последнего пакета.

+0

Я не понимаю, зачем вам нужен тайм-аут. Почему бы просто не получить все данные, которые отправляет Simulink до тех пор, пока не будет отправлен отправитель? –

+0

Возможно, я не понимаю функцию приема. Будет ли он содержать не только данные из одного пакета UDP? – celestialorb

+1

Функция приема извлекает весь поток данных, а не только один или несколько пакетов. Но так как потенциальный размер всего приема может быть очень большим, каждый вызов receive() выбирает только ограниченный объем данных, определенных размером буфера. Поэтому вам нужно продолжать вызов функции receive(), пока данные, оставшиеся в буфере, не будут равны нулю. –

ответ

0

UDP является ненадежным и пакеты не гарантируются при получении в том же порядке, в котором они отправлены. Мое предложение - использовать TCP или поместить некоторый порядковый номер в заголовки пакетов и продолжать читать UDP-пакеты и выбирать только самые новые пакеты.

Смежные вопросы