Отправьте пакеты UDP, чтобы объединиться в сеть
Объект UDPSender
отправляет пакеты UDP в сеть.
Отправить пакеты UDP в сеть:
Создайте объект dsp.UDPSender
и установите его свойства.
Вызовите объект с аргументами, как будто это была функция.
Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.
udps = dsp.UDPSender
udps = dsp.UDPSender(Name,Value)
возвращает объект отправителя UDP, udps
= dsp.UDPSenderudps
, который отправляет пакеты UDP в заданный порт.
возвращает объект отправителя UDP, udps
= dsp.UDPSender(Name,Value
)udps
, с каждым набором свойств к заданному значению.
Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и функция release
разблокировала их.
Если свойство является настраиваемым, можно изменить его значение в любое время.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (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
— Источник локального порта IPAuto
(значение по умолчанию) | Property
Задайте, как определить локальный порт IP на хосте как Auto
или Property
. Если вы задаете Auto
, объект выбирает порт динамически из доступных портов. Если вы задаете Property
, объект использует источник, заданный в свойстве LocalIPPort
.
LocalIPPort
— Локальный порт, от которого можно отправить данные25000
(значение по умолчанию) | целое число в области значений [1, 65535]Задайте порт, от которого можно отправить данные.
Это свойство применяется, когда вы устанавливаете свойство LocalIPPortSource
на Auto
.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Для версий ранее, чем R2016b, используйте функцию step
, чтобы запустить Систему object™ алгоритм. Аргументы к step
являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.
Например, y = step(obj,x)
и y = obj(x)
выполняют эквивалентные операции.
y = udps(Packet)
Packet
— Данные отправляютсяОбъект отправляет один пакет UDP в сеть на вызов.
Типы данных: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
Поддержка комплексного числа: Да
Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj
, используйте этот синтаксис:
release(obj)
Отправьте и получите пакеты UDP с помощью Системных объектов dsp.UDPReceiver
и dsp.UDPSender
. Вычислите количество байтов, успешно переданных.
Примечание: Если вы используете 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}
Выпустите отправителя и измените номер RemoteIPPort
на 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);
Инициализируйте объект dsp.TimeScope
с частотой дискретизации 1 000 Гц и отрезком времени 0,09. Объект Delay
исправляет длину перекрытия при сравнении входа с восстановленным выходным сигналом.
ts = dsp.TimeScope('SampleRate',1000,'ShowLegend',true,'YLimits',[-1 1],'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 = 1.4282e-15
Выпустите объекты 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.
Свойство RemoteIPPort
является настраиваемым в сгенерированном коде, но не настраиваемым во время симуляции.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.