dsp.UDPReceiver

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

Описание

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

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

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

Синтаксис

Описание

пример

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 приемника 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}
Code generation successful.

Выпустите отправителя и измените RemotePort номер к 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);

Инициализируйте timescope объект с частотой дискретизации 1 000 Гц и отрезком времени 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