dsp.UDPReceiver

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

Описание

The dsp.UDPReceiver Системная object™ получает пакеты UDP по сети UDP с удаленного IP-адреса, указанного в свойстве RemoteIPAddress. Затем объект сохраняет данные в своем внутреннем буфере. Объем данных (количество элементов), принятых в каждом пакете UDP, может варьироваться. Максимальное количество байтов, которое может получить объект, не теряя данных, задается свойством ReceiveBufferSize. Свойство MaximumMessageLength задает максимальное количество выборок, которое может содержать каждый пакет данных. LocalIPPortt, на котором объект получает данные, настраивается в сгенерированном коде, но не настраивается во время симуляции. Для получения примера см. раздел Настройка номера порта 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 от сети.

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

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

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

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

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

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

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