Отправьте пакеты UDP, чтобы объединиться в сеть
UDPSender
объект отправляет пакеты UDP в сеть.
Отправить пакеты UDP в сеть:
Создайте dsp.UDPSender
объект и набор его свойства.
Вызовите объект с аргументами, как будто это была функция.
Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты?
возвращает объект отправителя UDP, udps
= dsp.UDPSenderudps
, это отправляет пакеты UDP в заданный порт.
возвращает объект отправителя UDP, udps
= dsp.UDPSender(Name,Value
)udps
, с каждым набором свойств к заданному значению.
Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и release
функция разблокировала их.
Если свойство является настраиваемым, можно изменить его значение в любое время.
Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты.
RemoteIPAddress
— Удаленный адрес, в который можно отправить данные
(значение по умолчанию) | вектор символов, содержащий допустимый IP-адрес | строковый скалярЗадайте удаленное (то есть, хост) IP-адрес, в который отправляются данные. Значением по умолчанию является '127.0.0.1'
, который является локальным хостом.
Типы данных: char
RemoteIPPort
— Удаленный порт, в который можно отправить данные
(значение по умолчанию) | целое число в области значений [1, 65535]Задайте порт в удаленном IP-адресе, в который отправляются данные. Это свойство является настраиваемым в сгенерированном коде, но не настраиваемым в процессе моделирования.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
LocalIPPortSource
— Источник локального порта IPAuto
(значение по умолчанию) | Property
Задайте, как определить локальный порт IP на хосте как Auto
или Property
. Если вы задаете Auto
, объект выбирает порт динамически из доступных портов. Если вы задаете Property
, объект использует источник, заданный в LocalIPPort
свойство.
LocalIPPort
— Локальный порт, от которого можно отправить данные
(значение по умолчанию) | целое число в области значений [1, 65535]Задайте порт, от которого можно отправить данные.
Это свойство применяется, когда вы устанавливаете LocalIPPortSource
свойство к Property
.
Типы данных: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
SendBufferSize
— Размер внутреннего буфера
байты (значение по умолчанию) | целое число в области значений [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 приемника 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.
RemoteIPPort
свойство является настраиваемым в сгенерированном коде, но не настраиваемым в процессе моделирования.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.