J2ME藍牙技術學習

以下轉自J2MEDEV

數據元素類
     一個服務可以有許多的屬性,一些是強制性的,其他的是可選的。一個服務屬性由一個數據元素對象來表現,這個數據元素對象提供了設置並取得屬性值的方法。
     強制性屬性是在註冊一個服務之後被自動設定的。這些屬性包括:ServiceRecordHandle,ServiceClassIDList, ServiceRecordState, ServiceID, 還有 ProtocolDescriptorList。
     如果你想要的話,還可以設置可選屬性。可選屬性有很多,但是有三個值得關注:ServiceName,ServiceDescription, 和 ProviderName。
     想得到更多的關於這些屬性的信息,請參看JABWT的文檔或藍牙規範。
設備管理API
     有3個主要的類來支持設備管理:
     .LocalDevice
     .RemoteDevice
     .DeviceClass
本地設備類
LocalDevice類標識了本地藍牙設備。藍牙應用程序和LocalDevice之間的關係是典型的一對一關係:

圖 10:本地設備類
本地設備提供了方法來返回關於本地設備的信息,並且能夠進入Bluetooth manager:
     .getBluetoothAddress()返回藍牙設備地址。
     .getDeviceClass()返回設備類。
     .getFriendlyName()返回設備友好名稱,藍牙設備名通常是用戶在藍牙控制中心爲其設置的我們將會在後面看到。
     .getRecord()返回一個指定藍牙連接的服務記錄。
     .updateRecord()方法用來爲指定的ServiceRecord更新SDDB服務記錄。
     .getDiscoverable()返回設備的可發現狀態。
     .setDiscoverable()設置設備的可發現狀態。
     .getDiscoveryAgent()返回一個參考給發現代理。
     .getProperty()返回一個設備的藍牙屬性
通過調用getProperty()方法你可以得到的屬性包括:
     .bluetooth.api.version,藍牙API版本
     .bluetooth.sd.attr.retrievable.max,一次性能夠被獲得的服務記錄屬性的最大值
     .bluetooth.connected.devices.max,支持的連接設備的最大值
     .bluetooth.sd.trans.max,同時發生的服務發現處理的最大值
     .bluetooth.l2cap.receiveMTU.max,L2CAP最大發射單元
你可以在Javadoc文檔中或是規範中學習更多的有關藍牙屬性的內容。
遠端設備類
     一個RemoteDevice的實例代表了一個遠端藍牙設備。在一個藍牙客戶端應用程序可以進行服務,消費之前,它必須發送一個設備請求來發現遠端設備。典型的藍牙應用程序和遠端設備之間的關係是一對多:
圖 11: 遠端設備類
遠端設備(RemoteDevice)提供的方法中,有些很類似於本地設備(LocalDevice)裏提供的方法:
     .getBluetoothAddress()返回藍牙地址。
     .getFriendlyName()返回藍牙設備名。
     .getRemoteDevice()返回相應的被指定藍牙連接的遠端設備。
     .authenticate()嘗試識別驗證遠端設備。
     .authorize()爲指定的藍牙連接去嘗試批准遠端設備訪問本地設備。
     .encrypt()嘗試爲指定的藍牙連接開啓或關閉加密。
     .isAuthenticated()測試是否遠端設備可以被驗證。
     .isAuthorized()測試是否遠端設備已經被藍牙控制中心授權訪問本地設備以進行藍牙連接。
     .isEncrypted()測試是否本地設備和遠端設備之間的通信被加密。
     .isTrustedDevice()測試是否遠端設備被藍牙控制中心指定爲可信任的。
DeviceClass類
     一個DeviceClass對象代表一個設備的設備類(CoD),例如一個打印機或者一部電話。CoD包括一個主類,一個輔的類,和服務類型或服務類。DeviceClass提供瞭如下方法:
     .getMajorDeviceClass()方法獲取設備的主類。
     .getMinorDeviceClass()方法獲取設備的輔類。
     .getServiceClasses()獲取設備的服務類。
當一個設備被發現,同時他的類也會被發現;當發現代理調用deviceDiscovered()時,其中一個參數就是DeviceClass。你可以通過它的getDeviceClass()方法找到本地設備的CoD。
藍牙通信
     JABWT連接是基於邏輯鏈路及適配層協議的。L2CAP是一個低級協議用來管理數據包,直到達到64k。L2CAP中的處理細節像消息分割和重組(SAR),多路連接。另外,串口Profile(SPP)提供RFCOMM,一個通過L2CAP層的串行模擬協議。
     L2CAP和RFCOMM連接都是基於通用連接框架(GCF)的,直接通向接口和類的層次去創建連接和執行IO命令。JABWT依靠L2CAP和RFCOMM協議擴展了通用連接框架(GCF)以分別支持通過L2CAPConnection 和StreamConnection類型連接。就在L2CAPConnection被JSR 82介紹的同時,StreamConnection在原始的javax.microedition.io的GCF中被定義了,它是依靠CLDC發展來的。注意,JABWT中L2CAPConnection僅支持面向連接的L2CAP連接。圖12顯示了以基於GCF形式的各接口通過藍牙網絡進行通信的過程:
圖 12: 通用連接框架和藍牙連接類型
     層次定義了L2CAP和Stream的連接和連接通知器。一個連接定義了一個連接終端,當一個連接通知器執行了服務行爲時,它會等待並接受L2CAP連接處理。
     處理L2CAP連接比處理流連接更復雜。使用L2CAP時,開發者們必須處理好最大消息的大小(即最大傳輸單位,或叫做MTU)、打斷和重組等。這些複雜的事項在開發者使用流連接的時候被隱藏了,以使他們處理藍牙連通時獲得更好的效率。
     如同所有的GCF連接類型,你可以通過調用GCF連接工廠方法javax.microedition.io.Connector創建藍牙連接。傳遞給Connector()方法的連接URL決定了要創建的連接類型:
一個L2CAPConnection連接的URL格式:

btspp://hostname:[CN | UUID];parameters

一個RFCOMMStreamConnection連接的URL格式:

btspp://hostname:[CN | UUID];parameters

細節介紹:
     .btl2cap 是爲L2CAPConnection設計的URL配置方案。
     .btspp是爲RFCOMM StreamConnection的URL配置方案。
     .hostname 既可是localhost用於架設一個服務器連接,也可是一個用於創建客戶端連接的藍牙地址。
     .PSM是協議/服務多路複用值,在一個客戶端連接服務器端時使用。在概念上是模擬一個TCP/IP端口。
     .CN是信道數值,在一個客戶端連接服務器端時使用,也是模擬TCP/IP端口。
     .UUID是UUID(通用唯一標識符)值,在一個服務器上建立服務時使用。
     .parameters(參數)包括描述服務名稱的名字和有於安全的參數:驗證、授權和加密。
服務器連接和客戶端連接
     在連接的URL中,主機名稱告訴連接工廠是否它應該創建一個客戶端異或服務器端。如果使用單詞localhost作爲主機名將定義一個服務器連接。客戶端想要連接到一個指定的的服務可以通過調用ServiceRecord.getConnectionURL()來找到該服務連接的URL。
異常
     javax.bluetooth核心API定義了三個異常類:
     .當一個藍牙L2CAP、RFCOMM或是OBEX-over-RFCOMM連接不能被成功建立會拋出BluetoothConnectionException異常。
     .一個試圖在錯誤狀態下進行藍牙操作時,會拋出BluetoothStateException異常。
     .當在本地服務發現數據庫(SDDB)中,添加或改變服務記錄失敗時,會拋出ServiceRegistrationException異常。
藍牙安全
     一個安全的藍牙連接應該是經過驗證、可選的獲得授權和被加密過的。這樣,藍牙連接在建立之初或以後就可以保證其安全性了。
注意:不是所有的藍牙實現都提供了安全連接的。
爲了在建立一個藍牙連接時使其安全,就要給javax.microedition.io.Connector在連接URL字符串上提供適當的安全參數:

btspp://hostname:[CN | UUID];authenticate=true;authorize=true;encrypt=true

Where:
     .authenticate驗證一個連接設備的身份。
     .authorize授權一個連接中的設備(已被識別)是否被允許進入。
     .encrypt指定連接需被加密。
你已經看到了想要連接到一個服務的客戶端可以通過調用ServiceRecord.getConnectionURL()方法以獲得服務連接的URL。該方法中的一個參數requiredSecurity,指定了返回的這個連接URL是否應該包含可選的authenticate和encrypt等安全參數。關於requiredSecurity的有效值爲:
.ServiceRecord.NOAUTHENTICATE_NOENCRYPT意爲authenticate=false; encrypt=false。
.ServiceRecord.AUTHENTICATE_NOENCRYPT意爲authenticate=true; encrypt=false。
.ServiceRecord.AUTHENTICATE_ENCRYPT意爲authenticate=true; encrypt=true。
例如:

...
ServiceRecord sr = ...;
...
String connURL = sr.getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT, false);
...

     如果不在建立一個連接的時候就使用這種方法保證安全性,你也可以在以後確保其安全性,這就要使用一組已知的遠端設備的安全方法:authenticate(),authorize()和 encrypt()。如果你這樣做了請注意,驗證必須在授權和加密之前進行。
藍牙控制中心
     藍牙控制中心(BCC)是設備上的一個管理軟件,它負責在作爲授權中心改變本地藍牙的設置,包括:打開或關閉藍牙無線電,設置友好名稱以便在設備發現過程中進行廣播,開啓或屏蔽設備的發現模式,設置PIN碼,設置缺省安全屬性等等。BCC看上去表現如何全看實現的具體情況。
在Sun Wireless Toolkit中對藍牙的支持
     J2ME Wireless Toolkit 2.2支持JABWT。toolkit的Preferences Utility(使用偏好)提供了新的Bluetooth/OBEX標籤以進行藍牙參數設置。在此欄下OBEX設置和三個藍牙子標籤,它們分別是:Internal Properties(內部屬性)標籤允許你設置設備搜索的超時時間,System Properties(系統屬性)標籤允許你定義一些調用LocalDevice.getProperty()方法便可得到藍牙屬性。BCC Properties

發佈了26 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章