exponenta event banner

dsp. UDPReceiver

Прием пакетов UDP из сети

Описание

dsp.UDPReceiver Система object™ принимает пакеты UDP по сети UDP с удаленного IP-адреса, указанного в свойстве RemoteIPAddress. Затем объект сохраняет данные во внутреннем буфере. Объем данных (количество элементов), принимаемых в каждом пакете UDP, может изменяться. Максимальное количество байтов, которое может получить объект без потери данных, задается свойством ReceiveBufferSize. Свойство MaximumStartLength указывает максимальное количество выборок, которое может содержать каждый пакет данных. LocalIPPort, на котором объект получает данные, настраивается в сгенерированном коде, но не настраивается во время моделирования. Пример см. в разделе Настройка номера порта UDP в MATLAB.

Для получения пакетов UDP из сети:

  1. Создать dsp.UDPReceiver и задайте его свойства.

  2. Вызовите объект с аргументами, как если бы это была функция.

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

пример

udpr = dsp.UDPReceiver возвращает объект приемника UDP, который принимает пакеты UDP от указанного порта.

пример

udpr = dsp.UDPReceiver(Name,Value) возвращает объект-получатель UDP с заданным значением каждого свойства. Заключите каждое имя свойства в отдельные кавычки.

Свойства

развернуть все

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.

Если свойство настраивается, его значение можно изменить в любое время.

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Порт для приема данных, указанный как скаляр в диапазоне [1, 65535]. Это свойство может быть настроено в сгенерированном коде, но не может быть настроено во время моделирования.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Адрес, из которого принимаются данные, указанный как символьный вектор или строковый скаляр, содержащий допустимый IP-адрес. Ввод определенного IP-адреса блокирует пакеты UDP с других адресов. Значение по умолчанию, '0.0.0.0', указывает, что данные могут быть приняты с любого удаленного IP-адреса.

Типы данных: char

Размер внутреннего буфера, принимающего пакеты UDP, указанный в байтах как скаляр в диапазоне [1, 67108864]. Если количество полученных байтов превышает это значение, переполнение буфера и содержимое усекаются.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Максимальная длина выходного сообщения, заданного в выборках как положительный скаляр в диапазоне [1, 65507]. Установите для этого свойства значение, равное или большее размера данных пакета UDP. При получении большего количества выборок, чем указано в этом свойстве, избыточные данные усекаются.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Тип данных векторных элементов в выводе сообщения, указанный как встроенный тип данных MATLAB ®.

Сопоставьте тип данных с вводом данных, используемым для создания пакетов UDP.

Типы данных: char

Сложность сообщения, указанная как true или false.

Установить для этого свойства значение true если принятое сообщение является сложным. Задайте свойству значение false если полученное сообщение является реальным.

Типы данных: logical

Использование

Синтаксис

Описание

пример

dataR = udpr() получает один пакет UDP из сети.

Выходные аргументы

развернуть все

Данные, полученные из сети, возвращенные в виде одного пакета. Свойство MaximumStartLength указывает максимальное количество байтов, которое может содержать каждый пакет данных. Длина полученных данных - это количество байтов, полученных из сети.

Данные принимаются как сложные данные, если IsMessageComplex свойство имеет значение true.

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
Поддержка комплексного номера: Да

Функции объекта

Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:

release(obj)

развернуть все

stepЗапустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System

Примеры

свернуть все

Отправка и получение пакетов UDP с помощью dsp.UDPSender и dsp.UDPReceiver Системные объекты. Вычислите число байтов, успешно переданных.

Примечание.При использовании R2016a или более ранней версии замените каждый вызов объекта синтаксисом эквивалентного шага. Например, obj(x) становится step(obj,x).

Установите RemoteIPPort отправителя UDP и LocalIPPort приемника UDP 31000. Задайте длину вектора данных как 128 выборки, что меньше значения MaximumMessageLength свойство получателя. Чтобы предотвратить потерю пакетов, вызовите setup способ на объекте-получателе перед первым вызовом алгоритма объекта.

udpr = dsp.UDPReceiver('LocalIPPort',31000);
udps = dsp.UDPSender('RemoteIPPort',31000);

setup(udpr); 

bytesSent = 0;
bytesReceived = 0;
dataLength = 128;

В каждом цикле итерации отправьте и примите пакет данных. В конце цикла используйте fprintf функция печати количества байтов, отправленных отправителем, и количества байтов, полученных получателем.

for k = 1:20
   dataSent = uint8(255*rand(1,dataLength));
   bytesSent = bytesSent + dataLength;
   udps(dataSent);
   dataReceived = udpr();
   bytesReceived = bytesReceived + length(dataReceived);
end

release(udps);
release(udpr);

fprintf('Bytes sent:     %d\n', bytesSent);
Bytes sent:     2560
fprintf('Bytes received: %d\n', bytesReceived);
Bytes received: 2560

Номер локального IP-порта dsp.UDPReceiver и номер удаленного IP-порта dsp.UDPSender настраиваются в созданном коде. Создание файла MEX из receiver функция, которая содержит алгоритм приема синусоидальных данных по сети UDP. Измените номер удаленного IP-порта приемника UDP без регенерации файла MEX. Проверьте количество байтов, отправленных и полученных по сети.

Примечание.Этот пример выполняется только в R2017a или более поздних версиях.

Входные данные для receiver функция - номер локального IP-порта dsp.UDPReceiver object™ системы. Выходные данные этой функции - это количество байтов, полученных из сети UDP.

type receiver
function [bytesReceived] = receiver(portnumber)

persistent udpRx

if isempty(udpRx) 
    udpRx = dsp.UDPReceiver('MessageDataType','double'); 
end 

udpRx.LocalIPPort = portnumber; 
dataReceived = udpRx();
bytesReceived = length(dataReceived);

dsp.UDPSender объект с remoteIPPort номер, равный 65000, передает данные по сети UDP. dsp.UDPReceiver объект с LocalIPPort номер, равный 65000, получает данные из сети UDP. Данные представляют собой синусоидальную волну, содержащую 250 выборок на кадр.

portnumber = 65000;
udpSend = dsp.UDPSender('RemoteIPPort',portnumber);
sine = dsp.SineWave('SamplesPerFrame',250);

bytesSent = 0;
bytesReceived = 0;
dataLength = 250;

for i = 1:10
dataSent = sine();
bytesSent = bytesSent + dataLength;
udpSend(dataSent);
bytesReceived = bytesReceived + receiver(portnumber);
end
fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 2250

Данные передаются и успешно принимаются по сети UDP. Начальные данные отбрасываются из-за накладных расходов.

Создание файла MEX из receiver.m функция.

codegen receiver -args {65000}
Code generation successful.

Отпустите отправителя и измените RemoteIPPort число до 25000. LocalIPPort номер приемника продолжает составлять 65000. Поскольку номера портов различаются, данные не передаются успешно.

release(udpSend)
portnumberTwo = 25000;
udpSend.RemoteIPPort = portnumberTwo; 
bytesReceived = 0;
bytesSent = 0;
for i = 1:10
dataSent = sine();
bytesSent = bytesSent + dataLength;
udpSend(dataSent);
bytesReceived = bytesReceived + receiver_mex(portnumber);
end
fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 0

Очистите файл MEX и измените номер локального IP-порта приемника на 25000. Сброс MEX позволяет изменить номер порта приемника без необходимости регенерации MEX. Номера портов отправителя и получателя совпадают. Проверьте, успешно ли переданы данные.

clear mex %#ok
bytesReceived = 0;
bytesSent = 0;
for i = 1:10
dataSent = sine();
bytesSent = bytesSent + dataLength;
udpSend(dataSent);
bytesReceived = bytesReceived + receiver_mex(portnumberTwo);
end
fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 2250

Данные успешно передаются по сети UDP. Начальные данные отбрасываются из-за накладных расходов.

Вычислите STFT синусоидальной волны и передайте комплексные данные STFT по сети UDP. На стороне приемника вычислите ISTFT принятых данных. Визуализация отправленных и полученных данных с использованием области времени.

dsp.UDPSender объект может отправлять сложные данные. Для включения dsp.UDPReceiver объект для приема сложных данных, установите IsMessageComplex свойство для true.

udps = dsp.UDPSender('RemoteIPPort',31000);
udpr = dsp.UDPReceiver('LocalIPPort',31000,'IsMessageComplex',true,'MessageDataType','double');

setup(udpr); 

bytesSent = 0;
bytesReceived = 0;
dataLength = 128;

Инициализируйте dsp.STFT и dsp.ISTFT Системные объекты с периодическим hann окно длиной 120 выборок и длиной перекрытия 60 выборок. Установите длину БПФ равной 128.

winLen = 120;
overlapLen = 60;

frameLen = winLen-overlapLen;
stf = dsp.STFT('Window',hann(winLen,'periodic'),'OverlapLength',overlapLen,'FFTLength',128);
istf = dsp.ISTFT('Window',hann(winLen,'periodic'),'OverlapLength',overlapLen,'WeightedOverlapAdd',0);

Вход представляет собой синусоидальный сигнал с частотой 100 Гц, частотой дискретизации 1000 Гц и с 60 выборками на каждый кадр сигнала.

sine = dsp.SineWave('SamplesPerFrame',winLen-overlapLen,'Frequency',100);

Инициализация timescope объект с частотой дискретизации 1000 Гц и временным интервалом 0,09. Delay объект корректирует длину перекрытия при сравнении входного сигнала с восстановленным выходным сигналом.

ts  = timescope('SampleRate',1000,'ShowLegend',true,'YLimits',[-1 1],'TimeSpanSource','Property','TimeSpan',.09,...
    'ChannelNames',{'Input','Reconstructed'});
dly = dsp.Delay('Length',overlapLen);

Передача комплексных данных STFT синусоидальной волны по сети UDP. Вычислите ISTFT принятых данных. Сравните входные данные, x, к восстановленному выходу, y. Благодаря задержке, введенной объектами, восстановленный выходной сигнал сдвигается во времени по сравнению с входным сигналом. Поэтому для сравнения возьмем норму разницы между восстановленным выходом, yи предыдущий вход, xprev.

Визуализация сигналов с использованием области времени. Можно видеть, что восстановленный сигнал очень близко перекрывается с входным сигналом.

n = zeros(1,1e3);
xprev = 0;
for k = 1:1e3
   x = sine();
   X = stf(x);
   bytesSent = bytesSent + length(X);
   udps(X);
   dataReceived = udpr();
   if (~isempty(dataReceived))
       y = istf(dataReceived);
   end
   n(1,k) = norm(y-xprev);
   xprev = x;
   bytesReceived = bytesReceived + length(dataReceived);
   ts([dly(x),y]);
end

Норма разности очень мала, указывая, что выходной сигнал является идеально реконструированным вариантом входного сигнала.

max(abs(n))
ans = 5.3870e-14

Деблокируйте объекты UDP.

release(udps);
release(udpr);

Некоторые из отправленных пакетов могут быть потеряны во время передачи из-за потери протокола UDP. Чтобы проверить потери, сравните отправленные байты с полученными байтами.

fprintf('Bytes sent:     %d\n', bytesSent);
Bytes sent:     128000
fprintf('Bytes received: %d\n', bytesReceived);
Bytes received: 128000

Расширенные возможности

.
Представлен в R2012a