OBEX LÀ GÌ?OBEX OBject EXchange là giao thức trao đổi dữ liệu giữa các thiết bị dùng cổng hồng ngoại được hiệp hội IrDA Infrared Data Association đưa ra lần đầu tiên năm 1997.. Ban đầu,
Trang 1OBEX LÀ GÌ?
OBEX (OBject EXchange) là giao thức trao đổi dữ liệu giữa các thiết bị dùng cổng hồng ngoại được hiệp hội IrDA (Infrared Data Association) đưa ra lần đầu tiên năm 1997 Ban đầu, giao thức này chỉ giới hạn cho các thiết bị sử dụng môi trường ánh sáng hồng ngoại, nhưng rất nhanh sau đó nó được tổ chức Bluetooth SIG (Bluetooth Special Interest Group) đưa vào hầu hết các thiết bị Bluetooth của mình
1 Vị trí OBEX trong mô hình OSI
Cũng giống như các giao thức khác, giao thức OBEX được xây dựng trên nền mô hình OSI (Open Systems Interconnection) bao gồm hai thành phần chính:
• OBEX session protocol (giao thức phiên OBEX): mô tả cấu trúc gói tin trong phiên
làm việc giữa hai thiết bị
• OBEX application framework: tập các dịch vụ OBEX cung cấp cho các ứng dụng đầu
cuối như truyền file, in ảnh
OBEX Application Ù Tầng ứng dụng
Trang 2ication OBEX Framework
Tầng trình diễn
IrLAP ManagerLink Tầng liên kết dữ liệu
H ình 1: Giao thức OBEX tro g n mô hình OSI
2 Cấu trúc gói tin trong giao thức phiên OBEX
Giao thức OBEX n kiểu "đẩy" (Push) hoặc "kéo" (Pull), cho phép m y" dữ liệu l r) hoặc "kéo" dữ liệu
từ server xuống Đ hiện i t nt server phải tuân thủ chặt chẽ cấu trúc đề ra Dưới đây là một vài cấu rong quá trình
http://www.hitekgroup.net)
2.1 Gói tin yêu cầu
Mọi gói tin yêu cầu cấu trúc như sau:
đ á
ược sử dụ
y khách (client) "
g chủ yếu trong các đẩ
ứ ê
ng dụng
n máy chủ (serve rao đổi giữa clie
ể thực điều này, các gó in t và
trúc được sử dụng t khảo tài liệu IrOB ient và s r (chi tiết có thể tham E
đều có
Byte 0 Byte 1, 2 Byte 3 đến n opcode packet length Headers
Opcode: Mã lệnh ừ ầu (Bản ) Bit ca ọi là F al bit
Packet length: Độ
Header: Thông tin đầu có cấu trúc như sau:
ứng với t ng yêu c g 1 o nhất g in dài của gói tin
Byte 0 Byte 1, 2 Byte 3 đến n
identifier header length (tuỳ chọn) value
Trang 3Bảng 1: Mã lệnh yêu cầu
Mã lệnh Kiểu Mô tả 0x80 CONNECT Thiết lập phiên
giao dịch 0x81 DISCONNECT Ngừdịch ng phiên giao 0x02
(0x82) PUT
Gửi dữ liệu lên
0x03 (0x83) GET Lấy dữ liệu từ server 0xFF ABORT Hủy bỏ phiên giao dịch
Định
0x01 NAME Tên file (mã Unicode) 0xC3 LENGTH Kích thước file theo byte 0x48 BODY Đoạn dữ liệu của file 0x49 END OF BODY Đoạn dữ liệu cuối cùng của file
2.2 Gói tin trả lời
Giống như gói tin yêu cầu, gói tin trả lời có cấu trúc như sau:
Byte 0 Byte 1, 2 Byte 3 to n
response opcode response length response data
Một số mã trả lời (response opcode) thường gặp:
0x10 (0x90) Tiếp tục yêu cầu hoặc trả lời 0x20 (0xA0) Xác nhận kết thúc yêu cầu
0x40 (0xC0) Lỗi yêu cầu 0x41 (0xC1) Lỗi do không có quyền
Trang 40x43 (0xC3) Phiên giao dịch bị huỷ bỏ 0x44 (0xC4) Không tìm thấy file
3
Quá trình trao đổi file giữa client và server được chia làm 3 giai đoạn:
•
Cùng giải quyết
• Ngừng phiên: DISCONNECT
3.1 Thiết lập phiên (CONNECT
Gói tin CONNEC có cấu trúc nh
Thiết lập phiên: CONNECT
• Nhận/gửi file: GET/PUT
)
Byte
0 0
Byte 1,
2 Byte 3
Byte
4 Byte 5, 6
Byte 7
to n
0x80 packet length
OBEX version number
flags
maximum OBEX packet length
optional head s er
OBEX version num o thức OBEX gồm major number lưu tại 4 bit cao, minor number lưu t hấp Phiên bản hiện tại là 1.0, do đó giá trị này là 0x10
Flags: Giá trị này luôn là 0x00 trong phiên b
thiết bị có thể nhận hoặc gử này hau Do đó khi thiết lập phiên, client cần g để kiểm tra xem kích thước gói tin lớn nhất mà server có thể nhận hoặc gửi là b
Optional headers: Thông tin đầu được tù ch của mỗi phiên giao dịch Trong ví dụ dưới đây, giá trị này có thể bỏ qua
ber: Phiên bản gia
ại 4 bit t
ản hiện tại
pac gth: Giá ị lớn nhất của gói tin tron th
i Giá tr ửi
ị
iá trị này lên server
ở client và server có thể khác n g
ao nhiêu?
y chọn ứng với mục đí
Yêu cầu từ client byte Ý nghĩa
0x0007 Độ dài gói tin = 7 bytes 0x10 Phiên bản OBEX 1.0
Mã yêu cầu
0x00 Flags đối với phiên bản
Trang 5hiện tại
0
Kích thước lớn nhất của gói tin là 8K
Mã trả lời 0xA0 SUCCESS 0x0007 Độ dài gói tin = 7 bytes 0x10 Phiên bản OBEX 1.0 0x00 Flags đối với phiên bản hiện tại
0x0200
Kích thước lớn nhất của gói tin mà server có thể nhận hoặc gửi là 512 bytes
3.2 Gửi file (PUT)
Không giống như gói tin CONNECT, gói tin PU in đầu sau:
NAME: Thông tin về tên file
LENGTH: Thông tin về kích
BODY: Đoạn dữ liệu file
END OF BODY Đoạn dữ liệu cu ủa l
Dưới đây là ví gửi 1 file hello.gif có kích th PC lên server (ĐTDĐ) Do kích thước của file n hơn kích th rver có thể
gửi Gói tin 1 có mã yêu cầu PUT là 0x02 (khôn tin 2 có mã yêu cầu PUT là 0x82 (thiết lập Fi
T có thêm một số thông t
thước file
lớ ước gói tin lớn nhất mà se
client sẽ chia file thành h
g thiết lập Final bit)
Gói nal bit)
Yêu cầu từ client byte Ý nghĩa
PUT, Final bit không thiết lập để chỉ cho server biết client còn gửi yêu cầu tiếp theo
0x01E2 Độ dài gói tin = 482 bytes
Mã yêu cầu
0x01 Định danh thông tin đầu
NAME (tên file)
Trang 60x0017 Độ dài của thông tin đầu NAME = 20+3 = 23
bytes
hello.gif Tên file (unicode) có ký tự kết thúc NULL (20
bytes)
Định danh thông tin đầu LENGTH (kích thước file)
0x000002D1 Kích thước file = 721 bytes 0x48 Định danh thông tin đầu BODY (dữ liệu file)
0x01C3 Độ dài của thông tin đầu BODY = 448+3 = 451
bytes
0x Đoạn dữ liệu file có kích
thước 448 bytes
Mã trả lời 0x90 CONTINUE, tiếp tục nhận yêu cầu từ client 0x0003 độ dài gói tin = 3 bytes
Mã yêu cầu 0x82
PUT, Final bit được thiết lập để chỉ cho server biết đây là gói tin cuối cùng
0x0117 Độ dài gói tin = 279 bytes 0x49 Định danh thông tin đầu END OF BODY
0x0114 Độ dài của thông tin đầu END OF BODY = 276
bytes
0x
Đoạn dữ liệu file có kích thước 721-448 = 273
Mã trả lời 0xA0 SUCCESS 0x0003 độ dài gói tin = 3 bytes
3.3 Nhận file (GET)
Khác với gói tin PUT, gói tin GET chỉ có thông tin đầu NAME Ví dụ sau sẽ mô tả quá
Trang 7trình nhận file hello.gif có kích th 21 lie t (PC) sẽ gửi yêu cầu GET đ server (ĐTD ôn ile Do ích thước của file yêu cầu lớn hơn 512 bytes (với Sony Eri lời đầu tiên có mã
lời là CONTINUE, client biết rằng đây chưa đoạn dữ liệu cuối cùng của file nên tiếp tục gửi yêu cầu (không cần thông tin đầu n được mã trả lời
là 0xA0 (SUCCESS)
ước 7 với th gb tyin đầu NAME là tên ftes từ server Trước tiên c n k
csson T610) nên gói tin trả hần dữ liệu của file Kh phải là
NAME) cho đến khi nhậ
Yêu cầu từ client byte Ý nghĩa 0x83 GET, Final bit được thiết
0x001A Độ dài gói tin = 26 bytes 0x01 Định danh thông tin đầu
NAME (tên file) 0x0017 Độ dài của thông tin đầu
NAME = 20+3 = 23 bytes
Mã yêu cầu
hello.gi
f
Tên file (unicode) có ký tự kết thúc NULL (20 bytes)
0x90 CONTINUE, còn dữ liệu
0x01C6 Độ dài gói tin = 454 bytes 0x48 Định danh thông tin đầu BODY (dữ liệu file)
0x01C3
Độ dài của thông tin đầu BODY = 448+3 = 451
Mã trả lời
0x Đoạn dữ liệu file có kích thước 448 bytes
0x83 PUT, tiếp tục yêu cầu nhận file
Mã yêu cầu
0x0003 Độ dài gói tin = 3 bytes
0xA0 SUCCESS, đoạn dữ liệu cuối cùng 0x0117 Độ dài gói tin = 279 bytes 0x49 Định danh thông tin đầu
Mã trả lời
0x0114 Độ dài của thông tin đầu
END OF BODY = 276
Trang 8
bytes
0x Đoạn dữ liệu file có kích thước 273 bytes
3.4 Ngừng phiên (DISCONNECT)
nt cần gửi gói tin DISCONNECT tới server
Để kết thúc phiên giao dịch, clie
Yêu cầu từ
client byte Ý nghĩa
Mã yêu cầu 0x81 DISCONNECT 0x0003 Độ dài gói tin = 3 bytes
Mã trả lời 0xA0 SUCCESS 0x0003 Độ dài gói tin = 3 bytes
OBEX trong điện thoại di
Ngày nay, ĐTDĐ không chỉ là phương tiện liên lạc đơn thuần mà còn là một thiết bị giải trí với nhiều chức năng như nghe nhạc, chụp ảnh,
v
hoặc lưu lại những khoảnh khắc đ
xin giới thiệu hai kiểu kết nối phổ biến nhất trên hầu hế
cổng hồng ngoại và Bluetooth; đồng thời hướng dẫn các
PC
động
chơi game Điều này đồng nghĩa với iệc người dùng luôn có nhu cầu cập nhật những bản nhạc hay, những trò chơi yêu thích
áng nhớ trên chiếc điện thoại của mình Dưới đây tôi
t các ĐTDĐ đời mới hiện nay là
h lập trình trao đổi dữ liệu giữa
và ĐTDĐ sử dụng giao thức OBEX qua hai loại kết nối này
ằng C#
1 Kết nối qua hồng ngoại b
Giao thức IrDA đư tiên năm 1994 v không dâ phạm vi hoạt động lên tới 1 m, góc mở từ tốc độ có thể đạt 4Mbps, cổng h
được đưa vào trong hầu hết các ĐTD
Trước đây, việc lập trình với cổng hồng cản
Int
Framewo
chóng hơ
bằng việc chỉ ra địa chỉ của server (tương tự như địa chỉ IP) và tê
(tươ
ợc hiệp hội IrDA giới thiệu lần đầu
ới mục đích tăng cường khả năng kết nối
y giữa các thiết bị qua ánh sáng hồng ngoại Với
15 đến 30 độ, ồng ngoại nhanh chóng thiết bị không dây như
Đ, PDA
ngoại là một rào đối với những ai chưa quen với giao diện lập trình API (Application Programming erface) của Windows, còn ngày nay, với phiên bản NET 2.0, Microsoft đã đưa vào bộ
rk này lớp thư viện IrDA, cho phép người lập trình viết mã dễ dàng và nhanh
n Giống như giao thức TCP/IP, client có thể thiết lập kết nối IrDA tới server
n dịch vụ trên server
ng tự như TCP Port)
Trang 9Mỗi chiếc g với cổng hồng ngoại t
đó Đoạn m
void Form1_Load(object sender, EventArgs e)
{
/*
Ir
/*
IrDADeviceInfo[] irDevices = irClient.DiscoverDevices(2);
/* In thông báo khi không tìm thấy thiết bị nào */
if (irDevices.Length == 0) {
ã sau cho phép xác định địa chỉ này:
using System.Net.Sockets;
Khởi tạo client */
DAClient irClient = new IrDAClient();
Tìm kiếm tối đa 2 thiết bị */
Không tìm thấy thiết bị hồng ngoại");
/* In tên và địa chỉ của từng thiết bị tìm thấy */ for (int i = 0; i < irDevices.Length; i++) {
Name:{0}",irDevices[i].DeviceName);
ong ĐTDĐ có thể khác nhau mỗi nhà
Đ hiện nay đều cung cấp hai dịch vụ
EX Trong phạm vi bài viết này tôi chỉ đề cập đến
h vụ IrDA:OBEX, dịch vụ cho phép PC và ĐTDĐ trao đổi dữ liệu qua giao thức
EX Việc kết nối tới dịch vụ này được thực hiện thông qua đoạn mã dưới đây:
sing System.Net.Sockets;
oid Form1_Load(object sender, EventArgs e)
c gắn một địa chỉ duy nhất tương ứn
Console.WriteLine("
} else {
Console.WriteLine("Device
Console.WriteLine("Device ID:{0}",irDevices[i].DeviceID);
}
}
}
Các dịch vụ IrDA được xây dựng sẵn (built-in) tr
sản xuất Tuy nhiên, nhìn chung hầu hết các ĐTD
chính là: IrDA:IrCOMM và IrDA:OB
dịc
OB
using System.Net;
u
v
Trang 10{
/* Thiết lập EndPoint */
IrDAEndPoint irEndPoint = new IrDAEndPoint(irDevices[0].DeviceID,
"IrDA:OBEX");
/* Khởi tạo socket */
Socket irSocket = new Socket(AddressFamily.Irda, SocketType.Stream, ProtocolType.Unspecified);
/* Kết nối tới ĐTDĐ qua dịch vụ OBEX*/
irSocket.Connect(irEndPoint);
}
Như vậy, từ giờ chúng ta có thể trao đổi dữ liệu giữa PC và ĐTDĐ qua irSocket bằng việc push/pull những gói tin OBEX thích hợp như đã đề cập ở phần trên
2 Kết nối qua Bluetooth bằng VC++
Năm 1994, hãng cung cấp thiết bị viễn thông hàng đầu thế giới Ericsson đã nghiên cứu thành công công nghệ không dây cho phép ĐTDĐ có thể kết nối với các phụ kiện như tai nghe, microphone qua sóng radio Sau đó 4 năm, tổ chức Bluetooth SIG được thành lập (bao gồm Ericsson, Intel, I
phiên bản 1.0A cho công ng
IEEE 802.15.1 hoạt động ở t
độ có thể đạt 3Mpbs đối v
Kể từ phiên bản Windows XP SP1
lập trình Microsoft Bluetooth Stack cho phé
Bluetooth socket Một vấn đề nảy sinh là không ph
trợ Microsoft Bluetooth Stack, mà phần lớn p
(Software Development Kit) riê
Bluetooth hỗ trợ Microsoft Blue
trong khi dòng IBM lại hỗ trợ W
Để lập trình với Bluetooth socket chúng ta ph
(
BM, Nokia và Toshiba) đã chính thức đưa ra đặc tả kỹ thuật
hệ Bluetooth vào năm 1999 Bluetooth hay còn có cái tên
ần số 2,4 GHz, phạm vi phủ sóng lên tới 100 m (Class 1), tốc
ới phiên bản 2.0+EDR (Enhanced Data Rate)
, Microsoft đã đưa vào hệ điều hành của mình mô hình
p kết nối với thiết bị Bluetooth thông qua
ải tất cả các chipset Bluetooth đều hỗ hải có driver đi kèm cũng như bộ SDK
ng để phát triển Chúng ta có thể tìm thấy chipset tooth Stack trên các máy tính xách tay SONY VAIO, idcomm Bluetooth Stack (bộ SDK có giá tới 1400 USD)
ải cài bộ SDK for Windows XP SP2
://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.ht
Bộ SDK này sẽ cung cấp một số file header cũng như các thư viện cần thiết trong quá
ưa hỗ trợ Bluetooth nên việc viết mã phải hoàn
ền thư viện API có sẵn của Windows
toàn giống như thiết bị hồng ngoại, chỉ có điều, bạn phải tự thân vận động Dưới đây là đoạn mã
thời in ra tên và địa chỉ
http
m)
trình lập trình Do phiên bản NET 2.0 ch
toàn thực hiện trên n
Cách tiếp cận thiết bị Bluetooth hoàn
thay vì sử dụng hàm có sẵn của NET,
viết bằng VC++ 2005 cho phép tìm kiếm thiết bị Bluetooth, đồng
Trang 11#include <winsock2.h>
#include <Ws2bth.h>
#include <BluetoothAPIs.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "irprops.li
/* compile with:
using namespace System;
void main()
{
WORD wVersionRequested = 0x202;
WSADATA m_data;
/* Khởi tạo Windows Socket */
if (WSAStartup(wVersionRequested, &m_data) == 0) {
/* Thiết lập thông số tìm kiếm */
WSAQUERYSET querySe
a mỗi thiết bị tìm thấy:
b") /clr */
t;
izeof(queryS f(querySet);
iếm là các thiết bị Bluetooth */
up;
ề TURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | _RETURN_BLOB;
, &hLookup);
nt < maxDevices && result == 0) {
memset(&querySet, 0, s
querySet.dwSize = sizeo
/* Xác lập phạm vi tìm k
querySet.dwNameSpace = NS_BTH;
HANDLE hLook
/* Thiết lập các thông tin trả v
DWORD flags = LUP_RE
LUP_FLUSHCACHE | LUP
/* Tìm kiếm tối đa 10 thiết bị */
int maxDevices = 10;
/* Bắt đầu quá trình tìm kiếm */
int result = WSALookupServiceBegin(&querySet, flags
while (cou
et));
*/
Trang 12DWOR
sizeof(buffer);
WSAQUERYSET *pResults=
(WSAQUERYSET*)&buffer;
result=WSALooku
up,
pRe
/* I
E buffer[1000];
D bufferLength =
pServiceNext(hLook flags, &bufferLength,
sults);
n tên và địa chỉ của từng
thiết bị tìm thấy */
ole::WriteLine(pResults->lpszServiceInstanceName);
evice ID:{0}", bts->btAddr);
*/
luetooth ngày càng phong phú đáp ứng đầy đủ nhu
e, in ảnh, tai nghe Những dịch vụ
ất (UUID) và được định nghĩa sẵn trong file header Object Push có vai trò tương tự như dịch vụ
ạn mã cho phép kết nối tới dịch vụ
f.h>
if (result == 0) {
CSADDR_INFO *pCSAddr = (CSADDR_INFO*)pResults->lpcsaBuffer;
SOCKADDR_BTH *bts=(SOCKADDR_BTH*)pCSAddr->RemoteAddr.lpSockaddr;
Cons
Console::WriteLine("D
count++;
}
}
/* Kết thúc quá trình tìm kiếm
result = WSALookupServiceEnd(hLookup);
WSACleanup();
}
}
Trên ĐTDĐ hiện nay, các dịch vụ B
cầu kết nối không dây của người dùng như: truyền fil
này đều có một định danh duy nh
bthdef.h Trong đó dịch vụ OBEX
IrDA:OBEX của thiết bị hồng ngoại Dưới đây là đo
này:
#include <bthde
void main()
{
Hình 2: Lựa chọn kết nối Bluetooth