聊聊Android開發中的藍芽

前言
最近在實作藍芽專案的時候,經常會遇到許多關於藍芽、零碎的問題,
但這些問題又很根本的需要回到某些技術性的知識去談,所以,我想我這一陣子會多寫一些藍芽相關的技術,作為我在Android開發上的一點里程碑。
正文
藍芽
來說說最基本的藍芽是做什麼用的:
- 短距離的無線通訊技術
- 主要用於設備之間傳輸數據,通常應用於音訊設備、外圍設備、可穿戴設備和物聯網設備
作用原理:
- 頻率範圍:使用2.4GHz ISM (Industrial, Scientific, and Medical) 頻段
- 頻率跳頻技術 (Frequency Hopping Spread Spectrum, FHSS):
藍牙將 2.4 GHz 頻段分為 79 個頻道 (BLE 則是 40 個頻道)。
在傳輸數據時,藍牙設備會在頻道之間快速切換(每秒 1600 次),以減少干擾和增強安全性。
3. 設備配對:
設備之間通過配對(Pairing)進行身份驗證,交換密鑰以建立安全連接。
藍芽的分類
藍芽技術大抵分為兩大類,分別適用不同的應用場景:
- 經典藍芽(Bluetooth Classic)
- 藍芽低功耗(BLE)

藍芽可能的網絡架構
- 點對點 (Point-to-Point)
兩個設備之間直接通信,常見於藍牙耳機與手機配對。
2. 主從架構 (Piconet)
一個 主設備 (Master) 可以連接多個 從設備 (Slave),最多支援 7 個從設備。
例如,手機作為主設備連接藍牙耳機、手錶、鍵盤等多個外設。
3. 網狀網路 (Mesh Network)
主要應用於 BLE,適合大規模設備連接,例如智慧家居、工業 IoT。
設備之間可以互相中繼數據 (Relay),擴大覆蓋範圍。
好,大致上描述性的帶過「藍芽」究竟是什麼,但在技術與實作面上,擁有上述的這些知識可能並不能實際的替我們實作出可以使用的功能,我們可能需要以實物互動的方式理解藍芽的組成:
藍芽技術架構:
- 協議堆疊
藍芽的協議可以分成多個層次,從硬體層到應用層:

這些層我們在之後會有更多的篇章會提到這些概念。
其實這些知識講出來也是頗耗費腦力。
- 數據傳輸模式
- 藍芽低功耗
數據速率:125kbp-2Mbps
傳輸方式:GATT (Generic Attribute Profile),基於Attribute(屬性)的通信模式
適合場景:間歇性數據傳輸、低功耗應用(傳感器、穿戴設備)
至於GATT實際上是什麼,接下來也會多少提一下:
首先GATT的全名是Generic Attribute Profile,是一種通信架構,適用於設備之間的數據交換。
GATT的角色:

GATT的資料結構:

其實基本上開發藍芽就是去拿取服務、讀取特徵,看哪個地方有提供數據傳輸,從那個地方拿取數值。
如果拿心率的資料來作為比喻:
Heart Rate Profile (配置文件)
└── Heart Rate Service (服務)
├── Heart Rate Measurement (特徵, UUID: 0x2A37)
│ └── Client Characteristic Configuration (描述符, UUID: 0x2902)
├── Body Sensor Location (特徵, UUID: 0x2A38)
└── Heart Rate Control Point (特徵, UUID: 0x2A39)
這大概就是藍芽的基本架構,後面有機會的話會舉實際的一些例子來說,然後也有一些小東西需要注意:
MTU (Maximum Transmission Unit) 設置
什麼是MTU呢?
- MTU (最大傳輸單位) 是指在一次 BLE 數據傳輸中,單個數據包可以攜帶的最大字節數。
- BLE 默認的 MTU 為 23 Bytes,其中實際數據有效載荷 (Payload) 僅有 20 Bytes。
- 提高 MTU 可以減少數據分片,提升數據傳輸效率。
那其實在開發的過程可能需要特別注意MTU的的長度限制,如果數據長度超過當前設定的MTU時,必須將數據切割為多個小包傳輸。
比如:假設 MTU 為 50 Bytes,但要傳輸 120 Bytes 的數據,需要分片成 3 個數據包。
那以上大致上應該就是藍芽主要會碰上的一些基本知識,接下來會講的部分可能是比較接近實作會碰到的事情。
尾聲
實作藍芽的功能其實蠻常見的,今天講的內容比較算是通識與入門性,接下來的規劃大概會是一點關於藍芽在Kotlin上的實踐,還有如果用RxJava組合一下,這個功能會長怎麼樣,然後看能不能就做一個小工具去實踐這個藍芽的工具,也許之後可以用。之後這邊也會去詮釋一些基礎的通識性知識在篇章中。
不聊技術,最近準備要去走眠月線,覺得眠月線真的有夠難抽,但幸好我的同伴有提醒我可以換天,結果一次就中籤,這件事情倒是挺順利的,期待之後在這個blog分享去爬眠月線的感想。