dsp.UDPSender

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

Описание

The 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™ в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем obj, используйте следующий синтаксис:

release(obj)

расширить все

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

Примеры

свернуть все

Отправка и получение пакетов 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-порта приемника без регенерации файла MEX. Проверьте количество байтов, отправленных и полученных по сети.

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

Вход в receiver function - номер локального 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);

The dsp.UDPSender объект с remoteIPPort number set 65000 отправляет данные по сети UDP. The 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. The 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 принятых данных. Визуализация отправленных данных и данных, полученных с помощью временных возможностей.

The 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. The 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