註:原文標題為「Java藍牙無線通信技術API概述」,但內容與 ID 78510 完全重複 (均為 FC API)。本文基於 JSR 82 規範重寫,提供藍牙 API 真實概覽。
| 包 | 核心類/接口 | 功能 |
| javax.bluetooth | LocalDevice | 本地藍牙設備管理 (發現模式、設備名、地址、服務記錄) |
| RemoteDevice | 遠程設備代表 (地址、認證、加密、授權、服務搜索) |
| DiscoveryAgent | 設備發現/服務搜索 (startInquiry, searchServices) |
| ServiceRecord | 服務記錄 (屬性 ID/值、URL、協議描述符列表) |
| UUID | 128位通用唯一標識符 (服務類/協議/屬性) |
| javax.obex | ClientSession / ServerRequestHandler | OBEX 客戶端/服務端會話 (文件傳輸/對象交換) |
| HeaderSet | OBEX 頭部集合 (Name, Type, Length, Description 等) |
| Operation | OBEX 操作 (put/get/connect/disconnect/abort) |
藍牙開發核心流程
1. 本地設備初始化與可發現模式
LocalDevice local = LocalDevice.getLocalDevice();
local.setDiscoverable(DiscoveryAgent.GIAC); // 通用可發現模式
String btAddr = local.getBluetoothAddress(); // 獲取 MAC 地址
String name = local.getFriendlyName();
2. 設備發現 (Inquiry)
DiscoveryAgent agent = local.getDiscoveryAgent();
// 異步發現,實現 DiscoveryListener
agent.startInquiry(DiscoveryAgent.GIAC, new DiscoveryListener() {
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
// 發現設備,獲取設備類別
System.out.println("Found: " + btDevice.getBluetoothAddress() + " Class: " + cod);
}
public void inquiryCompleted(int discType) {
// 發現結束: INQUIRY_COMPLETED / INQUIRY_TERMINATED / INQUIRY_ERROR
}
// serviceSearchCompleted / servicesSearchCompleted 留空
});
3. 服務搜索 (SDDB 查詢)
// 搜索遠程設備上的 OBEX 文件傳輸服務
UUID[] uuids = new UUID[] { new UUID(0x1106) }; // OBEX File Transfer
int[] attrs = new int[] { 0x0100 }; // ServiceName 屬性
agent.searchServices(attrs, uuids, remoteDevice, new DiscoveryListener() {
public void servicesDiscovered(int transID, ServiceRecord[] records) {
for (ServiceRecord rec : records) {
String url = rec.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
if (url != null) {
// url 如 "btgoep://001122334455:1234567890ABCDEF"
connectToObexServer(url);
}
}
}
public void serviceSearchCompleted(int transID, int respCode) {
// RESPONSE_COMPLETED / SERVICE_SEARCH_TERMINATED / SERVICE_SEARCH_ERROR
}
// deviceDiscovered / inquiryCompleted 留空
});
4. RFCOMM 串口通信 (最常用)
// 客戶端連接
String url = "btspp://001122334455:1;authenticate=true;encrypt=false;master=false";
StreamConnection conn = (StreamConnection) Connector.open(url);
InputStream is = conn.openInputStream();
OutputStream os = conn.openOutputStream();
// 雙向數據收發...
// 服務端監聽
String serverUrl = "btspp://localhost:1101;name=MyGameServer";
StreamConnectionNotifier notifier = (StreamConnectionNotifier) Connector.open(serverUrl);
while (running) {
StreamConnection client = notifier.acceptAndOpen();
new Thread(new BtClientHandler(client)).start();
}
5. OBEX 文件傳輸/對象交換
// 客戶端發送文件
ClientSession session = (ClientSession) Connector.open("btgoep://001122334455:1234567890ABCDEF");
HeaderSet hs = session.connect(null);
if (hs.getResponseCode() == ResponseCodes.OBEX_HTTP_OK) {
hs = session.createHeaderSet();
hs.setHeader(HeaderSet.NAME, "photo.jpg");
hs.setHeader(HeaderSet.TYPE, "image/jpeg");
hs.setHeader(HeaderSet.LENGTH, fileSize);
Operation op = session.put(hs);
OutputStream os = op.openOutputStream();
// 寫入文件數據...
os.close();
op.close();
}
session.disconnect(null);
session.close();
關鍵協議 URL 格式
| 協議 | Scheme | URL 示例 | 用途 |
| RFCOMM (SPP) | btspp | btspp://001122334455:1;authenticate=true;encrypt=false;master=false | 串口通信、遊戲對戰、數據同步 |
| L2CAP | btl2cap | btl2cap://001122334455:100;receiveMTU=672;transmitMTU=672 | 高吞吐、低延遲、非標準協議 |
| OBEX (文件傳輸) | btgoep | btgoep://001122334455:1234567890ABCDEF | 文件推送/拉取、名片交換 |
| OBEX (對象交換) | btgoep | btgoep://001122334455:0987654321FEDCBA | 日曆/聯繫人/便簽同步 |
安全與權限
- 認證:配對過程驗證雙方身份 (PIN 碼/SSP)
- 授權:服務級訪問控制 (每次連接/永久允許)
- 加密:鏈路級加密 (E0/AES-CCM),
encrypt=true
- MIDlet 權限:JAD 中聲明
MIDlet-Permissions: javax.bluetooth,未簽名需用戶授權
常見陷阱與對策
- 服務搜索超時:設置合理超時機制,避免無限阻塞
- 連接斷開未清理:
finally 關閉所有流/連接/會話
- 設備地址緩存:遠程設備地址不變,可緩存避免重複發現
- MTU 協商:L2CAP/RFCOMM MTU 影響吞吐,建議設置 672+
- 多線程同步:藍牙回調在獨立線程,UI 更新需
callSerially()
應用場景
- 本地雙人對戰遊戲 (RFCOMM)
- 手機與 PC/打印機/耳機數據同步 (OBEX)
- 藍牙營銷/電子名片分享 (OBEX Push)
- 醫療/工業數據采集傳輸 (L2CAP/自定義協議)
JSR 82 為 J2ME 提供了完整的藍牙協議棧訪問能力,是近距離無線互聯應用的基石。
- 上一篇文章: J2ME JSR 75 FileConnection API 詳解:本地文件系統訪問完全指南
- 下一篇文章: NetBeans Configuration 機制實現 J2ME 多機型自動化移植
Copyright ©
程式碼之家 All Rights Reserved