藍牙技術作為廣泛部署的無線 SOA 系統,其 OBEX(對象交換)協議層專為文件傳輸設計,支持文件名、類型、大小等元數據傳輸。本文基於 JSR-82(Java APIs for Bluetooth)與 JSR-75(File Connection API),完整實現一個 ImageSender MIDlet,涵蓋文件系統瀏覽、藍牙設備發現與服務搜索、OBEX 對象推送(OPP)圖像傳輸全鏈路,代碼結構清晰,適合移動嵌入式開發參考。
| 內部類 | 核心職責 | 關鍵 API |
| FileNavigator | 文件系統遍歷、文件讀取 | JSR-75 FileConnection, FileSystemRegistry |
| BTUtility | 設備發現、服務搜索 | JSR-82 LocalDevice, DiscoveryAgent, DiscoveryListener |
| FilePusher | OBEX 會話建立、文件推送 | JSR-82 ClientSession, HeaderSet, Operation |
三、關鍵模塊實現詳解
1. FileNavigator:文件系統交互
- 使用
FileSystemRegistry.listRoots() 獲取掛載點枚舉(含 SD 卡)。
- 對每個根建立
FileConnection 判斷是目錄還是文件。
- 實現
CommandListener 處理用戶選擇:目錄則遞歸列表,文件則讀取字節數組到 byte[] file。
- 關鍵代碼:
fileConn = (FileConnection) Connector.open(fileUrl);
InputStream is = fileConn.openInputStream();
file = new byte[(int) fileConn.fileSize()];
is.read(file);
is.close();
2. BTUtility:藍牙發現與服務搜索
- 繼承
Thread 避免阻塞 UI,實現 DiscoveryListener。
- 構造函數中調用
discoveryAgent.startInquiry(GIAC, this) 異步發現設備,deviceDiscovered() 收集 RemoteDevice,inquiryCompleted() 顯示設備列表。
- 用戶選擇設備後,
run() 中調用 searchServices(attrSet, uuidSet, remoteDevice, this) 搜索 OPP 服務(UUID 0x1105,屬性 0x0100 為服務名)。
serviceDiscovered() 獲取連接 URL(btConnectionURL),供 FilePusher 使用。
3. FilePusher:OBEX 圖像推送核心
- 實現
CancellableTask 配合 WaitScreen 異步執行網絡 I/O。
run() 方法完整演示 OBEX 客戶端協議流程:
connection = Connector.open(btConnectionURL); // 建立物理連接
ClientSession cs = (ClientSession) connection; // 創建 OBEX 會話
HeaderSet hs = cs.createHeaderSet();
cs.connect(hs); // 發送 Connect 操作
hs.setHeader(HeaderSet.NAME, filename); // 設置文件名
hs.setHeader(HeaderSet.TYPE, "image/jpeg"); // 設置 MIME 類型
hs.setHeader(HeaderSet.LENGTH, new Long(file.length)); // 設置文件大小
Operation putOp = cs.put(hs); // 發送 Put 操作
OutputStream os = putOp.openOutputStream();
os.write(file); // 寫入文件數據
os.close();
putOp.close();
cs.disconnect(null); // 發送 Disconnect
connection.close();
OBEX 優勢:相比 RFCOMM/L2CAP,OBEX 通過 Header 傳遞文件元數據,接收端可在接收前知曉文件信息,極大提升用戶體驗與協議健壯性。
四、界面流程與用戶體驗
- 啟動 → 顯示根目錄列表。
- 用戶導航選擇圖像文件 → 讀入內存。
- 自動啟動藍牙掃描 → 顯示周邊設備列表。
- 用戶選擇目標設備 → 自動搜索 OPP 服務。
- 顯示等待屏 → 執行 OBEX 推送 → 成功/失敗提示。
五、擴展與遷移建議
- 修改
HeaderSet.TYPE 即可發送任意文件類型(vCard、音頻、視頻等)。
- 支持文件傳輸配置文件(FTP,UUID 0x1106)實現雙向文件夾瀏覽與傳輸。
- 遷移至 Android:使用
android.bluetooth 包,OBEX 邏輯類似,但需適配 Android 異步模型與權限體系。
- 生產環境需處理:大文件分塊傳輸、斷點續傳、藍牙狀態監聽、安全配對管理。
- 上一篇文章: Java 6 編譯器 API 深度實戰:構建靜態代碼分析工具
- 下一篇文章: NetBeans Platform 6.8 快速入門:模塊化應用與 Lookup 機制實戰
Copyright ©
程式碼之家 All Rights Reserved