exponenta event banner

dsp. UDPSender

Отправка пакетов UDP в сеть

Описание

UDPSender объект отправляет пакеты UDP в сеть.

Для отправки пакетов UDP в сеть:

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

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

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

Создание

Описание

udps = dsp.UDPSender возвращает объект отправителя UDP, udps, который отправляет пакеты UDP на указанный порт.

пример

udps = dsp.UDPSender(Name,Value) возвращает объект отправителя UDP, udps, каждое свойство имеет заданное значение.

Свойства

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

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

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

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

Укажите удаленный (т.е. хост) IP-адрес, на который передаются данные. Значение по умолчанию: '127.0.0.1', который является локальным хостом.

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

Укажите порт на удаленном IP-адресе, на который передаются данные. Это свойство может быть настроено в сгенерированном коде, но не может быть настроено во время моделирования.

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

Укажите способ определения локального IP-порта на хосте как Auto или Property. При указании Autoобъект динамически выбирает порт из доступных портов. При указании Property, объект использует источник, указанный в LocalIPPort собственность.

Укажите порт для передачи данных.

Зависимости

Это свойство применяется при установке LocalIPPortSource свойство для Property.

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

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

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

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

Синтаксис

Описание

пример

y = udps(Packet) отправляет один пакет UDP, Packet, в сеть.

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

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

Объект отправляет один пакет UDP в сеть за один вызов.

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

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

Чтобы использовать функцию объекта, укажите object™ 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