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

Android 藍牙經典通信實戰:手機作為主設備發送指令控制從設備模塊

     編輯:程式設計疑難解答

架構概覽

Android 手機(Central/主設備) ↔ 藍牙模塊(Peripheral/從設備,如 HC-05/06、BLE 模塊)。通信流程:掃描 → 配對/綁定 → 連接 → 建立 Socket → 發送/接收字節流。

核心權限

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ 需額外聲明 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

關鍵代碼片段

1. 獲取已配對設備並連接

BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
Set pairedDevices = btAdapter.getBondedDevices();
BluetoothDevice targetDevice = null;
for (BluetoothDevice d : pairedDevices) {
    if (d.getName().equals("HC-05")) { targetDevice = d; break; }
}

if (targetDevice != null) {
    // 異步連接,避免阻塞 UI 線程
    new Thread(() -> {
        try {
            BluetoothSocket socket = targetDevice.createRfcommSocketToServiceRecord(
                UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); // SPP 服務 UUID
            socket.connect(); // 阻塞直到連接成功
            // 連接成功,保存 socket 輸入/輸出流
            OutputStream out = socket.getOutputStream();
            InputStream in = socket.getInputStream();
            // 發送指令示例
            out.write(new byte[] {0x01, 0x02, 0x03}); // 協議自定義
            out.flush();
        } catch (IOException e) { e.printStackTrace(); }
    }).start();
}

2. 持續接收數據(獨立線程循環讀取)

new Thread(() -> {
    byte[] buffer = new byte[1024];
    int bytes;
    while (true) {
        try {
            bytes = in.read(buffer);
            if (bytes > 0) {
                final byte[] data = Arrays.copyOf(buffer, bytes);
                runOnUiThread(() -> handleReceivedData(data)); // 回調 UI 更新
            }
        } catch (IOException e) { break; } // 連接斷開
    }
}).start();

完整開源項目參考

Android 藍牙聊天/控制完整項目(含 Eclipse/Android Studio 版)

避坑指南

  • UUID 必須一致:從設備藍牙模塊燒錄固件時設置的 SPP UUID 必須與手機端一致(標準 SPP 為 00001101-0000-1000-8000-00805F9B34FB)。
  • 線程安全:Socket 連接、讀寫必須在子線程;UI 更新用 runOnUiThread 或 Handler。
  • 異常處理:connect() 可能拋出 IOException,需捕獲並提示用戶重試。
  • Android 6.0+ 運行時權限:需動態申請 ACCESS_FINE_LOCATION(掃描藍牙需要),否則 startDiscovery() 靜默失敗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved