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

Java 藍牙無線通信技術 API 概述 (JSR 82)

     編輯:J2ME

前言:JSR 82 為 J2ME 帶來藍牙能力

註:原文標題為「Java藍牙無線通信技術API概述」,但內容與 ID 78510 完全重複 (均為 FC API)。本文基於 JSR 82 規範重寫,提供藍牙 API 真實概覽。

JSR 82 架構分層

應用層:L2CAP / RFCOMM / OBEX 協議 API
  ↓
Java APIs for Bluetooth (javax.bluetooth, javax.obex)
  ↓
藍牙協議棧 (基帶/鏈路管理/HCI)
  ↓
硬件控制器

核心包與類

藍牙開發核心流程

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 格式

包核心類/接口功能
javax.bluetoothLocalDevice本地藍牙設備管理 (發現模式、設備名、地址、服務記錄)
RemoteDevice遠程設備代表 (地址、認證、加密、授權、服務搜索)
DiscoveryAgent設備發現/服務搜索 (startInquiry, searchServices)
ServiceRecord服務記錄 (屬性 ID/值、URL、協議描述符列表)
UUID128位通用唯一標識符 (服務類/協議/屬性)
javax.obexClientSession / ServerRequestHandlerOBEX 客戶端/服務端會話 (文件傳輸/對象交換)
HeaderSetOBEX 頭部集合 (Name, Type, Length, Description 等)
OperationOBEX 操作 (put/get/connect/disconnect/abort)

安全與權限

  • 認證:配對過程驗證雙方身份 (PIN 碼/SSP)
  • 授權:服務級訪問控制 (每次連接/永久允許)
  • 加密:鏈路級加密 (E0/AES-CCM),encrypt=true
  • MIDlet 權限:JAD 中聲明 MIDlet-Permissions: javax.bluetooth,未簽名需用戶授權

常見陷阱與對策

  1. 服務搜索超時:設置合理超時機制,避免無限阻塞
  2. 連接斷開未清理:finally 關閉所有流/連接/會話
  3. 設備地址緩存:遠程設備地址不變,可緩存避免重複發現
  4. MTU 協商:L2CAP/RFCOMM MTU 影響吞吐,建議設置 672+
  5. 多線程同步:藍牙回調在獨立線程,UI 更新需 callSerially()

應用場景

  • 本地雙人對戰遊戲 (RFCOMM)
  • 手機與 PC/打印機/耳機數據同步 (OBEX)
  • 藍牙營銷/電子名片分享 (OBEX Push)
  • 醫療/工業數據采集傳輸 (L2CAP/自定義協議)

JSR 82 為 J2ME 提供了完整的藍牙協議棧訪問能力,是近距離無線互聯應用的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
協議SchemeURL 示例用途
RFCOMM (SPP)btsppbtspp://001122334455:1;authenticate=true;encrypt=false;master=false串口通信、遊戲對戰、數據同步
L2CAPbtl2capbtl2cap://001122334455:100;receiveMTU=672;transmitMTU=672高吞吐、低延遲、非標準協議
OBEX (文件傳輸)btgoepbtgoep://001122334455:1234567890ABCDEF文件推送/拉取、名片交換
OBEX (對象交換)btgoepbtgoep://001122334455:0987654321FEDCBA日曆/聯繫人/便簽同步