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

JSR-82 核心 API 深度解析(上):藍牙發現、UUID 與服務記錄機制

     編輯:J2ME

藍牙技術背景與 JSR-82 定位

JSR-82 定義了 Java APIs for Bluetooth Wireless Technology (JABWT),包含兩大可選包:核心藍牙 API (javax.bluetooth) 與 OBEX 物件交換 API。本文聚焦核心包,涵蓋服務發現協定 (SDP)、RFCOMM 序列埠模擬、L2CAP 邏輯鏈路控制等關鍵協定層。

典型藍牙應用角色與流程

  • 初始化:所有應用必須先初始化藍牙堆疊
  • 客戶端角色:探查周邊設備 → 對每台設備搜尋目標服務 → 建立連線消費服務
  • 服務端角色:向 SDDB 註冊服務記錄 → 廣播服務可用性 → 接受連線提供服務 → 服務結束時移除記錄

核心 API 三大支柱

  1. 發現 API:DiscoveryAgent + DiscoveryListener 回調模式
  2. 設備管理 API:LocalDevice、RemoteDevice、DeviceClass
  3. 通訊 API:基於 GCF (Generic Connection Framework) 的 L2CAPConnection 與 StreamConnection

設備發現機制詳解

// DiscoveryAgent 關鍵方法
public int startInquiry(int accessCode, DiscoveryListener listener) // 啟動探查
public void cancelInquiry(DiscoveryListener listener)               // 取消探查
public RemoteDevice[] retrieveDevices(int option)                   // 獲取已知/快取設備

// DiscoveryListener 回調
void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)       // 發現新設備
void inquiryCompleted(int discType)                                 // 探查完成(成功/錯誤/取消)

狀態流轉:startInquiry() → 多次 deviceDiscovered() → inquiryCompleted() 喚醒等待線程。

服務發現機制詳解

// 服務搜尋方法
public int searchServices(int[] attrSet, UUID[] uuidSet, RemoteDevice btDev, DiscoveryListener listener)
public int selectService(UUID uuid, RemoteDevice btDev, DiscoveryListener listener) // 單服務快速定位
public void cancelServiceSearch(int transID)

// 服務發現回調
void servicesDiscovered(int transID, ServiceRecord[] servRecord)    // 發現服務記錄
void serviceSearchCompleted(int transID, int respCode)              // 搜尋完成

每次 searchServices() 返回唯一 transID,客戶端需追蹤所有事務 ID,待全部完成後才喚醒主線程。

UUID 類別:服務唯一標識

  • 支援 16-bit、32-bit 短 UUID 及 128-bit 長 UUID
  • 不可變物件,建構子:new UUID(String, boolean)、new UUID(long)
  • Linux 產生:uuidgen -t;Windows:uuidgen
  • 格式範例:2d266186-01fb-47c2-8d9f-10b8ec891363(建構時移除連字號)

服務發現資料庫 (SDDB) 與 ServiceRecord

SDDB 由藍牙實作維護,儲存 ServiceRecord 代表可用服務。關鍵方法:

// 服務記錄屬性存取
int[] getAttributeIDs()
DataElement getAttributeValue(int attrID)

// 連線建立關鍵
String getConnectionURL(int security, boolean master) // 取得 GCF 連線 URL
RemoteDevice getHostDevice()                          // 取得服務提供設備

// 服務端註冊/更新
void populateRecord(ServiceRecord record)             // 由實作自動填充
void updateRecord(ServiceRecord record)               // LocalDevice 更新 SDDB

服務註冊流程

  1. 服務端建立 StreamConnectionNotifier (伺服器端連線工廠)
  2. 呼叫 acceptAndOpen() 觸發 SDDB 記錄插入
  3. 透過 LocalDevice.getRecord(notifier) 取得 ServiceRecord
  4. 可選:呼叫 updateRecord() 動態修改服務屬性

下篇將深入探討 DataElement、設備管理 API、L2CAP/RFCOMM 通訊架構與安全機制。

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