# 應用app的
# 1. 概述
## 1.1 項目背景
這是一個運行在RK3566設備上的Android BLE外圍設備服務,實現了藍牙從模式功能,允許設備作為外圍設備被其他BLE中心設備掃描和連接。
## 1.2 核心功能
BLE廣播和掃描響應
GATT服務器實現
多設備連接管理
數據收發功能
服務狀態監控
# 2. 整體架構
## 2.1 架構層次
┌─────────────────────────────────────────┐
│ 應用層 (UI/業務邏輯) │
├─────────────────────────────────────────┤
│ 服務層 (BlePeripheralService) │
├─────────────────────────────────────────┤
│ Android BLE API 層 │
├─────────────────────────────────────────┤
│ 藍牙協議棧 (Bluetooth Stack) │
├─────────────────────────────────────────┤
│ 硬件驅動層 │
└─────────────────────────────────────────┘
## 2.2 核心組件關係
MainActivity ───綁定──→ BlePeripheralService ───使用──→ Android BLE API
│ │ │
│ ├── BluetoothLeAdvertiser │
│ ├── BluetoothGattServer │
│ └── BluetoothManager │
│ │
└─────────────廣播通信─────────┐ │
↓ │
System Bluetooth Stack ←─┘
# 3. 詳細架構分析
## 3.1 服務生命週期管理
// 核心生命週期方法
onCreate() → onStartCommand() → onBind() → 運行中 → onDestroy()
關鍵設計點:
使用START_STICKY確保服務被系統殺死後自動重啓
前台服務設計,避免被系統回收
完整的資源清理機制
## 3.2 BLE初始化流程
initializeBlePeripheral()
├── 權限檢查 (checkRequiredPermissions)
├── 藍牙狀態檢查與啓用
├── BLE能力診斷 (diagnoseBleCapabilities)
├── 設備名稱設置 (setBluetoothName)
├── GATT服務器初始化 (initializeGattServer)
└── 延遲啓動廣播 (500ms延遲)
## 3.3 廣播管理子系統
3.3.1 廣播配置
java
AdvertiseSettings.Builder()
.setAdvertiseMode(ADVERTISE_MODE_LOW_LATENCY) // 低延遲模式
.setConnectable(true) // 可連接
.setTxPowerLevel(ADVERTISE_TX_POWER_HIGH) // 高發射功率
3.3.2 數據優化策略
廣播數據:僅包含服務UUID,減少數據大小
掃描響應數據:包含設備名稱,提高發現性
大小估算:實時計算數據包大小,避免超出31字節限制
3.3.3 狀態管理
java
mAdvertising標誌位管理
├── 啓動成功: onStartSuccess() → mAdvertising = true
├── 啓動失敗: onStartFailure() → mAdvertising = false
└── 連接後: stopAdvertisingTemporarily() → mAdvertising = false
## 3.4 GATT服務器架構
### 3.4.1 服務定義
java
BluetoothGattService (SERVICE_UUID)
├── 可讀特徵 (READ_CHAR_UUID)
│ └── 權限: READ
├── 可寫特徵 (WRITE_CHAR_UUID)
│ └── 權限: WRITE | WRITE_NO_RESPONSE
└── 通知特徵 (NOTIFY_CHAR_UUID)
├── 權限: NOTIFY
└── 描述符: CLIENT_CHARACTERISTIC_CONFIG
### 3.4.2 回調處理機制
java
BluetoothGattServerCallback
├── onConnectionStateChange() // 連接狀態管理
├── onCharacteristicReadRequest() // 讀取請求處理
├── onCharacteristicWriteRequest() // 寫入請求處理
└── onDescriptorWriteRequest() // 描述符配置處理
## 3.5 連接管理子系統
### 3.5.1 多設備支持
java
ConcurrentHashMap<String, BluetoothDevice> mConnectedDevices
├── 鍵: 設備地址 (MAC地址)
└── 值: BluetoothDevice對象
### 3.5.2 連接狀態機
text
未連接 ──連接成功──→ 已連接 ──斷開連接──→ 未連接
│ │
└────自動重連(2秒後)─────────────┘
## 3.6 數據通信層
### 3.6.1 數據發送
java
sendDataToClient()
├── 數據長度檢查 (最大512字節)
├── 特徵值設置
└── 通知發送 (notifyCharacteristicChanged)
## 3.6.2 數據接收
java
onCharacteristicWriteRequest()
├── 數據解碼 (UTF-8)
├── 業務邏輯處理
└── 廣播通知UI層
# 4. 關鍵設計模式
## 4.1 Binder模式
java
// 服務綁定接口設計
public class LocalBinder extends Binder {
BlePeripheralService getService();
boolean isAdvertising();
boolean isConnected();
boolean sendDataToClient(String data);
// ... 其他公共方法
}
## 4.2 回調模式
java
// 異步操作回調
AdvertiseCallback mAdvertiseCallback
BluetoothGattServerCallback mGattServerCallback
## 4.3 觀察者模式
java
// 通過廣播通知UI更新
Intent intent = new Intent("BLE_ADVERTISING_STARTED");
sendBroadcast(intent);
# 5. 性能優化策略
## 5.1 廣播優化
間隔優化:使用ADVERTISE_MODE_LOW_LATENCY提高發現性
功率優化:使用ADVERTISE_TX_POWER_HIGH增加覆蓋範圍
數據優化:分離廣播數據和掃描響應數據
## 5.2 內存優化
使用ConcurrentHashMap實現線程安全的連接管理
及時的資源釋放和連接清理
避免內存泄漏的Handler使用
## 5.3 功耗優化
java
// 連接後停止廣播以節省電量
stopAdvertisingTemporarily()
// 斷開後延遲重連,避免頻繁廣播
startDelayedAdvertising() // 2秒延遲
# 6. 錯誤處理機制
## 6.1 分層錯誤處理
java
// 權限層錯誤
SecurityException捕獲 → 權限申請提示
// BLE API層錯誤
AdvertiseCallback.onStartFailure() → 錯誤分類處理
// 業務邏輯層錯誤
try-catch塊 → 優雅降級
## 6.2 錯誤恢復策略
java
// 廣播失敗重試機制
shouldRetryAdvertising(errorCode)
├── 可恢復錯誤: ADVERTISE_FAILED_INTERNAL_ERROR → 重試
├── 不可恢復錯誤: ADVERTISE_FAILED_DATA_TOO_LARGE → 不重試
└── 重試間隔: 10秒
# 7. 安全設計
## 7.1 權限管理
java
// 動態權限檢查
checkRequiredPermissions()
├── Android 12+: BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT
└── 兼容性處理
## 7.2 數據安全
特徵權限嚴格控制
輸入數據驗證和長度限制
異常操作日誌記錄
# 8. 擴展性設計
## 8.1 服務接口擴展
java
// 易於擴展的公共接口
public Bundle getServiceStatus();
public List<String> getConnectedDeviceNames();
public void restartAdvertising();
## 8.2 特徵擴展
java
// 支持添加新特徵
private BluetoothGattService createGattService() {
// 可在此添加新特徵
}
# 9. 測試和調試支持
## 9.1 診斷功能
java
// 詳細的調試信息輸出
diagnoseBleCapabilities()
diagnoseAdvertisingStatus()
checkAdvertisingStatus()
## 9.2 狀態監控
java
// 完整的服務狀態報告
getServiceStatusInfo()
├── 硬件狀態
├── 服務狀態
├── 連接狀態
└── 廣播狀態
# 10. 兼容性考慮
## 10.1 Android版本適配
java
// API級別檢查
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 通知渠道創建
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// 新權限模型
}
## 10.2 設備兼容性
java
// BLE能力檢查
mBluetoothAdapter.isMultipleAdvertisementSupported()
getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
# 11 權限要求
xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />