OBEX
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
OBEX는 클라이언트와 서버 간의 객체 교환을 위한 통신 프로토콜로, HTTP와 유사한 기능을 제공하지만, IrDA, 블루투스, USB 등 다양한 전송 계층에서 구현될 수 있다는 차이점이 있다. OBEX는 바이너리 형식의 헤더를 사용하여 자원 제한적인 장치에서 효율적으로 파싱할 수 있으며, 단일 연결에서 여러 작업을 처리할 수 있는 특징을 가진다. OBEX는 객체, 필드 및 헤더를 사용하여 데이터를 교환하며, CONNECT, GET, PUT 등의 명령을 통해 세션을 구성한다. OBEX는 OBEX 푸시, 파일 전송 프로토콜, 전화번호부 접근, IrMC, SyncML 등의 프로토콜을 기반으로 하며, Java, C, Python 등 다양한 언어로 구현되어 있다. 또한, 범용 객체 교환 프로필(GOEP), 객체 푸시 프로필(OPP), 파일 전송 프로필(FTP) 등 여러 프로파일의 기반이 되며, 팜, 샤프, 모토로라, 삼성, 소니 에릭슨, HTC, 노키아 등 다양한 장치에서 지원된다.
더 읽어볼만한 페이지
| OBEX | |
|---|---|
| 일반 정보 | |
| 프로토콜 유형 | 세션 계층 프로토콜 | 
| 설계 시기 | 1994년 | 
| 표준 | IrDA, SyncML, Bluetooth | 
| 포트 | TCP 15, UDP 15 (공식적으로 할당되지 않음) | 
| 기술 세부 사항 | |
| 특징 | 간단한 이진 프로토콜 클라이언트-서버 모델 기반 다양한 장치 간 데이터 교환에 사용 | 
| 사용 분야 | 개인 정보 관리 (PIM) 데이터 동기화 파일 전송 객체 교환 | 
| 관련 기술 | |
| 관련 프로토콜 | IrDA SyncML 블루투스 | 
| 대체 프로토콜 | HTTP | 
2. HTTP와의 비교
OBEX는 클라이언트가 서버에 접속하여 신뢰성 있는 전송을 수행하고, 객체를 요청하거나 제공하는 기능이 HTTP와 유사하다. 그러나 다음과 같은 중요한 차이점이 있다.
- 전송 방식: HTTP는 일반적으로 TCP/IP 프로토콜 위에서 작동한다. 반면 OBEX는 IrDA 장치에서는 IrLAP/IrLMP/Tiny TP 스택을 사용하고, 블루투스에서는 Baseband/ACL/L2CAP(또는 레거시 사용을 위해 RFCOMM) 스택을 기반으로 구현된다. USB와 같이 다른 방식으로 OBEX를 연결(바인딩)하는 것도 가능하다.
- 데이터 형식: HTTP는 사람이 읽을 수 있는 텍스트를 사용하는 반면, OBEX는 요청이나 객체에 대한 정보를 "헤더"라는 바이너리 형식의 타입-길이-값 3중 항을 사용하여 교환한다. 이는 자원이 제한된 장치에서 데이터를 더 쉽게 분석할 수 있게 한다.
- 세션 처리: HTTP 트랜잭션은 기본적으로 상태가 없다. 즉, HTTP 클라이언트는 연결을 열고, 단일 요청을 한 후 응답을 받으면 연결을 닫거나, 관련 없는 다른 요청을 수행한다. 그러나 OBEX에서는 단일 전송 연결로 여러 관련 작업을 처리할 수 있다. 실제로 OBEX 사양에 최근 추가된 기능 덕분에 갑자기 닫힌 트랜잭션을 모든 상태 정보를 유지한 채 재개할 수도 있다.
3. 객체 (Objects)
OBEX는 연결 매개변수 설정, 데이터 전송 및 요청, 현재 경로 또는 파일 속성 변경 등 다양한 목적을 위해 ''객체''를 교환하여 작동한다.
객체는 ''필드''와 ''헤더''로 구성된다. 예를 들어, 모바일에서 전화번호부를 요청하는 데 사용될 수 있는 객체는 다음과 같다.
| 객체 | 필드 | 명령 | GET, Final | 
|---|---|---|---|
| 길이 | 객체의 총 길이 | ||
| 헤더 | 연결 ID | 1 | |
| 이름 | "telecom/pb.vcf" | 
이 객체에는 두 개의 필드(명령 및 길이)와 두 개의 헤더(연결 ID, 이름)가 포함되어 있다. 첫 번째 필드(명령)는 데이터 요청(GET)임을 지정한다. 두 번째 필드는 두 개의 필드를 포함한 객체의 총 크기이다. 각 헤더의 첫 번째 바이트는 헤더의 이름과 콘텐츠 유형이다.
요청된 데이터를 포함하는 가능한 응답은 다음과 같다.
| 응답 | 필드 | 응답 코드 | OK, Final | 
|---|---|---|---|
| 길이 | 객체의 총 길이 | ||
| 헤더 | End-of-Body | 
이 예제에서는 전화번호부가 단일 응답 객체에 포함될 만큼 짧다고 가정한다. 유일한 헤더는 "End of Body", 즉 정보의 마지막 청크(이 경우 유일한 하나)임을 의미하는 식별자를 가진다.
이 예제는 단일 GET 명령과 해당 응답을 보여주며, 관련 헤더는 연결 ID, 이름 및 본문 종료뿐이다. 이 명령을 실행하기 전에 연결 ID를 포함한 연결의 몇 가지 매개변수를 설정하기 위해 CONNECT 명령이 전송되었어야 한다. 다른 명령으로는 put, setpath, action, abort, disconnect가 있다. 다른 주목할 만한 헤더로는 type, time, description, target이 있다.
4. 세션 (Session)
클라이언트(예: 컴퓨터)가 서버(예: 휴대폰)에 연결된 후, 일반적인 세션은 클라이언트가 여러 개의 객체를 전송하고 서버로부터 응답을 받는 것으로 구성된다. 예를 들면 다음과 같다.
- CONNECT: 필드 중 하나는 클라이언트가 수신할 수 있는 최대 패킷 크기를 지정한다. TARGET 헤더는 클라이언트가 기대하는 서비스 종류(파일 탐색, SyncML, 전화번호부 접근)를 지정한다. 서버는 최대 패킷 길이, 연결 ID 및 기타 데이터로 응답한다.
- GET: 클라이언트는 파일 이름 및/또는 유형을 지정하여 파일을 요청한다. 서버는 파일 내용 또는 그 일부를 응답한다. 후자의 경우, 클라이언트는 파일의 나머지 부분을 얻기 위해 다른 GET 객체를 전송해야 한다.
- SETPATH: 클라이언트는 연결 ID와 폴더 이름을 두 개의 헤더에 지정하여 다른 파일 폴더로 전환하도록 서버에 지시한다.
- GET: 클라이언트는 연결 ID와 적절한 TYPE 헤더(예: 파일 전송의 경우 "x-obex/folder-listing", 전화번호부 접근의 경우 "x-bt/vcard-listing")를 전송하여 폴더 내용 목록을 요청한다.
- PUT: 클라이언트는 서버에 파일을 전송한다. 단일 패킷에 맞추기에는 너무 크면 서버는 CONTINUE 응답으로 다음 부분을 요청한다.
- DISCONNECT: 클라이언트는 세션을 닫고 있음을 서버에 알린다.
교환은 서비스에 따라 크게 다를 수 있다. 예를 들어, SyncML은 SETPATH를 사용하지 않으며, OBEX 푸시는 CONNECT (TARGET 헤더 없이), PUT 및 선택적 DISCONNECT로 구성된다. OBEX는 HTTP와 유사하게 클라이언트가 서버에 접속할 때 신뢰성 있는 전송을 수행하고, 접속 후에 객체를 요청·제공한다. 그러나 몇 가지 중요한 차이점이 있다.
5. 프로토콜 (Protocols)
- 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 객체에서 사용할 연결 ID가 포함된다.
- 전화번호부 접근: 파일 전송과 유사하지만, 대상 {0x79, 0x61, 0x35, 0xF0, 0xF0, 0xC5, 0x11, 0xD8, 0x09, 0x66, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66}을 사용한다. GET 및 SETPATH를 사용하여 telecom/ 아래의 특정 디렉토리에서 전화번호부 항목을 (다양한 정렬 및 필터링 옵션으로) 나열하고 검색할 수 있다.
- IrMC: IrMC는 전화번호부 항목, 캘린더 항목, 디지털 명함 및 할 일 목록의 교환을 위해 설계되었다. 비 연결 방식에서는 단일 PUT을 사용하여 데이터를 전송한다. 그렇지 않으면 telecom/ 내의 다양한 파일과 폴더를 검색하거나 푸시할 수 있다. GET 요청에서 {'I', 'R', 'M', 'C', '-', 'S', 'Y', 'N', 'C'} 대상 헤더를 사용하여 사용되는 인덱싱 종류를 구분할 수 있다.
- SyncML: SyncML은 전화번호부, 캘린더, 메모 및 기타 데이터를 동기화할 수 있다. OBEX 바인딩에서 CONNECT 객체의 대상은 {'S', 'Y', 'N', 'C', 'M', 'L', '-', 'S', 'Y', 'N', 'C'}이다. 세션은 이름 없는 XML 또는 WBXML 파일이 차례로 전송 및 수신되는 PUT-GET 쌍의 시퀀스로 구성된다.
6. 구현 (Implementations)
OpenObex는 OBEX의 C 언어 오픈 소스 구현체이다. IrDA, 블루투스, USB, TCP/IP를 통한 연결 기능을 제공하며 오브젝트를 만들고 수신 데이터를 관리한다.
블루투스용 Java API의 선택적 패키지 `javax.obex`는 자바로 OBEX 구현체를 제공한다.[4]
PyOBEX는 파이썬으로 OBEX를 부분적으로 지원한다.[5][2] nOBEX는 PyOBEX의 포크(fork)로, 더 완전한 OBEX 지원과 블루투스 핸즈프리 프로파일 지원을 제공한다.[6][3] nOBEX는 자동차 인포테인먼트 시스템에서 OBEX 테스트를 용이하게 한다.[3]
6. 1. javax.obex
블루투스용 Java API의 선택적 패키지 `javax.obex`는 자바로 OBEX 구현체를 제공한다.[4]6. 2. OpenObex
OpenObex는 OBEX의 C 언어 오픈 소스 구현체이다. IrDA, 블루투스, USB, TCP/IP를 통한 연결 기능을 제공하며 오브젝트를 만들고 수신 데이터를 관리한다. 클라이언트 애플리케이션의 예는 다음과 같다.```cpp
void callback_function(...) {
/* 수신된 데이터 처리 */
}
int main() {
OBEX_Init(..., callback_function);
OBEX_TransportConnect(...);
object = OBEX_ObjectNew(...);
OBEX_ObjectAddHeader(object, ...);
OBEX_ObjectAddHeader(object, ...);
OBEX_Request(..., object);
while (...)
OBEX_HandleInput(...)
object = OBEX_ObjectNew(...);
OBEX_ObjectAddHeader(object, ...);
OBEX_Request(..., object);
while (...)
OBEX_HandleInput(...)
/* ... */
OBEX_TransportDisconnect(handle);
OBEX_Cleanup(handle);
}
```
객체는 `OBEX_Request`에 의해 전송된다. `OBEX_HandleInput`을 호출한 후, 수신된 데이터는 콜백 함수(`OBEX_Init`을 호출할 때 지정됨)에서 처리된다. 콜백 함수는 응답이 완전히 수신되었는지 여부를 결정할 수 있으며, 따라서 메인 프로그램이 실행 중인 `while` 루프에서 종료할 수 있는지 여부를 결정할 수 있다.
6. 3. PyOBEX 및 nOBEX
PyOBEX는 파이썬으로 OBEX를 부분적으로 지원한다.[5][2] nOBEX는 PyOBEX의 포크(fork)로, 더 완전한 OBEX 지원과 블루투스 핸즈프리 프로파일 지원을 제공한다.[6][3] nOBEX는 자동차 인포테인먼트 시스템에서 OBEX 테스트를 용이하게 한다.[3]7. 프로파일 (Profiles)
OBEX는 여러 상위 계층 "프로필"의 기반이 된다.
| 분류 | 프로필 | 
|---|---|
| IrDA | 포인트 앤 슛 프로필 | 
| 적외선 금융 메시징(IrFM) 프로필 | |
| 블루투스 SIG | 범용 객체 교환 프로필 | 
| 객체 푸시 프로필 (휴대폰 간 전송) | |
| 파일 전송 프로필 (휴대폰-PC 전송) | |
| 동기화 프로필 | |
| 기본 이미징 프로필 | |
| 기본 인쇄 프로필 | |
| OMA | SyncML 바인딩 | 
8. 지원 장치 (Supported devices)
| 장치 종류 | 제조사 및 모델 | 
|---|---|
| PDA | 팜 III 이후 모든 팜 제품 (Palm Pre, Palm Pre Plus, Palm Pixi, Palm Pixi Plus 제외), 2003년 이후 출시된 대부분의 PDA | 
| 휴대 전화 | 샤프, 모토로라, 삼성, 소니 에릭슨, HTC, 노키아의 대부분 휴대폰 (적외선 또는 블루투스 포트 탑재), LG EnV Touch (VX11000), 적외선 또는 블루투스 포트 탑재 휴대폰, 기타 대부분의 휴대 전화 | 
| 안드로이드 기기 | 안드로이드 2.1 이상 버전 | 
| 윈도우 폰 기기 | 윈도우 폰 7.8 및 8 기기 (블루투스 공유 앱을 통해 사진, 음악, 비디오 전송으로 제한) | 
참조
[1] 
문서
 
javax.obex API
 
http://docs.oracle.c[...] 
[2] 
문서
 
PyOBEX
 
https://pypi.python.[...] 
[3] 
Github
 
nOBEX
 
https://github.com/n[...] 
[4] 
문서
 
javax.obex API
 
http://docs.oracle.c[...] 
[5] 
문서
 
PyOBEX
 
https://pypi.python.[...] 
[6] 
Github
 
nOBEX
 
https://github.com/n[...] 
                        
                        본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다. 
                        모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
                        하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다. 
                        따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
                        
                        문의하기 : help@durumis.com