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