J2ME實戰:藍牙聯網俄羅斯方塊(1)(自己寫的Mobile遊戲)未完待續

引言:俄羅斯方塊這款遊戲是由蘇聯的遊戲製作人阿列克謝·帕基特諾夫在1985年發明的,那年偶纔出生,這23年間相信這款老遊戲被無數新人重做過,所以說我們是站在巨人的肩上的,我們在繼承他們的成果的同時,企求我們能不斷創新,讓這款經典遊戲更好玩,讓更多的人喜歡玩!我之所以把它貼在我博客裏,是想讓自己能夠在這個項目中得到更好的鍛鍊,各位大牛不妨多拍拍磚,你們所拍的每一磚都是我前進的動力!我會把每天的項目進度都貼在這裏。。。
1.關於“藍牙技術”
藍牙技術應用了plonk and play 的概念,有點類似“即插即用”(打個比方)。藍牙技術是一種無線數據與語音通訊的開放性標準,它以近距離無線連接爲基礎,爲固定與移動設備通信環境建立一個特別連接,其有效傳輸距離是33英尺(10米)。 想詳細瞭解藍牙技術的朋友請自己Google一下,如果不想Google可以看這個“百度百科全書——藍牙技術”。
2.JSR82(JABWT)規範
02年4月5日,JCP發佈了J2ME平臺的藍牙API規範JSR82(Java藍牙無線技術APIs,Java APIs for Bluetooth Wireless Technology).JSR82規範定義的API中包括21個類和接口,最小需求是CLDC,CDC是CLDC的超集(偶的理解),所以JABWT可以同時在CLDC和CDC上實現,JSR82在覈心協議中支持L2CAP、RFCOMM、SDP和OBEX。從便於開發的角度將API分爲設備/服務發現(Discovery)、通信(Communication)和設備管理(DeviceManagement)3大類。發現類包括設備發現、服務發現和服務註冊的類和接口;通信類包括在串行剖面層次、RFCOMM層次、L2CAP層次和OBEX層次建立連接和使用連接的類和接口;設備管理類包括代表控制和管理的類和接口。這使得我們在開發的時候不再需要很多藍牙技術的細節;而是可以從功能角度來理解藍牙技術,在響應的功能類中選擇合適的API和接口。
基於JSR82的協議棧如圖1所示,Bluetooth Host Protocol Stack(software)部分爲JSR82規範提供給java平臺開發者的藍牙軟件協議棧。
 
­          圖1:基於JSR82的協議棧
典型的藍牙應用程序實例     一個開啓藍牙功能的應用可以作爲一個服務端或是一個客戶端-- 一個服務的提供者或是消費者,或者它可以作爲一個真正的點對點終端同時表現出服務和客戶的行爲。圖2所示一個藍牙規範用例:
   圖2:一個典型的具有藍牙功能的實際用例
   .初始化-- 所有具備藍牙功能的應用程序必須先要初始化藍牙棧。
   .客戶端-- 一個客戶對遠端服務進行消費。首先它要發現所有附近的設備,然後對於每一個發現的設備搜索它感興趣的服務。
   .服務器端-- 一個爲客戶端提供服務的服務器。它在服務發現數據庫(SDDB)中對客戶端進行註冊,對他們進行有效廣播。然後等待引入的連接,在他們進入時接受他們併爲他們提供服務。最後,當不再需要服務時,應用程序會在服務發現數據庫(SDDB)中將他們移除。
            圖 3: 藍牙應用程序活動圖
藍牙應用程序中的元素
圖4顯示了在MIDlet中一個典型藍牙功能應用程序中的一些元素:
      圖4: 具有藍牙功能的 MIDlet (高端組織)
    中間的是核心應用程序My Bluetooth MIDlet,它擴展自javax.microedition.midlet.MIDlet。沒有顯示出來的還有MIDlet中實現的javax.microedition.lcdui.CommandListener以監聽從用戶接口中輸入的命令。應用程序使用的剩餘的類和接口都包含在了藍牙規範中,像設備發現和服務,連接和服務消費,還有廣播和提供服務。
    使用諸如MVC等設計模式是很好的實踐。MVC把應用程序分解成用戶接口(視圖),應用程序行爲和導航(控制器),以及數據(模型),當然在我們的案例中還要加上藍牙API的支撐類和接口。像將分離的客戶端、服務端行爲構建成獨立的類以便以後可以重用這些組件,也是很好的設計。
­
3.Java藍牙API核心概述
在JSR82規範中已說過了Java藍牙API可以被分解爲三個部分:發現、設備管理和通信。
­
a.藍牙發現API
    客戶端程序使用藍牙發現API以搜索在其附近的設備和服務。服務代理類(DiscoveryAgent)同時支持設備與服務的發現。當設備和服務被發現時,想得到通知的客戶端應用程序必須實現並註冊DiscoveryListener接口,這個接口定義了設備發現通知和服務發現通知的回調。
    發現代理(DiscoveryAgent)與藍牙客戶端應用程序之間是典型的一對一的關係:
圖 5: DiscoveryAgent類和DiscoveryListener接口
b.設備發現API
    你使用DiscoveryAgent類的"設備發現"方法來開始和取消設備發現:
        .retrieveDevices()重新獲得已經發現或者附近的已知設備
        .startInquiry() 啓動發現附近設備,也叫inquiry
        .cancelInquiry()取消當前進行的任何請求
    藍牙發現代理在請求階段的不同時候會分別調用DiscoveryListener(發現監聽器)不同的回調方法:
        .deviceDiscovered() 指出是否有設備被發現。
        .inquiryCompleted() 指出是否請求已經成功、觸發一個錯誤或已被取消。
    圖6中的狀態圖表闡明瞭設備發現的狀態改變結束於相應的回調方法的返回。
­
圖 6: 設備發現狀態表
設備發現以調用startInquiry()函數開始。在請求進行時,藍牙發現代理會在適當的時候調用回調方法DeviceDiscovered()和inquiryCompleted()。
c.服務發現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請求可以使用的服務,會發現服務記錄.
未完待續。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章