BLE 通訊規格(WhizToys 藍牙控制盒)
本文件定義 WhizToys 藍牙控制盒所使用的 BLE(Bluetooth Low Energy)GATT Profile,供第三方開發者與系統整合商進行對接開發。
1. WhizToys Profile 架構
WhizToys 藍牙控制盒作為 BLE 週邊設備(Peripheral),曝露廣播訊息等待手機或其他中心設備連接。連接後停止廣播。Profile 架構如下:
| 層級 | 項目 |
|---|---|
| Profile | WhizToys Profile |
| ├ Service | GAP Service(0x1800) |
| ├ Service | GATT Service(0x1801) |
| └ Service | 客製化 Service(0000FEE0-0000-1000-8000-00805F9B34FB) |
| ├ Characteristic | Layout 資訊 |
| ├ Characteristic | Sensor 資訊 |
| └ Characteristic | LED 控制資訊 |
2. GAP Service(0x1800)
標準 BLE 強制實現的服務,包含裝置名稱、外觀及連線參數。
| 特徵 | UUID | 屬性 | Value | 說明 |
|---|---|---|---|---|
| Device Name | 0x2A00 | Read | Write | 數組 | 讀取/寫入裝置名稱 |
| Appearance | 0x2A01 | Read | 數組 | 讀取裝置外觀 |
| Peripheral Preferred Connection Parameters | 0x2A04 | Read | 數組 | 讀取週邊設備期望的連線參數 |
3. GATT Service(0x1801)
GATT Profile 自定義的服務,包含 "Service Changed" 特徵。當 Service 的 GATT 屬性分佈有變(增加或移除),Server 可透過此特徵通知 Client。
4. 客製化 Service(0x FEE0)
UUID: 0000FEE0-0000-1000-8000-00805F9B34FB
WhizToys 硬體的核心服務,提供按壓感測資訊與 LED 燈光控制功能。巧拼開機後會自動進行 Mapping Layout,探索巧拼之間的相對位置關係。
此服務包含三個 Characteristics:
| 屬性 | UUID | Properties | 說明 |
|---|---|---|---|
| Layout 資訊 | 0000FEE1-0000-1000-8000-00805F9B34FB | Read | 讀取巧拼 Layout |
| 感測器資訊 | 0000FEE2-0000-1000-8000-00805F9B34FB | Notify | 通知感測變化數值 |
| LED 控制指令 | 0000FEE3-0000-1000-8000-00805F9B34FB | Write | 寫入 LED 燈控制指令 |
5. 特徵數值設定
5.1 Layout 資訊(0xFEE1)— Read
巧拼完成 Mapping 動作後進入感測及待命狀態,Layout 資訊儲存於控制盒中,重新開啟之前不會再改變。設計為一次性 Read 取得。
封包格式(20 bytes):
| Byte 0 | Byte 1 | Byte 2 | ... | Byte n-1 |
|---|---|---|---|---|
| Layout Row and Column | 4 Sensor States | 4 Sensor States | ... | Check Sum |
Layout Row and Column(Byte 0)
一個 byte 拆為兩個 4-bit:
- 高 4 bit:Layout Row(列數)
- 低 4 bit:Layout Col(行數)
例如 00010001₂ = 0x11:Row = 1, Col = 1,代表一行一列。
4 Sensor States(Byte 1 ~ n-2)
每個 byte 代表 4 個感測器的狀態,每 2 bit 代表一個感測器:
| 二進制 | 十進制 | 感測器狀態 |
|---|---|---|
00 | 0 | 無拼接巧拼 |
01 | 1 | 無按壓 |
10 | 2 | 按壓中 |
4 個感測器排列方式為橫向計算的 4 個感測器。
範例 — 兩片巧拼以 1×2 方式拼接,從資料中取得的 8 個感測器狀態排列方式為由左至右、由上到下:
資料:[00010010, 01011010, 01011010, checksum]
解析 Layout:Row=1, Col=2(一列兩行)
感測器矩陣(每片巧拼 4 個感測器):
┌──────────┬──────────┐
│ 01 01 │ 10 10 │
│ │ │
│ 01 01 │ 10 10 │
└──────────┴──────────┘
巧拼 1 巧拼 2
(無按壓) (按壓中)
Check Sum(最後 1 byte)
所有資料 byte 經 XOR 運算後的校驗值,確保資料完整傳輸。
5.2 感測器資訊(0xFEE2)— Notify
啟用 Notify 後,當巧拼被踩踏或腳離開時觸發感測器數值變化通知。
封包格式(20 bytes,每 2 bytes 為一組):
| Byte 0 | Byte 1 | Byte 2 | Byte 3 | ... |
|---|---|---|---|---|
| 感測器變化位置(一) | 4 個感測器狀態(一) | 感測器變化位置(二) | 4 個感測器狀態(二) | ... |
感測器變化位置
一個 byte 拆為兩個 4-bit:
- 高 4 bit:Layout Row Index(列索引,從 0 開始)
- 低 4 bit:Layout Col Index(行索引,從 0 開始)
例如 00010000₂ = 0x10:Row Index = 1, Col Index = 0,代表第二列第一行的巧拼。
4 個感測器狀態
一個 byte 分成 4 組各 2 bit,分別代表左上、左下、右下、右上四個位置的感測器狀態:
| 值 | 感測器狀態 |
|---|---|
00 | 無按壓 |
01 | Level 1 |
10 | Level 2 |
11 | Level 3 |
例如 00001100₂ = 0x0C:左上=無按壓、左下=無按壓、右下=Level 3、右上=無按壓。
5.3 LED 控制指令(0xFEE3)— Write
客戶端透過 Write 傳入燈光控制指令。
封包格式(20 bytes):
| Byte 0 | Byte 1~3 | Byte 4~6 | ... | Byte 3n+1 |
|---|---|---|---|---|
| 後續資料長度 | 燈光控制指令 | 燈光控制指令 | ... | Check Sum |
每組燈光控制指令為 3 bytes:
| Byte | 欄位 | 說明 |
|---|---|---|
| 0 | Location | LED 位於 Layout 中的位置 |
| 1 | Mode | 燈光控制模式 |
| 2 | Color | 顏色編號 |
Location
格式同感測器變化位置:高 4 bit = Row Index,低 4 bit = Col Index。
Mode(8 bit 拆解)
| Bit | 用途 | 範圍 | 數值含義 |
|---|---|---|---|
| 1~3 | 亮燈位置 | 0~7 | 0 整片亮、1 左上單獨亮、2 左下單獨亮、3 右下單獨亮、4 右上單獨亮、5 全部單獨亮 |
| 4 | 觸發機制 | 0~1 | 0 直接觸發一次回饋、1 踩踏後觸發 |
| 5~7 | 回饋模式 | 0~7 | 0 不指定(直接控制燈光)、1 踩踏無回饋、2 基本、3 閃爍、4 跑馬燈、5 呼吸燈、6 霓虹燈 |
| 8 | 回饋時間長短 | 0~1 | 0 短、1 長(影響閃爍及跑馬燈速度) |
當 bit 1~3 設定為 0(整片亮),無論踩踏哪個位置感測器,4 顆 LED 會一起亮燈。
Color(顏色編號)
使用 1 byte 的顏色編號索引,對應預定義的 62 色 RGB 色表:
| 編號 | R | G | B | 顏色 |
|---|---|---|---|---|
| 00 | 0 | 0 | 0 | 黑(熄滅) |
| 01 | 255 | 0 | 0 | 紅色 |
| 02~10 | 255 | 25~225 | 0 | 紅→黃漸變 |
| 11 | 255 | 255 | 0 | 黃色 |
| 12~20 | 225~25 | 255 | 0 | 黃→綠漸變 |
| 21 | 0 | 255 | 0 | 綠色 |
| 22~30 | 0 | 255 | 25~225 | 綠→淺藍漸變 |
| 31 | 0 | 255 | 255 | 淺藍 |
| 32~40 | 0 | 225~25 | 255 | 淺藍→藍漸變 |
| 41 | 0 | 0 | 255 | 藍色 |
| 42~50 | 25~225 | 0 | 255 | 藍→紫漸變 |
| 51 | 255 | 0 | 255 | 紫色 |
| 52~60 | 255 | 0 | 225~25 | 紫→紅漸變 |
| 61 | 255 | 255 | 255 | 白色 |
完整 62 色 RGB 對照表
| 編號 | R | G | B | 顏色 |
|---|---|---|---|---|
| 00 | 0 | 0 | 0 | — |
| 01 | 255 | 0 | 0 | 紅色 |
| 02 | 255 | 25 | 0 | |
| 03 | 255 | 50 | 0 | |
| 04 | 255 | 75 | 0 | |
| 05 | 255 | 100 | 0 | |
| 06 | 255 | 125 | 0 | |
| 07 | 255 | 150 | 0 | |
| 08 | 255 | 175 | 0 | |
| 09 | 255 | 200 | 0 | |
| 10 | 255 | 225 | 0 | |
| 11 | 255 | 255 | 0 | 黃色 |
| 12 | 225 | 255 | 0 | |
| 13 | 200 | 255 | 0 | |
| 14 | 175 | 255 | 0 | |
| 15 | 150 | 255 | 0 | |
| 16 | 125 | 255 | 0 | |
| 17 | 100 | 255 | 0 | |
| 18 | 75 | 255 | 0 | |
| 19 | 50 | 255 | 0 | |
| 20 | 25 | 255 | 0 | |
| 21 | 0 | 255 | 0 | 綠色 |
| 22 | 0 | 255 | 25 | |
| 23 | 0 | 255 | 50 | |
| 24 | 0 | 255 | 75 | |
| 25 | 0 | 255 | 100 | |
| 26 | 0 | 255 | 125 | |
| 27 | 0 | 255 | 150 | |
| 28 | 0 | 255 | 175 | |
| 29 | 0 | 255 | 200 | |
| 30 | 0 | 255 | 225 | |
| 31 | 0 | 255 | 255 | 淺藍 |
| 32 | 0 | 225 | 255 | |
| 33 | 0 | 200 | 255 | |
| 34 | 0 | 175 | 255 | |
| 35 | 0 | 150 | 255 | |
| 36 | 0 | 125 | 255 | |
| 37 | 0 | 100 | 255 | |
| 38 | 0 | 75 | 255 | |
| 39 | 0 | 50 | 255 | |
| 40 | 0 | 25 | 255 | |
| 41 | 0 | 0 | 255 | 藍色 |
| 42 | 25 | 0 | 255 | |
| 43 | 50 | 0 | 255 | |
| 44 | 75 | 0 | 255 | |
| 45 | 100 | 0 | 255 | |
| 46 | 125 | 0 | 255 | |
| 47 | 150 | 0 | 255 | |
| 48 | 175 | 0 | 255 | |
| 49 | 200 | 0 | 255 | |
| 50 | 225 | 0 | 255 | |
| 51 | 255 | 0 | 255 | 紫色 |
| 52 | 255 | 0 | 225 | |
| 53 | 255 | 0 | 200 | |
| 54 | 255 | 0 | 175 | |
| 55 | 255 | 0 | 150 | |
| 56 | 255 | 0 | 125 | |
| 57 | 255 | 0 | 100 | |
| 58 | 255 | 0 | 75 | |
| 59 | 255 | 0 | 50 | |
| 60 | 255 | 0 | 25 | |
| 61 | 255 | 255 | 255 | 白色 |
6. 連線流程(建議)
sequenceDiagram
participant App
participant 控制盒
App->>控制盒: 掃描 BLE 廣播
App->>控制盒: 發起連線
控制盒-->>App: 連線建立,停止廣播
App->>控制盒: 讀取 GAP Service(裝置名稱、連線參數)
App->>控制盒: 讀取 Layout 資訊(0xFEE1)
App->>控制盒: 啟用 Sensor 資訊 Notify(0xFEE2)
控制盒-->>App: 推送感測器變化資料
App->>控制盒: 寫入 LED 控制指令(0xFEE3)
7. 開發注意事項
- Mapping 時機:控制盒開機後會自動進行 Mapping Layout,此過程中請勿踩踏地墊。Mapping 完成後才能讀取 Layout 資訊。
- 資料長度:Layout 資訊、感測器資訊、LED 控制指令的封包長度皆為 20 bytes。
- Check Sum:所有封包最後一個 byte 為 XOR 校驗值,接收端應驗證資料完整性。
- Index 起始值:Row Index 與 Col Index 皆從 0 開始計算。
- Android 權限:Android 12+ 需要
BLUETOOTH_SCAN、BLUETOOTH_CONNECT權限;Android 11 以下需要ACCESS_FINE_LOCATION。 - iOS 限制:iOS 不支援讀取 BLE MAC Address,請使用廣播名稱或 Service UUID 進行裝置識別。
版本紀錄
| 版本 | 日期 | 說明 |
|---|---|---|
| 1.0 | 2023-03-02 | 原始 WhizToys 客製化藍牙規範文件 |
| 1.1 | 2026-04-08 | 轉換為線上文件格式 |
如需取得完整的 SDK 或有技術整合相關問題,請聯繫:support@seda-gtech.com.tw