• Thứ Năm, 26/10/2006 16:33 (GMT+7)

    Xây dựng ứng dụng trên ĐTDĐ với công nghệ BREW

    BREW (Binary Runtime Environment for Wireless) là công nghệ do hãng Qualcomm phát triển. Thoạt đầu, hãng chỉ dự định BREW là một thư viện nội bộ để phát triển các ứng dụng cho thiết bị cầm tay chuyên dụng của mình. Tuy nhiên, với sự lớn mạnh không ngừng của thị trường thiết bị không dây, đặc biệt là ĐTDĐ, Qualcomm đã quyết định công khai công nghệ này và cho phép người dùng có thể tự xây dựng các ứng dụng chạy trên ĐTDĐ hỗ trợ công nghệ BREW.

    THIẾT BỊ VÀ CÔNG CỤ

    Thiết bị hỗ trợ

    Hiện nay, rất nhiều hãng sản xuất thiết bị di động lớn như Samsung, Nokia, Motorola,... đều có những sản phẩm tích hợp công nghệ BREW. Dưới đây là một vài sản phẩm ĐTDĐ dùng BREW (để biết thêm thông tin chi tiết xin tham khảo website của Qualcomm, http://brew.qualcomm.com/brew/en/developer/resources/ad/devices_man.html):

    Công cụ phát triển

    BREW SDK là bộ công cụ cho phép phát triển các ứng dụng trên nền tảng BREW với ngôn ngữ C/C++. Bộ công cụ này cung cấp đầy đủ các chức năng như mạng, đồ họa, âm thanh, văn bản hay bất cứ thứ gì mà bạn có thể tưởng tượng ra. Đi kèm với BREW SDK là một số công cụ hỗ trợ lập trình như: BREW Emulator, BREW Device Configurator, BREW MIF Editor, BREW Resource Editor.

    - BREW Emulator là công cụ mô phỏng lại cách thức hoạt động của thiết bị cầm tay thực tế. Một ứng dụng khi đã biên dịch và chạy được trên thiết bị mô phỏng thì nó hoàn toàn có thể chạy được trên thiết bị thật.

    - BREW Device Configurator là công cụ cho phép người lập trình tạo ra các Device profile cho chương trình mô phỏng. Mỗi profile chỉ ra kích thước màn hình, độ sâu bít màu, không gian nhớ và nhiều thuộc tính khác đặc trưng cho từng thiết bị khác nhau.

    - BREW MIF Editor là công cụ tạo và chỉnh sửa file MIF (Module Information File). Các đặc tả của một ứng dụng BREW như kiểu ứng dụng, loại bảo mật và một số tiêu chí khác sẽ được mô tả trong file MIF. Mỗi ứng dụng đều cần file MIF để có thể chạy trên thiết bị thật hoặc mô phỏng.

    - BREW Resource Editor là công cụ được sử dụng để tạo file tài nguyên. Một file tài nguyên là tập hợp các hình ảnh, chuỗi văn bản, thành phần giao diện đồ họa và các tài nguyên khác cần thiết cho một ứng dụng BREW.

    Phiên bản BREW SDK mới nhất hiện nay là 3.1.5.27 có thể tải về miễn phí tại http://brewx.qualcomm.com/brew/sdk/download.jsp.

    Ứng dụng BREW

    Do bị hạn chế bởi khả năng của phần cứng nên các ứng dụng BREW trên ĐTDĐ cần phải tuân thủ một số quy tắc nghiêm ngặt sau:

    • Không được phép có dữ liệu tĩnh và dữ liệu toàn cục. Các biến và dữ liệu muốn được coi là toàn cục phải được lưu trữ trong một cấu trúc duy nhất của chương trình. Đối với mảng dữ liệu lớn, chúng cần được cấp phát động và đọc từ tệp thay vì biên dịch cùng với mã nguồn.

    • Không có phép toán dấu phảy động. Phần cứng BREW hiện tại không hỗ trợ đơn vị xử lý dấu phẩy động (FPU-Floating Point Unit). Điều này có nghĩa là bạn chỉ có thể thao tác với các số nguyên. Tuy nhiên ta vẫn có thể biểu diễn giá trị phân số thông qua giá trị nguyên bằng biểu thức dấu phẩy tĩnh. Nếu ta sử dụng giá trị dấu phẩy động thì chương trình vẫn có thể hoạt động trên thiết bị mô phỏng, nhưng lại không chạy được trên thiết bị thật.

    • 500 byte bộ nhớ dành cho stack. Dung lượng này có thể thay đổi tùy thuộc vào bộ nhớ của điện thoại, tuy nhiên giá trị chuẩn nhỏ nhất hiện tại là 500 byte. Điều này buộc bạn luôn phải kiểm soát biến cục bộ và các lời gọi hàm. Hàm đệ quy nhiều tầng sẽ không phù hợp với ứng dụng loại này. Việc cấp phát quá nhiều biến trên stack có thể gây ra những lỗi nghiêm trọng. Mặc dù vậy, khi lập trình trên thiết bị mô phỏng ta ít khi quan tâm tới vùng nhớ này do bộ nhớ stack của PC lớn hơn rất nhiều so với ĐTDĐ.

    • Tất cả các chuỗi ký tự đều phải là UNICODE (2 byte). Việc biểu diễn ký tự bằng 2 byte thay vì 1 byte cho phép định nghĩa được nhiều chữ cái hơn, điều này đồng nghĩa với việc ứng dụng sẽ hỗ trợ được nhiều ngôn ngữ hơn, đáp ứng được nhu cầu của người dùng ở nhiều nước khác nhau.

    Giống như các ứng dụng C/C++ thông thường, ứng dụng BREW cũng đòi hỏi một số file nhất định tương ứng với một số thành phần cơ bản của ứng dụng:

    1. BID File (BREW ClassID File)

    BID chứa định danh của một ứng dụng BREW. Đối với các ứng dụng thương mại, bạn phải lấy định danh này từ website của Qualcomm. Để làm được điều đó bạn phải là thành viên của "Hiệp hội phát triển ứng dụng BREW" (BREW Developer) và đăng ký một tài khoản VeriSign. Với tài khoản này, bạn sẽ có được định danh cho 100 ứng dụng với giá 400USD, 500 ứng dụng là 895USD và 1000 ứng dụng là 1295USD. Tuy nhiên với các ứng dụng chạy trên thiết bị mô phỏng, định danh này chỉ cần là một số chưa được sử dụng bởi bất kỳ ứng dụng BREW nào trước đó. Dưới đây là một file HELLOBREW.BID mẫu trong chương trình:

    #ifndef HELLOBREW_BID

    #define HELLOBREW_BID

    #define AEECLSID_HELLOBREW 0x0103a4c3

    #endif

    2. Applet File

    Đây là file thực thi được biên dịch từ mã nguồn bằng một số chương trình dịch như Microsoft Visual C++, IBM WebSphere hay AMR BREW Builder. Đối với chương trình chạy trên thiết bị mô phỏng file này thực chất là một file thư viện liên kết động .dll (Dynamic Link Library), trong khi ở thiết bị thật, file này được lưu dưới dạng mở rộng .mod và phải được biên dịch bằng một chương trình đặc biệt, chẳng hạn AMR BREW Builder. Trong phạm vi bài viết này, tôi xin chỉ giới thiệu với các bạn cách biên dịch mã nguồn sang file thực thi dạng .dll bằng Microsoft Visual C++ dùng để chạy trên thiết bị mô phỏng.

    3. File tài nguyên

    Đây là file chứa các dữ liệu bên ngoài cần cho ứng dụng như hình ảnh, chuỗi văn bản, giao diện đồ họa. Bằng việc sử dụng file tài nguyên bạn sẽ dễ dàng tùy biến được ứng dụng của mình như thay đổi giao diện người dùng, độ phân giải hay ngôn ngữ. File này có phần mở rộng là .bar và được tạo ra bởi chương trình BREW Resource Editor.

    4. MIF File (Module Information File)

    Mỗi một ứng dụng đều phải có một file MIF. File MIF ngoài việc lưu giữ các thông tin như biểu tượng (icon), tiêu đề, bản quyền của ứng dụng, nó còn lưu trữ cả file BID dưới dạng nhị phân. Một ứng dụng BREW có thể có nhiều file BID tương ứng với nhiều định danh khác nhau. Điều này cho phép một ứng dụng có thể thực hiện lời gọi hàm bên trong các ứng dụng khác.

    Để thiết lập ClassID cho ứng dụng của chúng ta, tại thẻ Applet của chương trình BREW MIF Editor, bạn nhấn nút "New Applet", khi đó tại cửa sổ Hình 1, bạn chọn Specify ClassID from BID File và tìm đến file HELLOBREW.BID đã được tạo ở trên.

    Hình 1: Chọn file BID cho ứng dụng

    Tiếp đó bạn có thể thêm một số thông tin khác như biểu tượng, tiêu đề, phiên bản, quyền truy nhập,... tại các thẻ còn lại trong chương trình (Hình 2). Sau khi hoàn tất các thông tin cần thiết, bạn ghi lại nội dung vừa tạo thành file HELLOBREW.MIF

    Hình 2: Một số thông tin khác

    CHƯƠNG TRÌNH BREW ĐẦU TIÊN

    Chúng ta hãy cùng bắt đầu với một ứng dụng đơn giản là in dòng chữ "Hello BREW" trên màn hình thiết bị mô phỏng. Trước khi viết những dòng lệnh đầu tiên ta hãy xem xét cách thức hoạt động của một ứng dụng BREW.

    Ứng dụng BREW hoạt động dựa trên cơ chế sự kiện, điều này có nghĩa là chương trình sẽ hồi đáp lại các sự kiện phát sinh từ hệ điều hành. Những sự kiện này có thể được tạo ra bởi một số hành động nào đó, chẳng hạn khi người dùng nhấn một phím trên ĐTDĐ. Khi đó hệ điều hành sẽ thông báo cho ứng dụng một sự kiện tương ứng cùng với các tham số phù hợp. Ở phía chương trình, một hàm xử lý sự kiện sẽ kiểm tra sự kiện nào vừa nhận được, phân tích tham số và chịu trách nhiệm thực thi (Hình 3). Có rất nhiều loại sự kiện khác nhau, tuy nhiên ở mức độ đơn giản như ứng dụng của chúng ta, tôi sẽ mô tả bốn loại sự kiện cơ bản dưới đây:

    EVT_APP_START: Ứng dụng nhận được sự kiện này ngay khi nó được tạo ra. Điều này rất phù hợp cho việc khởi tạo các biến hoặc dữ liệu ban đầu.

    • EVT_APP_STOP: Sự kiện này được gửi đi trước khi ứng dụng kết thúc. Ta có thể đặt các đoạn mã dọn dẹp (clean-up code) như giải phóng vùng nhớ ở sự kiện này.

    • EVT_APP_SUSPEND: Đây là sự kiện sinh ra khi ứng dụng được đưa vào trạng thái chạy nền (background). Điều này có thể do nhiều nguyên nhân khác nhau như người dùng nhận cuộc gọi, hay chế độ bảo vệ bàn phím được kích hoạt.

    • EVT_APP_RESUME: Sự kiện này được sinh ra khi ứng dụng trở lại trạng thái hoạt động từ sự kiện EVT_APP_SUSPEND. Hàm xử lý ở sự kiện này thường thực hiện các công việc như vẽ lại màn hình, khởi tạo bộ đếm thời gian, kết nối mạng.

    Hình 3: Chu trình hoạt động của ứng dụng BREW

    1. Khởi tạo project

    Sau khi tải về và cài đặt thành công bộ BREW SDK 3.1.5 ở ổ đĩa C:\, biến môi trường BREWDIR được thiết lập đúng "C:\BREW 3.1.5\sdk", bạn có thể khởi tạo Project với công cụ phát triển Visual Studio 2005 như sau:

    - Lựa chọn Win32 Project từ menu New|Project|Visual C++ và đặt tên là HelloBrew.

    - Tại hộp thoại Application Settings, chọn Application type là DLL và Additional options là Empty project.

    - Thêm những file dưới đây vào project vừa tạo:

    • AEEAppGen.c, AEEModGen.c (2 file này nằm tại thư mục C:\BREW 3.1.5\sdk\src)

    • HELLOBREW.BID (vừa tạo ở trên)

    - Để đảm bảo project được biên dịch chính xác, bạn cần phải chỉnh sửa một số thông số trong hộp thoại Project|Property:

    • Thêm "$(BREWDIR)\inc" vào danh sách "Additional Include Directories". Điều này cho phép chương trình dịch tìm được các file header của BREW API.

    • Thêm AEE_SIMULATOR vào danh sách Preprocessor Definitions. Điều này đảm bảo project được biên dịch để có thể chạy trên thiết bị mô phỏng.

    2. Những dòng lệnh đầu tiên

    Để tạo file mã nguồn chương trình bạn chọn Solution Explorer|Source Files|Add|New Item|C++ File (.cpp) và đặt tên là HelloBrew.cpp.

    Mỗi ứng dụng BREW được định nghĩa bởi một cấu trúc AEEApplet trong file AEEAppGen.h. Cấu trúc này chứa những biến cơ bản nhất cần thiết cho một ứng dụng. Bạn có thể thêm những biến toàn cục vào sau cấu trúc này.

    typedef struct myapp_s

    {

    AEEApplet a; // applet header

    // biến toàn cục nếu cần

    } myapp_t

    Trong trường hợp đơn giản như ứng dụng của chúng ta thì cấu trúc tự định nghĩa myapp_s chỉ cần bao gồm cấu trúc AEEApplet. Đối với những ứng dụng phức tạp hơn, chúng ta sẽ định nghĩa các biến hoặc cấu trúc khác ở phía dưới cấu trúc AEEApplet. Như vậy, thay vì khai báo các biến toàn cục ở ngoài, ứng dụng sẽ truy cập đến các biến nằm trong cấu trúc myapp_s như những biến toàn cục thông thường. Trong quá trình thực thi, cấu trúc này sẽ được hệ điều hành chuyển cho hàm xử lý sự kiện như một tham số đầu vào.

    Tất cả các ứng dụng BREW đều bắt đầu bằng hàm AEEClsCreateInstance(), điều này giống với hàm main() trong chương trình C/C++. Bên trong hàm này, ứng dụng sẽ được khởi tạo thông qua hàm AEEApplet_New().

    /* Định nghĩa tham số: */

    /* - ClsId: giá trị ClassID được định nghĩa trong file BID */

    /* - pIShell, po: Chúng ta có thể bỏ qua ý nghĩa của 2 tham số này */

    /* - ppObj: con trỏ tới vùng nhớ được cấp phát cho cấu trúc myapp_t */

    /* - Hello_HandleEvent(): Hàm xử lý sự kiện */

    #include "AEEAppGen.h"

    #include "HELLOBREW.bid"

    int AEEClsCreateInstance(AEECLSID ClsId, IShell * pIShell, IModule * po,

    void ** ppObj)

    {

    *ppObj = NULL;

    if( ClsId == AEECLSID_HELLOBREW )

    {

    /* Khởi tạo Applet */

    if(AEEApplet_New(sizeof(myapp_t), ClsId, pIShell, po,

    (IApplet**)ppObj, (AEEHANDLER)Hello_HandleEvent, NULL) == TRUE)

    {

    return(AEE_SUCCESS);

    }

    }

    return(EFAILED);

    }

    Hàm xử lý sự kiện Hello_HandleEvent() được gọi mỗi lần có sự kiện xảy ra đối với ứng dụng. Nó chịu trách nhiệm xử lý và điều khiển chương trình tùy theo sự kiện nhận được.

    static boolean Hello_HandleEvent(IApplet * pi, AEEEvent eCode, uint16

    wParam, uint32 dwParam)

    {

    /* Con trỏ trỏ tới ứng dụng */

    myapp_t* pApp = (myapp_t*)pi;

    AEEApplet * pMe = &pApp->a;

    /* Chuỗi Unicode sẽ hiển thị */

    AECHAR szBuf[] = {H,e,l,l,o, ,B,R,E,W,\0};

    switch (eCode)

    {

    /* Xử lý sự kiện START */

    case EVT_APP_START:

    /* Xoá màn hình */

    IDISPLAY_ClearScreen(pMe->m_pIDisplay);

    /* Hiển thị dòng text lên màn hình */

    IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0,

    0, 0, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);

    /* Cập nhật màn hình */

    IDISPLAY_Update(pMe->m_pIDisplay);

    return(TRUE);

    break;

    }

    return(FALSE);

    }

    3. Chạy chương trình trên thiết bị mô phỏng

    Sau khi biên dịch đoạn mã chương trình trên ta sẽ thu được file thực thi dưới dạng thư viện liên kết động, HelloBrew.dll. File này cùng với file HELLOBREW.MIF là hai file cần thiết để ứng dụng có thể chạy được trên thiết bị mô phỏng.

    Tạo thư mục BrewExam tại ổ đĩa C:\ có cấu trúc như sau:

    Tiếp đó bạn sẽ phải cấu hình thiết bị mô phỏng như hình dưới đây rồi thực thi chương trình HelloBrew.

    Hình 4: Chương trình chạy trên thiết bị mô phỏng

    LỜI KẾT

    Trên đây, tôi vừa giới thiệu với các bạn cách viết một ứng dụng BREW đơn giản. Việc triển khai ứng dụng trên thiết bị thật đòi hỏi bạn phải có một trình dịch phù hợp như AMR BREW Builder (Bạn có thể tham khảo chương trình này tại website http://www.amr.com). Hy vọng trong thời gian tới, với sự phát triển mạnh mẽ của công nghệ CDMA, ứng dụng trên nền tảng BREW sẽ có chỗ đứng trên thị trường game di động như J2ME hiện nay.

      Hãng sản xuất     Tên thiết bị     Phiên bản BREW API  
     

     
     
        SCH-A410     2.1.3.8  
          SCH-X839     2.0.2.6  
          SCH-N395     2.0.2.6  
     

     
     
        6019     1.2.4.1  
          6235i     2.0.2  
          3152     2.1.3  
     

     
     
        C215     2.0.2.6  
          A-840     2.1.1.2  
          RAZR V3C     3.1.2  

    Nguyễn Đức Thắng
    Email: thangnd@hitekgroup.net
    -----------------------------------------------
    Tài liệu tham khảo:
    [1] http://www.qualcomm.com
    [2] http://www.amr.com
    [3] www.hitekgroup.net hoặc
    http://hitekgroup.cabspace.com

    Từ khóa: Mobile
    ID: A0610_110