手機藍牙技術的研究與應用

要:隨着無線通信技術的迅猛發展和手機的日益普及,人們對於手機近距離的數據交換(如手機名片信息交換)和聯網遊戲的需求越來越大,而藍牙技術的產生則正好滿足了用戶的這種需要。本文首先介紹了J2ME和藍牙技術的基本概念,然後分析了J2ME對藍牙應用程序開發的支持包,最後通過一個實例說明了手機藍牙程序的開發步驟。

關鍵詞:J2ME;藍牙技術

一、         J2ME概述

J2MEJAVA 2 Micro Edition,它是Java 2的組成部分,與J2SEJ2EE並稱。J2ME是一種高度優化的Java運行環境,應用於大量的消費類電子設備,如Cellular Phones(蜂窩電話)Screen Phones(可視電話)Digital Set-top Boxes(數字機頂盒)Car Navigation Systems(汽車導向系統)等,同時也廣泛被移動通信設備所採用,如移動電話、雙向尋呼機、智能卡、個人電腦記事本(Personal Organizer)和掌上電腦(Palmtop)等。J2ME技術將Java語言的與平臺無關的特性移植到小型電子設備上,允許移動無線設備之間共享應用程序。

爲了滿足消費者和嵌入式市場彈性和定製的需求,J2ME採用模塊化、可擴展的設計。J2ME體系的這種模塊化和可伸縮性是通過一個分層軟件模型來實現的,這個分層軟件模型是構建於設備本地操作系統之上的。圖1-2J2ME的軟件分層體系結構。

圖1-2:J2ME軟件分層體系結構

 

1)配置(Configuration

配置是爲一組“水平”設備的分類所定義的最精簡的公共平臺,這些設備有着相近的處理器能力和內存容量。一個配置由一個虛擬機和最小的類庫集組成,該類庫的設計爲具有相似特性而又不同的設備提供的基本功能。J2ME規範中有兩種通用的配置:連接設備配置(CDC)和限連接配置(CLDC)。CDC設計用於具有更多內存、更快的處理器和更高的網絡帶寬的設備;CLDC用於具有間歇網絡連接、小處理器和有限內存的設備。手機上使用的就是CLDC

2)簡表(Profiles

簡表是位於配置之上的一層,用來定義一個特定的“垂直”細分市場的特殊要求。實際上,它定義了某一設備家族上的API的最小集合,以保證設備之間的協同工作能力。簡表與配置的區別在於:配置必須滿足所有設備在內存、處理能力、連接性方面的最小要求;而簡表是針對用戶界面、輸入機制和數據持久性等高度的設備具體性來進行定義的。目前在CDC上定義的簡表主要有三個:基礎簡表、個人簡表和個人基礎簡表;在CLDC上定義了移動信息設備簡表MIDP

3)移動信息設備簡表MIDP

MIDPCLDC的一個補充,MIDPCLDC相結合爲移動信息設備(如手機、PDA、掌上電腦等嵌入式設備)提供更加集中的平臺。MIDP提供縱向的整合,來指示CLDC所提供的基本環境,使這些設備能採用java運行環境。

4)可選包(Optional Packages

可選包是位於簡表之上並用來擴展簡表的一套API。可選包涵蓋的功能特性是獨立於任何特定“垂直”細分市場或家族的。設計可選包的主要目的是讓這些API可以靈活地在各種各樣簡表之上被加載,以滿足更多新的應用需要。

二、         藍牙技術

隨着通信網絡的發達,各種通信電纜五花八門,不但辦公室中電纜無處不在,家用設備的發展也使居室成了電纜的世界。人們在覺得它們必不可少的同時,又傷透了腦筋,如電纜使用不便,連線頻出故障,各種電纜之間無法通用。爲了取消連線,以較低成本實現各設備間的無線通信,誕生了藍牙(Bluetooth)技術。愛立信、IBMIntelNokia和東芝五家公司於19985月聯合成立了藍牙特別利益集團(Bluetooth Special Interest Group-BSIG),並制訂了近距離無線通信技術標準——藍牙技術。它的命名借用了一千多年前一位丹麥皇帝Harald Bluetooth的名字。所謂藍牙(Bluetooth)技術,實際上是一種短距離無線電技術,利用“藍牙”技術,能夠有效地簡化掌上電腦、筆記本電腦和移動電話等移動通信終端設備之間的通信,也能夠成功地簡化以上這些設備與因特網之間的通信,從而使這些現代通信設備與因特網之間的數據傳輸變得更加迅速高效,爲無線通信拓寬了道路。它具有無線性、開放性、低功耗等特點。因此,藍牙技術一出現就引起了全球通信業界和廣大用戶的密切關注。目前藍牙功能已成爲手機的基本功能,藍牙技術也成爲手機間短距離傳送數據和聯網遊戲的基本技術。

三、         J2ME對手機藍牙應用的支持

200245, Java 開發社區( JCP) 發佈了基於J2ME 平臺的藍牙API 規範—JSR82, 這是第一個針對藍牙開發環境的標準。藍牙標準是一項開放的標準, 由藍牙技術聯盟(SIG)負責管理。藍牙技術的最新版本是2.0, 但市場上的藍牙設備大都停留在1.1 版本。

開發基於藍牙通信的應用程序通常採用客戶端-服務器的應用程序模型。服務(Service)是通信的核心所在, 一個藍牙服務就是一個作爲服務器運行的應用程序, 這個服務向客戶端提供了某種功能性的服務。例如, 客戶端可以連接打印機, 使用它提供的打印服務。開發者一旦創建了一個服務之後需要首先把這個服務註冊到服務查找數據庫(Service Discovery DataBase,SDDB) , 然後等待客戶端連接。客戶端必須首先通過服務發現協議( SDP) 查找到服務所在的設備, 然後在設備上查詢服務。一旦獲得了服務, 也就獲得了連接服務器的URL。藉助通用連接框架的方法即可獲得相關的ConConnection實例, 客戶端就可以真正地使用服務器提供的服務了。

Java 藍牙無線技術API 定義在javax.bluetooth javax.obex內。

javax.bluetooth: 包含了核心的API, 包括髮現服務, 設備管理,L2CAP等類。

javax.obex: 一個不依賴於藍牙核心API的數據交換包, 屬於高級API。這個包並不是必需的。

由於很少有主流移動設備支持OBEX, 本文主要討論javax.bluetooth 包的實現。

四、         藍牙應用實現

無論服務端還是客戶端, 藍牙程序的第一步是進行初始化。該階段主要是和LocalDevice 類打交道。首先通過getLocalDevice()方法取得LocalDevice 實例對象, 如果是服務端, 還需調用setDiscoverable()方法設置好模式。

private LocalDevice localDevice; //本地設備實例

String localBTAddress; //本地藍牙地址

String localBTName; //藍牙名稱

DiscoveryAgent agent; //發現代理

try

{localDevice = LocalDevice.getLocalDevice();

//取得本地設備實例

if(! localDevice.setDiscoverable(DiscoveryAgent.GIAC)){

//設置服務器可發現

return false; }

localBTAddress = localDevice.getBluetoothAddress();//記錄藍牙地址

localBTName = localDevice.getFriendlyName(); //記錄藍牙名稱

agent = localDevice.getDiscoveryAgent(); //取得藍牙代理

} catch(Exception e){

System.err.println(“初始化藍牙設備失敗: +e); }

一個遠端設備類RemoteDevice 的實例代表了一個遠端藍牙設備。在一個藍牙客戶端應用程序可以進行服務, 消費之前, 它必鬚髮送一個設備請求來發現遠端設備。典型的藍牙應用程序和遠端設備之間的關係是一對多。

String remoteBTAddress; //遠端藍牙地址

String remoteBTName; //遠端藍牙名稱

RemoteDevice remoteDevice; //遠端設備

StreamConnection con; //連接

try

{con = (StreamConnection)Connector.open(url); //打開連接

remoteDevice = RemoteDevice.getRemoteDevice(con); //獲取遠端設備

remoteBTAddress = remoteDevice.getBluetoothAddress(); //取得遠端設備藍牙地址

remoteBTName = remoteDevice.getFriendlyName (false); //取得遠端設備名稱

}catch(Exception e){ //處理異常}

在藍牙無線網絡中, 客戶端通常不能直接得到服務端的藍牙地址, 而需使用服務發現API 幫助客戶端搜索周圍提供的設備和服務。爲了消費一項服務, 客戶端通常需要經過三個步驟: 搜索設備, 搜索服務和連接通信。服務代理類(DiscoveryAgent) 同時支持設備與服務的發現。當設備和服務被發現時, 想得到通知的客戶端應用程序必須實現並註冊DiscoveryListener 接口, 這個接口定義了設備發現通知和服務發現通知的回調。

服務器和客戶端的連接: 在連接的URL , 主機名稱告訴連接工廠(javax.microedition.io.Connector)是否它應該創建一個客戶端或服務器端。如果使用單詞localhost 作爲主機名將定義一個服務器連接。客戶端想要連接到一個指定的的服務可以通過調用ServiceRecord.getConnectionURL() 來找到該服務連接的URL

藍牙可以支持兩種類型的連接:RFCOMML2CAP。創建一個連接均使用Connector.open(String urlName)方法, 參數urlName 代表了連接的url

使用服務端連接: 首先通過L2CAPConnectionNotifier StreamConnectionNotifier 建立一個連接, 同時創建一個藍牙服務。L2CAPConnectionNotifier notifier = (L2CAPConnectionNotifier) Connector.open(url);

這個URL是自己定義的

格式:btspp://localhost:F0E0D0C0B0A000908070605040302010;name=Picture Server;authorize=false

然後調用acceptAndOpen()方法, 該方法會自動將服務註冊到藍牙發現數據庫中(SDDB), 之後該服務就可以被客戶端搜索了。該方法同時返回一個用於通信的連接。L2CAPConnection con = notifier.acceptAndOpen();

使用客戶端連接: 雖然客戶端也是通過Connector.open(url)建立連接,

參數url 通常不是直接給出的, 而是通過serviceRecord.getConnectionURL()取得, 例如:

String url = serviceRecord.getConnectionURL(int requiredSecurity,boolean mustBeMaster);

L2CAPConnection con = (L2CAPConnection)Connector.open(url);

五、         結論

遵循藍牙協議的各種應用都保證簡單易用的安裝和操作、高效的安全機制和完全的互操作性, 從而實現隨時隨地的通信。藍牙技術將在多種領域迅速發展, 其典型應用環境包括無線辦公環境(Wireless Office)、汽車工業、信息家電、醫療設備等等, 其他應用環境如學校教育、工廠自動控制等。當前藍牙技術的開發遇到的最主要問題是設備間的互通性,由於藍牙是一項新技術, 其協議並沒有經過充分的驗證與測試,而且不同廠商對協議的理解也會有偏差, 因而開發出來的芯片或者協議棧可能無法互通。這就需要開發者們之間繼續相互合作,採用先進的協議開發技術, 進行完善的驗證與測試。目前, 在國內外一些著名大公司的全力支持下, 已經有藍牙的初期產品問世, 一些大的芯片廠商已經開始着手改進具有藍牙功能的芯片。與此同時, 一些頗具實力的軟件公司則推出了各自的協議棧軟件, 與芯片廠商合作推出藍牙技術實現的具體方案,並且不斷開發藍牙技術的典型應用。隨着技術和應用的不斷髮展, 藍牙將在人們的日常生活和工作中扮演重要角色, 更迅猛地改變人們的生活與工作方式, 提高人們的生活質量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章