每個服務屬性由 DataElement 封裝,提供型別安全的存取。強制屬性(服務註冊時自動設定)包括:ServiceRecordHandle、ServiceClassIDList、ServiceRecordState、ServiceID、ProtocolDescriptorList。重點可選屬性:ServiceName、ServiceDescription、ProviderName。
// 單例模式獲取
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
// 關鍵操作
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() 回調中獲取實例。
getMajorDeviceClass():主類別 (電話、電腦、網路裝置...)getMinorDeviceClass():次類別 (手機、筆電、印表機...)getServiceClasses():支援服務類別 (渲染、音訊、電話...)JABWT 延伸 Generic Connection Framework 支援兩種連線型別:
| 連線型別 | 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 portCN:通道號 (RFCOMM),概念類似 TCP portUUID:服務類別識別碼 (僅伺服器端使用)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 服務記錄新增/修改失敗安全連線三要素:驗證 → 授權 → 加密 (順序固定)。兩種啟用方式:
btspp://00:11:22:33:44:55:1;authenticate=true;authorize=true;encrypt=true
// 安全等級常數
ServiceRecord.NOAUTHENTICATE_NOENCRYPT // 無驗證、無加密
ServiceRecord.AUTHENTICATE_NOENCRYPT // 驗證、無加密
ServiceRecord.AUTHENTICATE_ENCRYPT // 驗證、加密
// 使用範例
String url = sr.getConnectionURL(ServiceRecord.AUTHENTICATE_ENCRYPT, false);
remoteDevice.authenticate(); // 必須最先呼叫
remoteDevice.authorize(conn);
remoteDevice.encrypt(conn, true);
LocalDevice.getProperty() 返回值掌握上述 API 體系與安全模型,即可構建健壯、安全的 Java ME 藍牙應用。