首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

JSR-82 核心 API 深度解析(下):設備管理、通訊架構與安全機制

     編輯:J2ME

DataElement:服務屬性資料封裝

每個服務屬性由 DataElement 封裝,提供型別安全的存取。強制屬性(服務註冊時自動設定)包括:ServiceRecordHandle、ServiceClassIDList、ServiceRecordState、ServiceID、ProtocolDescriptorList。重點可選屬性:ServiceName、ServiceDescription、ProviderName。

設備管理三大核心類別

LocalDevice:本地藍牙實體

// 單例模式獲取
LocalDevice local = LocalDevice.getLocalDevice();

// 關鍵屬性存取
String getBluetoothAddress()      // MAC 位址
DeviceClass getDeviceClass()      // 設備類別 (CoD)
String getFriendlyName()          // 使用者自訂名稱
ServiceRecord getRecord(ConnectionNotifier notifier) // 取得服務記錄
void updateRecord(ServiceRecord record)              // 更新 SDDB

// 可發現模式控制
boolean getDiscoverable()
void setDiscoverable(int mode)      // GIAC / LIAC / NON_DISCOVERABLE

// 發現代理與系統屬性
DiscoveryAgent getDiscoveryAgent()
String getProperty(String propName) // 如 bluetooth.api.version, bluetooth.l2cap.receiveMTU.max

RemoteDevice:遠端設備代表

// 關鍵操作
String getBluetoothAddress()
String getFriendlyName(boolean forceRefresh) // 可能觸發遠端名稱請求
boolean authenticate()        // 配對驗證
boolean authorize(Connection conn) // 授權存取
boolean encrypt(Connection conn, boolean on) // 加密控制

// 狀態查詢
boolean isAuthenticated()
boolean isAuthorized()
boolean isEncrypted()
boolean isTrustedDevice()     // 是否為受信任設備

應用與遠端設備為一對多關係,通常在 deviceDiscovered() 回調中獲取實例。

DeviceClass:設備類別編碼 (CoD)

  • getMajorDeviceClass():主類別 (電話、電腦、網路裝置...)
  • getMinorDeviceClass():次類別 (手機、筆電、印表機...)
  • getServiceClasses():支援服務類別 (渲染、音訊、電話...)

藍牙通訊架構:GCF 擴展

JABWT 延伸 Generic Connection Framework 支援兩種連線型別:

連線 URL 格式規範

連線型別URL Scheme格式範例
L2CAP (連線導向)btl2cap://btl2cap://localhost:PSM;name=MyService
RFCOMM (序列埠模擬)btspp://btspp://00:11:22:33:44:55:CN;authenticate=true;encrypt=true

參數說明:

  • hostname:localhost 表示伺服器端;藍牙 MAC 位址表示客戶端目標
  • PSM:協定/服務多工器值 (L2CAP),概念類似 TCP port
  • CN:通道號 (RFCOMM),概念類似 TCP port
  • UUID:服務類別識別碼 (僅伺服器端使用)
  • parameters:name、authorize、authenticate、encrypt

伺服器端與客戶端連線建立

// 伺服器端:建立 Notifier 並接受連線
String url = "btspp://localhost:" + MY_UUID + ";name=MyService;authorize=false";
StreamConnectionNotifier notifier = (StreamConnectionNotifier) Connector.open(url);
StreamConnection conn = notifier.acceptAndOpen(); // 阻塞等待

// 客戶端:從 ServiceRecord 獲取連線 URL
String connURL = serviceRecord.getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT, false);
StreamConnection conn = (StreamConnection) Connector.open(connURL);

三大核心例外類別

  • BluetoothConnectionException:L2CAP/RFCOMM/OBEX 連線建立失敗
  • BluetoothStateException:嘗試無效狀態下的藍牙操作 (如未開啟藍牙時探查)
  • ServiceRegistrationException:SDDB 服務記錄新增/修改失敗

藍牙安全機制

安全連線三要素:驗證 → 授權 → 加密 (順序固定)。兩種啟用方式:

方式一:連線 URL 參數 (建立時指定)

btspp://00:11:22:33:44:55:1;authenticate=true;authorize=true;encrypt=true

方式二:ServiceRecord.getConnectionURL() 安全參數

// 安全等級常數
ServiceRecord.NOAUTHENTICATE_NOENCRYPT   // 無驗證、無加密
ServiceRecord.AUTHENTICATE_NOENCRYPT     // 驗證、無加密
ServiceRecord.AUTHENTICATE_ENCRYPT       // 驗證、加密

// 使用範例
String url = sr.getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT, false);

方式三:連線建立後動態升級 (RemoteDevice 方法)

remoteDevice.authenticate();      // 必須最先呼叫
remoteDevice.authorize(conn);
remoteDevice.encrypt(conn, true);

Sun Wireless Toolkit 2.2 藍牙模擬支援

  • Preferences Utility 新增 Bluetooth/OBEX 分頁
  • Internal Properties:設定設備探查超時
  • System Properties:定義 LocalDevice.getProperty() 返回值
  • BCC Properties:模擬藍牙控制中心設定 (友善名稱、PIN 碼、預設安全屬性)

掌握上述 API 體系與安全模型,即可構建健壯、安全的 Java ME 藍牙應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved