Отправка пакетов UDP в сеть
UDPSender объект отправляет пакеты UDP в сеть.
Для отправки пакетов UDP в сеть:
Создать dsp.UDPSender и задайте его свойства.
Вызовите объект с аргументами, как если бы это была функция.
Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.
возвращает объект отправителя UDP, udps = dsp.UDPSenderudps, который отправляет пакеты UDP на указанный порт.
возвращает объект отправителя UDP, udps = dsp.UDPSender(Name,Value)udps, каждое свойство имеет заданное значение.
Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.
Если свойство настраивается, его значение можно изменить в любое время.
Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.
RemoteIPAddress - Удаленный адрес для отправки данных'127.0.0.1' (по умолчанию) | символьный вектор, содержащий допустимый IP-адрес | строковый скалярУкажите удаленный (т.е. хост) IP-адрес, на который передаются данные. Значение по умолчанию: '127.0.0.1', который является локальным хостом.
Типы данных: char
RemoteIPPort - Удаленный порт для передачи данных25000 (по умолчанию) | целое число в диапазоне [1, 65535]Укажите порт на удаленном IP-адресе, на который передаются данные. Это свойство может быть настроено в сгенерированном коде, но не может быть настроено во время моделирования.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
LocalIPPortSource - Источник локального IP-портаAuto (по умолчанию) | PropertyУкажите способ определения локального IP-порта на хосте как Auto или Property. При указании Autoобъект динамически выбирает порт из доступных портов. При указании Property, объект использует источник, указанный в LocalIPPort собственность.
LocalIPPort - Локальный порт для передачи данных25000 (по умолчанию) | целое число в диапазоне [1, 65535]Укажите порт для передачи данных.
Это свойство применяется при установке LocalIPPortSource свойство для Property.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
SendBufferSize - Размер внутреннего буфера8192 байт (по умолчанию) | целое число в диапазоне [1, 67108864]Размер внутреннего буфера, отправляющего пакеты UDP, указанный в байтах как целое число в диапазоне [1, 67108864].
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Packet - Отправленные данныеОбъект отправляет один пакет UDP в сеть за один вызов.
Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
Поддержка комплексного номера: Да
Чтобы использовать функцию объекта, укажите object™ System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:
release(obj)
Отправка и получение пакетов 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 receiverfunction [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 номер, равный 65000, передает данные по сети UDP. 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. 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 принятых данных. Визуализация отправленных и полученных данных с использованием области времени.
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. 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
Примечания и ограничения по использованию:
Системные объекты в генерации кода MATLAB (кодер MATLAB)
Исполняемый файл, созданный из этого объекта System, основан на предварительно созданных файлах динамической библиотеки (.dll файлы), входящие в состав MATLAB ®. Используйте packNGo для упаковки кода, созданного из этого объекта, и всех соответствующих файлов в сжатый zip-файл. С помощью этого zip-файла можно переместить, распаковать и перестроить проект в другой среде разработки, где MATLAB не установлен. Дополнительные сведения см. в разделе Запуск созданного исполняемого файла вне MATLAB.
RemoteIPPort свойство может быть настроено в сгенерированном коде, но не может быть настроено во время моделирования.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.