Отправка пакетов UDP в сеть
The 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™ в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем 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-порта приемника без регенерации файла MEX. Проверьте количество байтов, отправленных и полученных по сети.
Примечание.Этот пример выполняется только в R2017a или более поздней версии.
Вход в receiver function - номер локального 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);
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
Указания и ограничения по применению:
Системные объекты в генерации кода MATLAB (MATLAB Coder)
Исполняемый файл, сгенерированный из этого системного объекта, полагается на предварительно созданные файлы динамической библиотеки (.dll файлы) в комплекте с MATLAB®. Используйте packNGo функция, чтобы упаковать код, сгенерированный из этого объекта, и все соответствующие файлы в сжатом zip-файле. Используя эту zip- файла, можно переместить, распаковать и перестроить проект в другой среде разработки, где MATLAB не установлен. Для получения дополнительной информации см. раздел «Как запустить сгенерированный исполняемый файл вне MATLAB».
The RemoteIPPort свойство настраивается в сгенерированном коде, но не настраивается во время симуляции.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.