dsp. UDPSender

Отправьте пакеты UDP, чтобы объединиться в сеть

Описание

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

Отправить пакеты UDP в сеть:

  1. Создайте объект dsp.UDPSender и установите его свойства.

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

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

udps = dsp.UDPSender
udps = dsp.UDPSender(Name,Value)

Описание

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

пример

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

Свойства

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

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

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

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (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 на Auto.

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

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

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить Систему object™ алгоритм. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

y = udps(Packet)

Описание

пример

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

Входные параметры

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

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

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

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

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

release(obj)

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

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

Примеры

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

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

Примечание: Если вы используете 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 к 65 000 отправляет данные по сети UDP. Объект dsp.UDPReceiver с набором номера LocalIPPort к 65 000 получает данные из сети 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}

Выпустите отправителя и измените номер RemoteIPPort на 25 000. Количество 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 получателя к 25 000. Очистка 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 Гц, частотой дискретизации 1 000 Гц, и с 60 выборками на каждый кадр сигнала.

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

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

ts  = dsp.TimeScope('SampleRate',1000,'ShowLegend',true,'YLimits',[-1 1],'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 = 1.4282e-15

Выпустите объекты 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