Считайте и запишите двоичные данные по UDP

Этот раздел предоставляет подробную информацию и примеры, исследуя бинарные операции чтения и операции записи с объектом UDP.

Функции и свойства

Эти функции используются при чтении и записи двоичных данных:

ФункцияЦель
freadСчитайте двоичные данные из инструмента или сервера.
fwriteЗапишите двоичные данные в инструмент или сервер.

Эти свойства сопоставлены с чтением и записью двоичных данных:

СвойствоЦель
ValuesReceivedЗадает общее количество значений, считанных из инструмента или сервера.
ValuesSentЗадает общее количество значений, отправленных в инструмент или сервер.
InputBufferSizeЗадает общее количество байтов, которые могут быть поставлены в очередь во входном буфере одновременно.
OutputBufferSizeЗадает общее количество байтов, которые могут быть поставлены в очередь в буфере вывода одновременно.
DatagramTerminateMode Задает как fread и fscanf оконечные операции чтения.

Примечание

Чтобы получить список опций, можно использовать на функции, нажать клавишу Tab после ввода функции на командной строке MATLAB®. Список расширяется, и можно прокрутить, чтобы выбрать свойство или значение. Для получения информации об использовании этой функции завершения вкладки "Дополнительно" смотрите Используя Заполнение клавишей Tab для Функций.

Конфигурирование и соединение с сервером

В данном примере мы будем использовать сервер эха, которому предоставляют тулбокс. Сервер эха позволяет вам экспериментировать с основной функциональностью объектов UDP, не связывая с существующим устройством. Сервер эха является сервисом, который возвращается к адресу и порту отправителя, те же байты, которые это получает от отправителя.

echoudp('on', 8000)

Необходимо создать объект UDP. В этом примере создайте объект UDP, сопоставленный с хостом 127.0.0.1 (ваша локальная машина), порт 8000. В общем случае имя хоста или адрес и серверный порт будут заданы устройством и вашей конфигурацией сети.

u = udp('127.0.0.1', 8000);

Вы, возможно, должны сконфигурировать OutputBufferSize из объекта UDP. OutputBufferSize свойство задает максимальное количество байтов, которые могут быть записаны в сервер целиком. По умолчанию, OutputBufferSize 512.

u.OutputBufferSize
ans = 
    512

Если команда задана в fwrite содержит больше чем 512 байтов, ошибка возвращена, и никакие данные не записаны в сервер. В этом примере 1 000 байтов будут записаны в инструмент. Поэтому OutputBufferSize увеличен до 1000.

u.OutputBufferSize = 1000
u.OutputBufferSize
ans = 
    1000

Прежде чем можно будет выполнить операцию чтения или операцию записи, необходимо соединить объект UDP с сервером с fopen функция.

fopen(u)

Если объект был успешно соединен, его Status свойство автоматически сконфигурировано к open.

u.Status
ans = 
    open

Примечание

Порты UDP могут быть совместно использованы другими приложениями, чтобы позволить, чтобы несколько приложений слушали дейтаграммы UDP на том порте. Это допускает способность слушать широковещательные сообщения UDP на том же локальном номере порта и в MATLAB и в других приложениях. Можно включить и отключить эту возможность с новым свойством объекта UDP под названием EnablePortSharing. Смотрите включают совместное использование порта по UDP.

Запись двоичных данных

Вы используете fwrite функционируйте, чтобы записать двоичные данные в сервер или инструмент.

По умолчанию, fwrite функция действует в синхронном режиме. Это означает тот fwrite блокирует командную строку MATLAB, пока одно из следующего не происходит:

  • Все данные записаны

  • Тайм-аут происходит, как задано Timeout свойство

По умолчанию fwrite функционируйте пишут двоичные данные с помощью uchar точность. Однако другая точность может также использоваться. Для списка поддерживаемой точности смотрите страницу ссылки на функцию для fwrite.

UDP отправляет и получает данные в блоках, которые называются дейтаграммами. Каждый раз, когда вы пишете или считываете данные с объектом UDP, вы пишете или читаете дейтаграмму. В примере ниже, дейтаграмма с 1 000 байтов, 4 байтами за целое число, будет отправлена в echoserver.

fwrite(u, 1:250, 'int32');

Примечание

При выполнении операции записи необходимо думать о передаваемых данных в терминах значений, а не байтов. Значение состоит из одного или нескольких байтов. Например, один uint32 значение состоит из четырех байтов.

ValuesSent свойство указывает на общее количество значений, записанных в сервер, поскольку объект был соединен с сервером.

u.ValuesSent
ans = 
    250

Конфигурирование InputBufferSize

InputBufferSize свойство задает максимальное количество байтов, которые можно считать из сервера. По умолчанию, InputBufferSize 512.

u.InputBufferSize
ans = 
    512

В следующем примере 1 000 байтов будут считаны из сервера. Сконфигурируйте InputBufferSize содержать 1 000 байтов. Отметьте, InputBufferSize может быть сконфигурирован только, когда объект не соединяется с сервером или инструментом.

fclose(u);
u.InputBufferSize = 1000);
u.InputBufferSize
ans = 
    1000

Теперь, когда свойство сконфигурировано правильно, можно вновь открыть связь с сервером:

fopen(u);

Чтение двоичных данных

Вы используете fread функционируйте, чтобы считать двоичные данные из сервера или инструмента.

fread функциональные блоки командная строка MATLAB до одного из следующего происходят:

  • Тайм-аут происходит, как задано Timeout свойство

  • Входной буфер заполнен

  • Конкретное количество значений читается (если DatagramTerminateMode off)

  • Дейтаграмма была получена (если DatagramTerminateMode on)

По умолчанию fread функционируйте считывает двоичные данные с помощью uchar точность. Однако другая точность может также использоваться. Для списка поддерживаемой точности смотрите страницу ссылки на функцию для fread.

Примечание

При выполнении операции чтения необходимо думать о полученных данных в терминах значений, а не байтов. Значение состоит из одного или нескольких байтов. Например, один uint32 значение состоит из четырех байтов.

Можно считать int32 двоичные данные. Например, считайте одну дейтаграмму, состоящую из 250 целых чисел от инструмента или сервера.

fwrite(u, 1:250, 'int32');
data = fread(u, 250, 'int32');

ValuesReceived свойство указывает на общее количество значений, считанных из сервера.

u.ValuesReceived
ans = 
    500

DatagramTerminateMode свойство указывает, должна ли операция чтения завершить работу, когда дейтаграмма получена. DatagramTerminateMode по умолчанию on, что означает, что операция чтения завершает работу, когда дейтаграмма получена. Чтобы считать несколько дейтаграмм целиком, можно установить DatagramTerminateMode к off. В этом примере две дейтаграммы записаны в echoserver.

fwrite(u, 1:125, 'int32');
fwrite(u, 1:125, 'int32');

Поскольку DatagramTerminateMode offfread будет читать через дейтаграммные контуры, пока 250 целых чисел не были получены.

u.DatagramTerminateMode = 'off';
data = fread(u, 250, 'int32');
size(data)
ans = 
    250

Очистка

Если вы закончены с объектом UDP, отключаете его от сервера, удаляете его из памяти и удаляете его из рабочей области. Если вы используете сервер эха, выключаете его.

fclose(u);
delete(u);
clear u
echoudp('off');