dsp. UDPReceiver

Получите пакеты UDP от сети

Описание

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

Получить пакеты UDP от сети:

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

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

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

Создание

Синтаксис

udpr = dsp.UDPReceiver
udpr = dsp.UDPReceiver(Name,Value)

Описание

пример

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

пример

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

Свойства

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

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

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

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

Типы данных: логический

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

Синтаксис

dataR = udpr()

Описание

пример

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

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

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

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

Данные получены как комплексные данные, если свойство IsMessageComplex установлено в true.

Типы данных: 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