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