Прием пакетов UDP из сети
The dsp.UDPReceiver
Системная object™ получает пакеты UDP по сети UDP с удаленного IP-адреса, указанного в свойстве RemoteIPAddress. Затем объект сохраняет данные в своем внутреннем буфере. Объем данных (количество элементов), принятых в каждом пакете UDP, может варьироваться. Максимальное количество байтов, которое может получить объект, не теряя данных, задается свойством ReceiveBufferSize. Свойство MaximumMessageLength задает максимальное количество выборок, которое может содержать каждый пакет данных. LocalIPPortt, на котором объект получает данные, настраивается в сгенерированном коде, но не настраивается во время симуляции. Для получения примера см. раздел Настройка номера порта UDP в MATLAB.
Для приема пакетов UDP из сети:
Создайте dsp.UDPReceiver
Объекту и установите его свойства.
Вызывайте объект с аргументами, как будто это функция.
Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».
Если не указано иное, свойства являются нетронутыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируются, когда вы вызываете их, и release
функция разблокирует их.
Если свойство настраивается, можно изменить его значение в любой момент.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Использование Системных объектов.
LocalIPPort
- Локальный порт, на который можно принимать данные25000
(по умолчанию) | [1, 65535]
Порт, на который можно получить данные, заданный как скаляр в области значений [1, 65535]. Это свойство настраивается в сгенерированном коде, но не настраивается во время симуляции.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
RemoteIPAddress
- Адрес, с которого можно принимать данные'0.0.0.0'
(по умолчанию) | вектор символов, содержащий допустимый IP-адрес | строковый скалярАдрес, с которого можно принять данные, заданный как вектор символов или строковый скаляр, содержащий допустимый IP-адрес. Ввод определенного IP-адреса блокирует UDP-пакеты с других адресов. Значение по умолчанию, '0.0.0.0'
, указывает, что данные могут быть приняты с любого удаленного IP-адреса.
Типы данных: char
ReceiveBufferSize
- Размер внутреннего буфера8192
байты (по умолчанию) | [1, 67108864]
Размер внутреннего буфера, который получает UDP-пакеты, заданный в байтах как скаляр в области значений [1, 67108864]
. Если количество полученных байтов превышает это значение, буфер переполнен, а содержимое усечено.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
MaximumMessageLength
- Максимальный размер выходного сообщения255
(по умолчанию) | [1, 65507]
Максимальная длина выхода сообщения, заданная в выборках как положительной скалярной величине в область значений [1, 65507]. Установите это свойство на значение, равное или больше, чем размер данных пакета UDP. Если вы получаете больше выборок, чем указано в этом свойстве, избыточные данные усекаются.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
MessageDataType
- Тип данных сообщения'uint8'
(по умолчанию) | 'double'
| 'single'
| 'int8'
| 'int16'
| 'uint16'
| 'int32'
| 'uint32'
| 'logical'
Тип данных векторных элементов в выходном сообщении, заданный как MATLAB® встроенный тип данных.
Сопоставьте тип данных с входными данными, используемыми для создания пакетов UDP.
Типы данных: char
IsMessageComplex
- Сложность сообщенияfalse
(по умолчанию) | true
Сложность сообщения, заданная как true
или false
.
Установите это свойство на true
если полученное сообщение является комплексным. Установите значение свойства false
если полученное сообщение реально.
Типы данных: logical
dataR
- Полученные данныеДанные, полученные из сети, возвращаются как один пакет. Свойство MaximumMessageLength задает максимальное количество байтов, которое может содержать каждый пакет данных. Длина полученных данных - это количество байтов, полученных из сети.
Данные принимаются как комплексные данные, если IsMessageComplex
для свойства задано значение true
.
Типы данных: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
Поддержка комплексного числа: Да
Чтобы использовать функцию объекта, задайте системный объект в качестве первого входного параметра. Например, чтобы освободить системные ресурсы системного объекта с именем 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 LocalIPPort
свойство настраивается в сгенерированном коде, но не настраивается во время симуляции.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.