OBEX và kỹ thuật lập trình cho cổng hồng ngoại, Bluetooth - Phần sau  
 

(Post 27/04/2007) 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, chơi game. Điều này đồng nghĩa với việ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 hoặc lưu lại những khoảnh khắc đáng nhớ trên chiếc điện thoại của mình. Dưới đây tôi xin giới thiệu hai kiểu kết nối phổ biến nhất trên hầu hết các ĐTDĐ đời mới hiện nay là cổng hồng ngoại và Bluetooth; đồng thời hướng dẫn cách lập trình trao đổi dữ liệu giữa PC và ĐTDĐ sử dụng giao thức OBEX qua hai loại kết nối này.

Hình 2: Lựa chọn kết nối Bluetooth

Phần đầu

OBEX trong điện thoại di động

1. Kết nối qua hồng ngoại bằng C#

Giao thức IrDA được hiệp hội IrDA giới thiệu lần đầu tiên năm 1994 với mục đích tăng cường khả năng kết nối không dây giữa các thiết bị qua ánh sáng hồng ngoại. Với phạm vi hoạt động lên tới 1 m, góc mở từ 15 đến 30 độ, tốc độ có thể đạt 4Mbps, cổng hồng ngoại nhanh chóng được đưa vào trong hầu hết các thiết bị không dây như ĐTDĐ, PDA...

Trước đây, việc lập trình với cổng hồng ngoại là một rào cản đối với những ai chưa quen với giao diện lập trình API (Application Programming Interface) của Windows, còn ngày nay, với phiên bản .NET 2.0, Microsoft đã đưa vào bộ Framework 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 chóng hơn. Giống như giao thức TCP/IP, client có thể thiết lập kết nối IrDA tới server bằng việc chỉ ra địa chỉ của server (tương tự như địa chỉ IP) và tên dịch vụ trên server (tương tự như TCP Port).

Mỗi chiếc ĐTDĐ đều được gắn một địa chỉ duy nhất tương ứng với cổng hồng ngoại trên đó. Đoạn mã sau cho phép xác định địa chỉ này:

using System.Net.Sockets;

void Form1_Load(object sender, EventArgs e)

{

/* Khởi tạo client */

IrDAClient irClient = new IrDAClient();

/* Tìm kiếm tối đa 2 thiết bị */

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) {

Console.WriteLine("Không tìm thấy thiết bị hồng ngoại");

}

else {

/* 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++) {

Console.WriteLine("Device Name:{0}",irDevices[i].DeviceName);

Console.WriteLine("Device ID:{0}",irDevices[i].DeviceID);

}

}

}

Các dịch vụ IrDA được xây dựng sẵn (built-in) trong ĐTDĐ có thể khác nhau mỗi nhà sản xuất. Tuy nhiên, nhìn chung hầu hết các ĐTDĐ hiện nay đều cung cấp hai dịch vụ chính là: IrDA:IrCOMM và IrDA:OBEX. Trong phạm vi bài viết này tôi chỉ đề cập đến dịch vụ IrDA:OBEX, dịch vụ cho phép PC và ĐTDĐ trao đổi dữ liệu qua giao thức OBEX. 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:

using System.Net;

using System.Net.Sockets;

void Form1_Load(object sender, EventArgs e)

{

...

/* 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, IBM, Nokia và Toshiba) đã chính thức đưa ra đặc tả kỹ thuật phiên bản 1.0A cho công nghệ Bluetooth vào năm 1999. Bluetooth hay còn có cái tên IEEE 802.15.1 hoạt động ở tần số 2,4 GHz, phạm vi phủ sóng lên tới 100 m (Class 1), tốc độ có thể đạt 3Mpbs đối với phiên bản 2.0+EDR (Enhanced Data Rate).

Kể từ phiên bản Windows XP SP1, Microsoft đã đưa vào hệ điều hành của mình mô hình lập trình Microsoft Bluetooth Stack cho phép kết nối với thiết bị Bluetooth thông qua Bluetooth socket. Một vấn đề nảy sinh là không phải tất cả các chipset Bluetooth đều hỗ trợ Microsoft Bluetooth Stack, mà phần lớn phải có driver đi kèm cũng như bộ SDK (Software Development Kit) riêng để phát triển. Chúng ta có thể tìm thấy chipset Bluetooth hỗ trợ Microsoft Bluetooth Stack trên các máy tính xách tay SONY VAIO, trong khi dòng IBM lại hỗ trợ Widcomm Bluetooth Stack (bộ SDK có giá tới 1400 USD).

Để lập trình với Bluetooth socket chúng ta phải cài bộ SDK for Windows XP SP2. 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á trình lập trình. Do phiên bản .NET 2.0 chưa hỗ trợ Bluetooth nên việc viết mã phải hoàn toàn thực hiện trên nền thư viện API có sẵn của Windows.

Cách tiếp cận thiết bị Bluetooth hoàn toàn giống như thiết bị hồng ngoại, chỉ có điều, thay vì sử dụng hàm có sẵn của .NET, bạn phải tự thân vận động. Dưới đây là đoạn mã viết bằng VC++ 2005 cho phép tìm kiếm thiết bị Bluetooth, đồng thời in ra tên và địa chỉ của mỗi thiết bị tìm thấy:

Hình 3: Các file trong thư mục điện thoại

#include

#include

#include

#pragma comment(lib, "ws2_32.lib")

#pragma comment(lib, "irprops.lib")

/* compile with: /clr */

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 querySet;

memset(&querySet, 0, sizeof(querySet));

querySet.dwSize = sizeof(querySet);

/* Xác lập phạm vi tìm kiếm là các thiết bị Bluetooth */

querySet.dwNameSpace = NS_BTH;

HANDLE hLookup;

/* Thiết lập các thông tin trả về */

DWORD flags = LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_FLUSHCACHE | LUP_RETURN_BLOB;

/* 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, &hLookup);

while (count < maxDevices && result == 0) {

BYTE buffer[1000];

DWORD bufferLength = sizeof(buffer);

WSAQUERYSET *pResults= (WSAQUERYSET*)&buffer;

result=WSALookupServiceNext(hLookup, flags, &bufferLength, pResults);

/* In tên và địa chỉ của từng thiết bị tìm thấy */

if (result == 0) {

CSADDR_INFO *pCSAddr = (CSADDR_INFO*)pResults->lpcsaBuffer;

SOCKADDR_BTH *bts=(SOCKADDR_BTH*)pCSAddr->RemoteAddr.lpSockaddr;

Console::WriteLine(pResults->lpszServiceInstanceName);

Console::WriteLine("Device ID:{0}", bts->btAddr);

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ụ Bluetooth ngày càng phong phú đáp ứng đầy đủ nhu cầu kết nối không dây của người dùng như: truyền file, in ảnh, tai nghe... Những dịch vụ này đều có một định danh duy nhất (UUID) và được định nghĩa sẵn trong file header bthdef.h. Trong đó dịch vụ OBEX Object Push có vai trò tương tự như dịch vụ IrDA:OBEX của thiết bị hồng ngoại. Dưới đây là đoạn mã cho phép kết nối tới dịch vụ này:

#include

void main()

{

...

/* Khởi tạo Windows Socket */

if (WSAStartup(wVersionRequested, &m_data) == 0) {

/* Khởi tạo Bluetooth socket */

SOCKET s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

SOCKADDR_BTH sin;

sin.addressFamily = AF_BTH;

/* Địa chỉ thiết bị đã tìm thấy ở trên */

sin.btAddr = bts->btAddr;

/* định danh dịch vụ OBEX Object Push */

sin.serviceClassId = OBEXObjectPushServiceClass_UUID;

sin.port = 0;

/* Kết nối tới dịch vụ OBEX Object Push */

int result = connect(s, (SOCKADDR*) &sin, sizeof(sin));

WSACleanup();

}

}

Như vậy bằng việc sử dụng các hàm send() và recv() cùng với giao thức OBEX, chúng ta có thể dễ dàng gửi và nhận file giữa PC và ĐTDĐ.

Lời kết

Trên đây, tôi vừa giới thiệu với các bạn hai cách kết nối không dây phổ biến nhất hiện nay phục vụ nhu cầu trao đổi dữ liệu giữa PC và ĐTDĐ. Để thuận tiện cho việc phát triển ứng dụng trên nền .NET, tôi đã viết lớp thư viện Bluetooth cho phép dễ dàng kết nối tới thiết bị Bluetooth tương tự như lớp thư viện IrDA của Microsoft (có thể tải về tại website http://www.hitekgroup.net). Chương trình demo do được viết riêng cho ĐTDĐ Sony Ericsson T610 nên có thể làm việc không hiệu quả trên các dòng máy khác. Hy vọng qua bài viết này, các bạn có thể tự xây dựng cho mình một ứng dụng quản lý file phù hợp với chiếc điện thoại của mình.

Tài liệu và chương trình demo có thể tải tại website:

Nguyễn Đức Thắng
thangnd@hitekgroup.net

(theo PC World VN)


 
 

 
     
 
Công nghệ khác:


OBEX và kỹ thuật lập trình cho cổng hồng ngoại, Bluetooth - Phần đầuJSF
Phân tích yêu cầuĐánh giá website
Phát triển ứng dụng trên Symbian OS với Carbide.c++ ExpressLINQ khai thông rào cản truy vấn
  Xem tiếp    
 
Lịch khai giảng của hệ thống
 
Ngày
Giờ
T.Tâm
TP Hồ Chí Minh
Hà Nội
 
   
New ADSE - Nhấn vào để xem chi tiết
Mừng Sinh Nhật Lần Thứ 20 FPT-APTECH
Nhấn vào để xem chi tiết
Bảng Vàng Thành Tích Sinh Viên FPT APTECH - Nhấn vào để xem chi tiết
Cập nhật công nghệ miễn phí cho tất cả cựu sinh viên APTECH toàn quốc
Tiết Thực Vì Cộng Đồng
Hội Thảo CNTT
Những khoảnh khắc không phai của Thầy Trò FPT-APTECH Ngày 20-11