Обмен объектами - OBject EXchange

OBEX (сокращение от Обмен объектами, также называемый IrOBEX) - это протокол связи, который облегчает обмен двоичными объектами между устройствами. Он поддерживается Инфракрасная ассоциация данных но также был принят Bluetooth Special Interest Group и SyncML крыло Открытый мобильный альянс (OMA). Одно из самых первых популярных приложений OBEX было в Пальма III. Этот КПК и его многочисленные преемники используют OBEX для обмена визитками, данными и даже приложениями.

Хотя OBEX изначально был разработан для инфракрасного порта, теперь он был принят Bluetooth, а также используется RS-232, USB, WAP и в таких устройствах, как Подписка умные ручки.

Сравнение с HTTP

OBEX по конструкции и функциям похож на HTTP в предоставлении клиенту надежного транспорта для подключения к серверу и затем может запрашивать или предоставлять объекты. Но OBEX отличается во многих важных отношениях:

  • HTTP обычно располагается выше TCP / IP связь. OBEX также может быть, но обычно реализуется на IrLAP /IrLMP /Крошечный TP складывать на ИК-порт устройство. В Bluetooth, OBEX реализован на Основная полоса /ACL /L2CAP (и для устаревшего использования RFCOMM ) куча. Возможны и другие подобные «привязки» OBEX, такие как over USB.
  • HTTP использует читаемый человеком текст, но OBEX использует двоичный формат. тип-длина-значение триплеты с именем «Заголовки» для обмена информацией о запросе или объекте. Их гораздо проще проанализировать на устройствах с ограниченными ресурсами.
  • HTTP-транзакции по своей сути не имеют состояния; обычно HTTP-клиент открывает соединение, делает один запрос, получает ответ и либо закрывает соединение, либо делает другие не связанные запросы. В OBEX одно транспортное соединение может выполнять множество связанных операций. Фактически, недавние дополнения к спецификации OBEX позволяют возобновить внезапно закрытую транзакцию с сохранением всей информации о состоянии.

Объекты

OBEX работает путем обмена объекты, которые используются для различных целей: установка параметров соединения, отправка и запрос данных, изменение текущего пути или атрибутов файла.

Объекты поля и заголовки. Например, следующий объект может быть объектом, используемым для запроса телефонной книги с мобильного телефона:

ОбъектПоляКомандаGET, Final0x83
Длинаобщая длина объекта0x00 0x29
ЗаголовкиID подключения10xCB 0x00 0x00 0x00 0x01
Имя"телеком / пб.вцф"0x01 0x00 0x1e 0x00 0x74 0x00 0x65 0x00 0x6c 0x00 0x65 0x00 0x63 0x00 0x6f 0x00 0x6d 0x00 0x2f 0x00 0x70 0x00 0x62 0x00 0x2e 0x00 0x76 0x00 0x63 0x00 0x66 0x00 0x00

Этот объект содержит два поля (команда и длина) и два заголовка. Первое поле (команда) указывает, что это запрос данных (GET). Второе поле - это общий размер объекта, включая два поля.

Этот объект также содержит два заголовка, а именно «Идентификатор соединения» и «Имя». Первый байт каждого заголовка - это имя заголовка и его тип содержимого. В этом случае:

  • 0xCB означает, что этот заголовок является «идентификатором соединения», числом, полученным ранее; два старших бита 0xCB равны 11, и эта пара определяет это как 4-байтовую величину;
  • первый байт второго заголовка - 0x01; этот байт идентифицирует этот заголовок как заголовок «Имя»; первые два бита 0x01 равны 00, что означает, что содержимое этого заголовка представляет собой строку Unicode с завершающим нулем (в UCS-2 form), с префиксом количества байтов, из которых он состоит (0x00 0x1e).

Возможный ответ, содержащий запрошенные данные, может быть:

ОтветПоляКод ответаОК, финал0xA0
Длинаобщая длина объекта0x00 0x35
ЗаголовкиКонец тела"НАЧАТЬ: VCARD ..."0x49 0x00 0x2F 0x42 0x45 0x47 0x49 0x4e 0x3a 0x56 0x43 0x41 0x52 0x44

В этом примере предполагается, что телефонная книга достаточно короткая, чтобы ее можно было поместить в один объект ответа. Единственный заголовок имеет идентификатор 0x49, что означает, что это «конец тела», последний фрагмент информации (в данном случае также единственный). Первые два бита 0x49 - это 01, что означает, что содержимое этого заголовка представляет собой данные с префиксом длины: два следующих байта 0x00 0x2F указывают длину этих данных (в десятичном формате, 47), последующие - данные, в этом чехол телефонная книга, содержащая только пустой vCard 47 байт.

В этом примере показана одна команда GET и ее ответ, единственными задействованными заголовками являются идентификатор соединения, имя и конец тела. Перед его выдачей должна быть отправлена ​​команда CONNECT для установления некоторых параметров соединения, включая идентификатор соединения. Другие команды: положить, установить путь, действие, прервать, отключить. Некоторые другие известные заголовки включают: тип, время, описание, цель.

Сессия

После того, как клиент (например, компьютер) подключается к серверу (например, мобильному), типичный сеанс состоит в том, что клиент отправляет несколько объектов и получает их ответы от сервера. В качестве примера:

  • CONNECT: одно из полей определяет наибольший размер пакетов, которые может получить клиент; заголовок TARGET определяет тип услуги, которую ожидает клиент (просмотр файлов, sync-ml, доступ к телефонной книге); ответ сервера с максимальной длиной пакета, идентификатором соединения и другими данными
  • GET: клиент запрашивает файл, указывая идентификатор соединения, имя файла и / или его тип; ответ сервера с содержимым файла или его частью; в последнем случае клиент должен отправить другие объекты GET для получения остальной части файла
  • SETPATH: клиент сообщает серверу переключиться на другую файловую папку, указав идентификатор подключения и имя папки в двух заголовках
  • GET: клиент запрашивает список содержимого папки, отправляя объект с идентификатором подключения и соответствующим заголовком TYPE (например, «x-obex / folder-list» для передачи файлов, «x-bt / vcard-list» для доступ к телефонной книге)
  • PUT: клиент отправляет файл на сервер; если он слишком велик, чтобы поместиться в один пакет, сервер запросит следующую часть с ответом CONTINUE
  • ОТКЛЮЧИТЬ: клиент сообщает серверу, что закрывает сеанс

Обмен может существенно отличаться в зависимости от услуги. Например, SyncML не использует SETPATH, а OBEX push состоит только из CONNECT (без заголовка TARGET), PUT и необязательного DISCONNECT.

Протоколы

Следующие протоколы работают через OBEX или имеют привязки для этого:

OBEX Push
Передает файл от отправителя запроса получателю; объект 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}; Записи телефонной книги могут быть перечислены (с различными возможными порядками и фильтрами) и извлечены из определенных каталогов в разделе телекоммуникации / с помощью GET и SETPATH
IrMC
IrMC был разработан для обмена записями в телефонной книге, календарными записями, цифровыми визитными карточками и списки дел. В форме без установления соединения для передачи данных используется один PUT; в противном случае различные файлы и папки в Telecom / могут быть извлечены или перемещены; целевой заголовок {'I', 'R', 'M', 'C', '-', 'S', 'Y', 'N', 'C'} может использоваться в запросах GET, чтобы различать тип индексации
SyncML
SyncML может синхронизировать телефонные книги, календари, заметки и другие данные. В его привязке OBEX целью объекта CONNECT является {'S', 'Y', 'N', 'C', 'M', 'L', '-', 'S', 'Y', ' N ',' C '}; тогда сеанс состоит из последовательности пар PUT-GET, где безымянный XML или же WBXML файлы отправляются и принимаются по очереди.

Реализации

javax.obex

Дополнительный пакет javax.obex в API Java для Bluetooth обеспечивает реализацию OBEX в Ява.[1]

OpenObex

OpenObex - это реализация OBEX с открытым исходным кодом в C. Он предоставляет функции для подключения через ИК-порт, Bluetooth, USB и TCP / IP, построение объектов и обработка полученных данных. Примерная схема клиентского приложения:

пустота callback_function(...) {  / * обрабатываем полученные данные * /}int главный() {  OBEX_Init(..., callback_function);  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, полученные данные обрабатываются в callback-функции (которая была указана при вызове OBEX_Init). Функция обратного вызова может определить, был ли полностью получен ответ, и, следовательно, может ли основная программа выйти из пока цикл, который он выполняет.

PyOBEX и nOBEX

PyOBEX обеспечивает частичную поддержку OBEX в Python.[2] nOBEX - это форк PyOBEX с более полной поддержкой OBEX и поддержкой Bluetooth. Профиль Hands Free для облегчения тестирования OBEX автомобильных информационно-развлекательных систем.[3]

Профили

OBEX является основой многих «профилей» более высокого уровня:

Профили
КлассификацияПрофиль
ИК-портПрофиль Point and Shoot
Инфракрасный обмен финансовыми сообщениями (IrFM) профиль
Bluetooth SIGОбщий профиль обмена объектами
Профиль отправки объекта (перевод с телефона на телефон)
Профиль передачи файлов (перевод с телефона на ПК)
Профиль синхронизации
Базовый профиль визуализации
Основной профиль печати
OMASyncML привязка

Поддерживаемые устройства

Смотрите также

Рекомендации

внешняя ссылка