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

Java ME 藍牙開發實戰:設備發現、服務查詢與 OBEX 文件傳輸完整流程

     編輯:J2ME

基於 JSR 82 (Java APIs for Bluetooth),本文演示完整 MIDlet:啟動設備發現 → 查詢 OBEX Push 服務 → 建立 ClientSession → 傳送文字文件。代碼已在 Nokia N95 與 Windows Vista 電腦間實測通過。

核心流程三步驟

  1. 設備發現:LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(GIAC, listener)
  2. 服務搜尋:agent.searchServices(null, new UUID[]{new UUID(0x1105L)}, device, listener)(0x1105 = OBEX Object Push)
  3. OBEX 傳輸:用 ServiceRecord.getConnectionURL() 取得 URL → Connector.open(url) 獲取 ClientSession → put(headers) → OutputStream.write()

關鍵代碼片段

1. 發現監聽器(實作 DiscoveryListener)


public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
    try {
        String name = btDevice.getFriendlyName(false);
        deviceList.append(name, null); // List UI
        devices.put(new Long(deviceList.size()), btDevice); // 索引→RemoteDevice
    } catch (Exception e) { handleError(e); }
}

public void inquiryCompleted(int discType) {
    if (deviceList.size() == 0) showAlert("未發現設備");
    else display.setCurrent(deviceList);
}

2. 服務發現回調


public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
    for (ServiceRecord sr : servRecord) {
        String url = sr.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
        serviceUrls.add(url); // 保存供用戶選擇
    }
}

public void serviceSearchCompleted(int transID, int respCode) {
    if (serviceUrls.isEmpty()) showAlert("無 OBEX Push 服務");
    else showServiceSelectionUI();
}

3. 發送文字文件


private void sendNote(String url, String text) {
    try {
        ClientSession cs = (ClientSession) Connector.open(url);
        cs.connect(null); // 空標頭連接

        HeaderSet hs = cs.createHeaderSet();
        hs.setHeader(HeaderSet.LENGTH, new Long(text.length()));
        hs.setHeader(HeaderSet.NAME, "myNote.txt");
        hs.setHeader(HeaderSet.TYPE, "text/plain");

        Operation op = cs.put(hs);
        OutputStream out = op.openOutputStream();
        out.write(text.getBytes());
        out.close();

        op.close();
        cs.disconnect(null);
        cs.close();
        showAlert("發送成功");
    } catch (Exception e) {
        handleError(e);
    }
}

實測注意事項

  • 配對/授權:首次連接目標設備會彈出配對確認、輸入 PIN 碼;已配對則自動連接。
  • 權限:JAD 需聲明 MIDlet-Permissions: javax.microedition.io.Connector.bluetooth.client,簽名應用體驗更佳。
  • 接收端:Windows Vista 藍牙交換資料夾預設接收;手機端需運行對應 OBEX Server MIDlet。
  • 異常處理:IOException、BluetoothConnectionException 皆需捕獲,網路不穩定時重試邏輯必要。
  • 大文件:OBEX Put 單次傳輸有大小限制,大文件需分塊或用 OBEX Session 模式。

完整 MIDlet 結構


public class BTFileSender extends MIDlet implements DiscoveryListener, CommandListener {
    private DiscoveryAgent agent;
    private List deviceList, serviceList;
    private Hashtable devices = new Hashtable(); // index -> RemoteDevice
    private Vector serviceUrls = new Vector();
    // ... UI 初始化、命令處理、上述回調實現、sendNote()...
}

擴展方向

  • OBEX Server:實作 ServerRequestHandler 接收文件,配合 SessionNotifier 監聽連入。
  • 服務記錄屬性:查詢 ServiceRecord.getAttributeIDs() 獲取服務名、描述、圖標等。
  • 安全傳輸:ServiceRecord.AUTHENTICATE_ENCRYPT 強制加密通道。
  • 多平台測試:S40、S60、BlackBerry、Android (JSR 82 移植) 行為差異較大,需逐一驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved