Протокол связи
OBEX (аббревиатура OBject EXchange , также называемая IrOBEX ) — это протокол связи , который облегчает обмен двоичными объектами между устройствами. Он поддерживается Ассоциацией инфракрасных данных , но также был принят Специальной группой по Bluetooth и крылом SyncML Открытого мобильного альянса (OMA). Одно из первых популярных приложений OBEX было в Palm III . Этот КПК и его многочисленные преемники используют OBEX для обмена визитными карточками, данными и даже приложениями.
Хотя OBEX изначально был разработан для инфракрасного порта, теперь он адаптирован для Bluetooth , а также используется через RS-232 , USB , WAP и в таких устройствах, как смарт-ручки Livescribe .
Сравнение с HTTP
OBEX по конструкции и функциям аналогичен HTTP: он предоставляет клиенту надежный транспорт для подключения к серверу, а затем может запрашивать или предоставлять объекты. Но OBEX отличается во многих важных отношениях:
- HTTP обычно располагается над ссылкой TCP/IP . OBEX также может быть, но обычно он реализуется в стеке IrLAP/IrLMP/Tiny TP на устройстве IrDA . В Bluetooth OBEX реализован на стеке Baseband / ACL / L2CAP (и, для устаревшего использования, RFCOMM ). Возможны и другие подобные «привязки» OBEX, например через USB .
- HTTP использует удобочитаемый текст, но OBEX использует тройки тип-длина-значение в двоичном формате , называемые «Заголовки», для обмена информацией о запросе или объекте. Их гораздо легче анализировать устройствами с ограниченными ресурсами.
- HTTP-транзакции по своей сути не имеют состояния; обычно HTTP-клиент открывает соединение, выполняет один запрос, получает ответ и либо закрывает соединение, либо выполняет другие несвязанные запросы . В OBEX одно транспортное соединение может выполнять множество связанных операций. Фактически, недавние дополнения к спецификации OBEX позволяют возобновить внезапно закрытую транзакцию с сохранением всей информации о состоянии.
- Хотя HTTP-транзакции в первую очередь предназначены для извлечения данных , OBEX обеспечивает более сбалансированный подход, позволяющий как отправлять, так и получать данные. [1]
Объекты
OBEX работает путем обмена объектами , которые используются для различных целей: установления параметров соединения, отправки и запроса данных, изменения текущего пути или атрибутов файла.
Объекты — это поля и заголовки . В качестве примера можно привести следующий объект, используемый для запроса телефонной книги с мобильного телефона:
Этот объект содержит два поля (команда и длина) и два заголовка. Первое поле (команда) указывает, что это запрос данных (GET). Второе поле — это общий размер объекта, включая два поля.
Этот объект также содержит два заголовка, а именно «Идентификатор соединения» и «Имя». Первый байт каждого заголовка — это имя заголовка и тип его содержимого. В этом случае:
- 0xCB означает, что этот заголовок представляет собой «Идентификатор соединения», число, полученное ранее; два старших бита 0xCB равны 11, и эта пара указывает, что это 4-байтовая величина;
- первый байт второго заголовка равен 0x01; этот байт идентифицирует этот заголовок как «Имя»; первые два бита 0x01 равны 00, что означает, что содержимое этого заголовка представляет собой строку Юникода, завершающуюся нулем (в форме UCS-2 ), с префиксом количества байтов, из которых она состоит (0x00 0x1e).
Возможный ответ, содержащий запрошенные данные, может быть:
В этом примере предполагается, что телефонная книга достаточно коротка, чтобы ее можно было разместить в одном объекте ответа. Единственный заголовок имеет идентификатор 0x49, что означает, что это «Конец тела», последний фрагмент информации (в данном случае также единственный). Первые два бита 0x49 равны 01, что означает, что содержимое этого заголовка представляет собой данные с префиксом длины: два следующих байта 0x00 и 0x2F сообщают длину этих данных (в десятичном формате 47), последующие - это данные, в этом случай, когда телефонная книга содержит только пустую визитную карточку размером 47 байт.
В этом примере показана одна команда GET и ее ответ, причем единственными заголовками, которые используются, являются идентификатор соединения, имя и конец тела. Перед его выдачей должна была быть отправлена команда CONNECT для установления некоторых параметров соединения, включая идентификатор соединения. Другие команды: put, setpath, action, Abort, Disconnect. Некоторые другие примечательные заголовки включают: тип, время, описание, цель.
Сессия
После того, как клиент (например, компьютер) подключается к серверу (например, мобильному телефону), типичный сеанс состоит в том, что клиент отправляет несколько объектов и получает на них ответы от сервера. В качестве примера:
- CONNECT: одно из полей указывает максимальный размер пакетов, которые может получить клиент; заголовок TARGET указывает тип услуги, которую ожидает клиент (просмотр файлов, синхронизация-ml, доступ к телефонной книге); ответ сервера с максимальной длиной пакета, идентификатором соединения и другими данными
- GET: клиент запрашивает файл, указывая идентификатор соединения, имя файла и/или его тип; сервер отвечает содержимым файла или только его частью; в последнем случае клиент должен отправить другие объекты GET, чтобы получить остальную часть файла.
- SETPATH: клиент сообщает серверу переключиться на другую папку с файлами, указывая идентификатор соединения и имя папки в двух заголовках.
- GET: клиент запрашивает список содержимого папки, отправляя объект с идентификатором соединения и соответствующим заголовком TYPE (например, «x-obex/folder-listing» для передачи файлов, «x-bt/vcard-listing» для доступ к телефонной книге)
- PUT: клиент отправляет файл на сервер; если он слишком велик, чтобы уместиться в один пакет, сервер запросит следующую часть с ответом CONTINUE.
- ОТКЛЮЧИТЬ: клиент сообщает серверу, что закрывает сеанс.
Обмен может существенно отличаться в зависимости от сервиса. Например, SyncML не использует SETPATH, а передача OBEX состоит из просто CONNECT (без заголовка TARGET), PUT и необязательного DISCONNECT.
Протоколы
Следующие протоколы работают через OBEX или имеют для этого привязки:
- ОБЕКС Пуш
- Передает файл от отправителя запроса получателю; отправляется объект CONNECTION, не содержащий цели, затем используется PUT для передачи файла
- Протокол передачи файлов OBEX
- Сохраняет и извлекает файлы аналогично FTP . Целевой заголовок объекта CONNECTION: {0xF9, 0xEC, 0x7B, 0xC4, 0x95, 0x3C, 0x11, 0xD2, 0x98, 0x4E, 0x52, 0x54, 0x00, 0xDC, 0x9E, 0x09}; ответ содержит идентификатор соединения, который будет использоваться в последующих объектах GET, PUT, SETPATH и ACTION.
- Доступ к телефонной книге
- Аналогично передаче файлов, но использует цель {0x79, 0x61, 0x35, 0xF0, 0xF0, 0xC5, 0x11, 0xD8, 0x09, 0x66, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66}; записи телефонной книги могут быть перечислены (с различными возможными порядками и фильтрами) и извлечены из определенных каталогов в разделе telecom/ с помощью GET и SETPATH.
- ИрМЦ
- IrMC был разработан для обмена записями телефонной книги, календаря, цифровыми визитными карточками и списками дел . В форме без установления соединения для передачи данных используется один PUT; в противном случае различные файлы и папки в telecom/ могут быть извлечены или переданы; целевой заголовок {'I', 'R', 'M', 'C', '-', 'S', 'Y', 'N', 'C'} может использоваться в запросах GET для различения типа использовано индексации
- СинкМЛ
- SyncML может синхронизировать телефонные книги, календари, заметки и другие данные. В привязке OBEX целью объекта CONNECT является {'S', 'Y', 'N', 'C', 'M', 'L', '-', 'S', 'Y', ' Н', 'С'}; тогда сеанс состоит из последовательности пар PUT-GET, в которых по очереди отправляются и принимаются безымянные файлы XML или WBXML .
Реализации
javax.obex
Дополнительный пакет javax.obex в API Java для Bluetooth обеспечивает реализацию OBEX в Java . [2]
ОпенОбекс
OpenObex — это реализация OBEX с открытым исходным кодом на C. Он предоставляет функции для подключения через IrDA , Bluetooth , USB и TCP/IP , построения объектов и обработки полученных данных. Пример схемы клиентского приложения:
void callback_function (...) { /* обработка полученных данных */ } int main () { OBEX_Init (..., функция обратного вызова ); OBEX_TransportConnect (...); объект = OBEX_ObjectNew (...); OBEX_ObjectAddHeader ( объект , ...); OBEX_ObjectAddHeader ( объект , ...); OBEX_Request (..., объект ); в то время как (...) OBEX_HandleInput (...) объект = OBEX_ObjectNew (...); OBEX_ObjectAddHeader ( объект , ...); OBEX_Request (..., объект ); в то время как (...) OBEX_HandleInput (...) /* ... */ OBEX_TransportDisconnect ( дескриптор ); OBEX_Cleanup ( дескриптор ); }
Объекты отправляются через OBEX_Request
. После вызова OBEX_HandleInput
полученные данные обрабатываются в функции обратного вызова (которая была указана при вызове OBEX_Init
). Функция обратного вызова может определить, был ли получен ответ полностью и, следовательно, может ли основная программа выйти из while
выполняемого цикла.
ПиОБЕКС и ноБЕКС
PyOBEX обеспечивает частичную поддержку OBEX в Python . [3] nOBEX — это ответвление PyOBEX с более полной поддержкой OBEX и поддержкой профиля Bluetooth Hands Free для облегчения тестирования OBEX в автомобильных информационно-развлекательных системах. [4]
Профили
OBEX является основой для многих «профилей» более высокого уровня:
Поддерживаемые устройства
Смотрите также
Рекомендации
- ^ «Введение и обзор», «Лидерство в образовании » , Cambridge University Press, стр. 1–5, 22 января 2007 г., doi : 10.1017/cbo9781139168564.001, ISBN 978-0-521-68512-2, получено 16 февраля 2024 г.
- ^ API javax.obex
- ^ ПиОБЕКС
- ^ ноОБЕКС
Внешние ссылки
- Спецификация OBEX на IrDA.org
- Профили Bluetooth, включая спецификации для OBEX и протоколов на его основе (GOEP, FTP, OBEX push, SYNC)
- OpenOBEX — реализация протокола OBEX с открытым исходным кодом.