程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> JSR82 API 介紹(中文)——API概覽 1

JSR82 API 介紹(中文)——API概覽 1

編輯:J2ME
藍牙是一種低成本、短距離的無線通信技術。對於那些希望創建個人局域網(PANs)的人們來說,藍牙技術已經越來越流行了。每個個人局域網都在獨立設備的周圍被動態地創建,並且為蜂窩式電話和PDA等設備提供了自動連接和即時共享數據的能力。
    為了在Java平台上開發支持藍牙技術的軟件,JCP定義了JSR82標准--Java藍牙無線技術APIs(JABWT)。
    在這篇文章中,我將介紹一些關於藍牙技術的背景,概述一下支持藍牙技術的MIDlet應用程序的典型要素,然後介紹給你核心的Java藍牙APIs。最後我們展示一些代碼來演示如何使用這些APIs。
    實際上JSR82定義了兩個獨立的可選包:核心藍牙API和對象交換(OBEX)API。這篇文章將對這兩個中更為普遍的部分--核心藍牙包Javax.bluetooth進行詳細地闡述,而OBEX API(對象交換),我們留到以後去討論。

背景
    籃牙技術由藍牙興趣小組發展,其包括:
        .無線電技術
        .協議棧
        .互操作性profiles
    藍牙無線電技術基於在工業、科學以及醫學(ISM)上公用的2.45GHz開放頻段,這一頻段無需授權並全球通用。當藍牙設備互相連接時,他們將組成一個微微網(piconet),即以一個主設備和最大7個從設備的形式動態創建網絡。藍牙也支持piconet網之間的連接:當一個piconet中的主設備成為另一個piconet的從設備時,piconet與piconet間將形成橋接。
    藍牙協議棧提供了一組的高層協議和API以完成發現服務和模擬串行I/O,還有一個關於包分割和重組的低層協議以及多路技術協議和質量服務。藍牙互操作性profiles--不要與J2ME profiles搞混--它是用來描述跨平台互操作性和一致性需求的。藍牙互操作性profiles包括三方面內容:通用訪問profile(GAP)定義了設備管理功能性;服務發現應用profiles定義了服務發現方面的內容,串口profiles定義了互操作設備和模擬串口電纜的能力。你可以通過藍牙規范(Bluetooth specification)學習這些和其它的profiles。
    藍牙棧包含一個軟件棧來映射一個固件棧(firmware),由圖1所示:
    
           圖片1:藍牙協議棧
    JSR82揭示了藍牙軟件棧給Java平台的開發者。其中引起我們興趣的是服務發現協議(SDP),用來模擬串口的串口profile RFCOMM, 向上層協議提供諸如分割和重組等導向性連接的數據轉換操作的邏輯鏈路控制及適配profile(L2CAP),以及多路技術協議。注意JABWT不支持無連接L2CAP。
    JABWT也包括對象交換API。OBEX也是高層API,它用來交換對象數據,諸如電子商業卡和日歷標簽之間以vCard和vCalendar的格式進行數據傳輸。在藍牙上,對象交換通過RFCOMM發生。OBEX在最開始時是由紅外(IrDA)引入的,並且它可以在IrDA協議、TCP/IP或者是其他協議的頂層實現。

典型的藍牙應用程序實例
    一個開啟藍牙功能的應用可以作為一個服務端或是一個客戶端-- 一個服務的提供者或是消費者,或者它可以作為一個真正的點對點終端同時表現出服務和客戶的行為。圖2所示一個藍牙規范用例:


      圖2:一個典型的具有藍牙功能的實際用例
    對這些用例的簡要介紹:
        .初始化--所有具備藍牙功能的應用程序必須先要初始化藍牙棧。
        .客戶端-- 一個客戶對遠端服務進行消費。首先它要發現所有附近的設備,然後對於每一個發現的設備搜索它感興趣的服務。
        .服務器端-- 一個為客戶端提供服務的服務器。它在服務發現數據庫(SDDB)中對客戶端進行注冊,對他們進行有效廣播。然後等待引入的連接,在他們進入時接受他們並為他們提供服務。最後,當不再需要服務時,應用程序會在服務發現數據庫(SDDB)中將他們移除。
 
    圖三:用例中參與活動的圖表:

               圖 3: 藍牙應用程序活動圖

藍牙應用程序中的元素
    圖4顯示了在MIDlet中一個典型藍牙功能應用程序中的一些元素:

           圖4: 具有藍牙功能的 MIDlet (高端組織)
    中間的是核心應用程序My Bluetooth MIDlet,它擴展自javax.microedition.midlet.MIDlet。沒有顯示出來的還有MIDlet中實現的Javax.microedition.lcdui.CommandListener以監聽從用戶接口中輸入的命令。應用程序使用的剩余的類和接口都包含在了藍牙規范中,像設備發現和服務,連接和服務消費,還有廣播和提供服務。
    使用諸如MVC等設計模式是很好的實踐。MVC把應用程序分解成用戶接口(視圖),應用程序行為和導航(控制器),以及數據(模型),當然在我們的案例中還要加上藍牙API的支撐類和接口。像將分離的客戶端、服務端行為構建成獨立的類以便以後可以重用這些組件,也是很好的設計。

Java藍牙API核心概述
    JSR82需求的"最小公分母"是 受限連接設備配置(CLDC),可靠連接設備配置(CDC)是CLDC的超集,所以JABWT可以同時在CLDC和CDC上實現,簡要地說,你可以在使用任何J2ME profile的上使用JABWT。
在javax.bluetooth中我們可以發現,Java藍牙API可以被分解為三個部分,在下面我們將討論到它們:發現、設備管理和通信。
 
藍牙發現API
    客戶端程序使用藍牙發現API以搜索在其附近的設備和服務。服務代理類(DiscoveryAgent)同時支持設備與服務的發現。當設備和服務被發現時,想得到通知的客戶端應用程序必須實現並注冊DiscoveryListener接口,這個接口定義了設備發現通知和服務發現通知的回調。
    發現代理(DiscoveryAgent)與藍牙客戶端應用程序之間是典型的一對一的關系:


    圖 5: DiscoveryAgent類和DiscoveryListener接口

設備發現API
    你使用DiscoveryAgent類的"設備發現"方法來開始和取消設備發現:
        .retrIEveDevices()重新獲得已經發現或者附近的已知設備
        .startInquiry() 啟動發現附近設備,也叫inquiry
        .cancelInquiry()取消當前進行的任何請求
    藍牙發現代理在請求階段的不同時候會分別調用DiscoveryListener(發現監聽器)不同的回調方法:
        .deviceDiscovered() 指出是否有設備被發現。
        .inquiryCompleted() 指出是否請求已經成功、觸發一個錯誤或已被取消。
    在圖6中的狀態圖表闡明了設備發現的狀態改變結束於相應的回調方法的返回。


                         圖 6: 設備發現狀態表

設備發現以調用startInquiry()函數開始。在請求進行時,藍牙發現代理會在適當的時候調用回調方法DeviceDiscovered()和inquiryCompleted()。

服務發現API
    你可以使用發現代理的服務發現方法來開始或取消服務發現:
        . selectService()啟動服務發現搜索。(原文有誤,根據API手冊應為嘗試定位一個服務)
        . searchServices()啟動服務發現搜索。
        . cancelServiceSearch()取消在正在進行中的任何的服務發現搜索操作。
    藍牙發現代理在服務發現階段的不同時候會分別調用DiscoveryListener的服務發現回調方法:
        . servicesDiscovered() 表示是否服務已被發現。
        . serviceSearchCompleted()表示服務發現是否已經完成。
    圖7闡明了服務發現的狀態改變結束於DiscoveryListener的回調方法的返回。


                 圖 7: 服務發現狀態圖表

服務發現開始於對searchServices()的調用。當服務搜索進行時,藍牙發現代理會在適當的時候回調servicesDiscovered()和 serviceSearchCompleted()方法。
    除了DiscoveryAgent和 DiscoveryListener了,你在服務發現過程中還要使用到的類有UUID,ServiceRecord以及DataElement等。

UUID類
    在藍牙中,每個服務和服務屬性都唯一地由"全球唯一標識符" (UUID)來校驗。正如它的名字所暗示的,每一個這樣的標識符都要在時空上保證唯一。UUID類可表現為短整形(16或32位)和長整形(128位)UUID。他提供了分別利用String和16位或32位數值來創建類的構造函數,提供了一個可以比較兩個UUID(如果兩個都是128位)的方法,還有一個可以轉換一個UUID為一個字符串的方法。UUID實例是不可改變的(immutable),只有被UUID標示的服務可以被發現。
    在Linux下你用一個命令uuidgen -t可以生成一個UUID值;在Windows下則執行命令uuidgen 。UUID看起來就像如下的這個形式:2d266186-01fb-47c2-8d9f-10b8ec891363。當使用生成的UUID去創建一個UUID對象,你可以去掉連字符。

SDDB和ServiceRecord接口
    在服務發現的中心是服務發現數據庫(SDDB)和服務發現協議(SDP)。SDDB由藍牙實現負責維護的數據庫。它包含了服務記錄(service records),後者代表了對客戶端有效的服務。SDP對於基於JABWT應用程序來說是透明的;可以這麼說,SDP是用於服務發現的。為重新獲取服務紀錄,一個本地設備SDP客戶端會向一個遠端設備上SDP服務器發出請求。


                      圖 8: SDDB

每一筆服務記錄都會由一個ServiceRecord的實例來表現。這個記錄包含了描述服務細節的屬性。這個類提供了幾種有用的方法:
    .getAttributeIDs() 和 getAttributeValue()方法返回服務記錄的屬性。
    .getConnectionURL()方法獲取鏈接的URL地址給服務器主機來收集服務記錄。
    .getHostDevice() 方法獲取提供服務的遠端設備。
    .populateRecord() 和 setAttributeValue()方法用來設置設備記錄的屬性。
    .setDeviceServiceClasses()方法設置服務的類。
圖9顯示了藍牙本地設備和遠端設備,以及SDDB還有服務記錄之間的關系:


       圖 9: 使用遠端設備,SDDB和服務記錄進行服務發現

    為使服務端可以被客戶端來使用,服務應用程序要通過如下方法建立一個服務記錄,首先要創建一個連接通知器(connection notifIEr),然後由調用連接通知器的acceptAndWait()方法來向SDDB中插入記錄。服務端程序能夠在適當的時候獲得記錄和更新。客戶端應用程序向遠端SDDB請求可以使用的服務,會發現服務記錄。(待續)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved