[應用] 藍芽 BLE client/server 架構:BLE remote controller
實作目的
本文要實現一個藍芽 BLE client/server 的架構,以 Filogic 130A 開發板做為智慧音箱的 BLE server 端,另外 ESP32 的藍芽遙控器做為 BLE client 端,架構圖如下所示。在先前的文章https://han-ya.blogspot.com/2022/04/smart-speaker-on-filogic-130a-kit.html 已經實現智慧音箱的功能,不只是聲控方式,我們還希望能再增加無線遙控的功能。然而, MT7933 晶片(Cortex-M33)本身有語音運算且具有藍芽連接的能力,所以採用 BLE 來達到這項目的。本文的最後一段,有影片呈現實現的結果。
架構中,做為 BLE server 的設備,就是等待其他周邊設備的連接請求,所以連線之前需要發出廣播與配對 (advertising) 的訊號到空中。另一方面,做為 BLE client 的設備,本身要進入掃描模式,查看空中有哪些 server 設備,然後再對特定的 server 提出連線的請求。等連線成功後,client 便可以取得 server 端的 GATT 各種屬性。
圖一:BLE client / server 架構圖 |
ESP32 client
在 Arduino IDE 開發環境中,ESP32 提供不少範例程式,其中打開範例 ESP32 BLE Arduino\BLE_client,這是一個 client 端的應用,它會開啟 scan 模式,掃描周圍能提供服務的藍芽設備,並將名稱顯示在 COM port 上,如下圖所示,這個範例能掃描到藍芽位址,設備名稱,以及服務的 UUID。一般來說,client 設備上會有顯示資訊,讓我們選擇連線哪一個藍芽設備,在 ESP32 BLE 模組就先用 COM port 充當顯示囉!
圖二:BLE client 掃描設備的結果 |
如果 client 端要連線某一指定的設備,要先知道設備名稱,比如我們這個實驗打算連線的是 Filogic 130A 開發板,它廣播的名稱為 "BLE_SMTCN",那 client 端的程式被我改寫成,只要一掃瞄到這個名稱後,便向這設備進行連線的請求。連線成功後,我們看到 COM port 訊息如下,接著就可以透過 BLE 的服務 UUID 通道傳送資料到 server 端。
圖三:BLE 連線成功 |
在 ESP32 板子上,拉出四個GPIO,當作按鈕之用(分別是 Next, Previous, Stop, Play),並將按鈕的狀態發送到 BLE server 上,做到藍芽遙控的功能。
最後,我們將實現的結果拍成影片,影片中不只用藍芽來遙控音樂的播放,也可以使用聲控的方式控制音樂播放與停止。YouTube 影片連結如下:
BLE server
在藍芽 server 端是 Filogic 130A 開發板,它本身就具備多個無線連結的功能(WiFi 和 BT),底下說明如何啟用 BLE server 的功能。首先,初始化並開啟 BLE 的程式碼,如下:
printf("BT INIT MODE\n");
if ( bt_get_init_mode() != BT_BOOT_INIT_MODE_GATTS ) // 開機模式為 GATT
{
if ( bt_save_init_mode((uint8_t)BT_BOOT_INIT_MODE_GATTS) )
bt_reboot_system();
}
printf("BT INIT\n");
init_connection_info(); // 初始化
bt_create_task(); // 開啟藍芽功能
雖然 Filogic 130A 開啟了藍芽,但是這個 BLE server 還沒廣播本身服務 UUID,因此需要調用底下的函數,讓這個設備進入廣播,也就是 pairing (advertising),等待 BLE client 的連線。
printf("BLE SMTCN INIT\n");
ble_smtcn_init(); // 初始化 pair 數據
ble_smtcn_start_adv(NULL, 0); // 開始 pairing
在 SDK 的原始碼中,我們可以修改 server 設備的名稱,ble_smtcn.c 檔案裡面已經定義名稱,還有定義服務的 UUID 以及屬性的 UUID,如下所示。目前 SDK 定義的服務 UUID: 0x18AA,屬性 UUID 為 0x2AAA
手機連線 (client 端)
手機上的 APP (BLE Scanner) 也可以做為 BLE client 端的測試工具,當連線到 Filogic 130A 板子後,呈現的畫面如下圖四,我們可以清楚看到 server 端所提供的服務與 UUID,服務的屬性。該板子有提供 "Write" 屬性,代表 client 端可以上傳資料到 server 端,server 端收到資料後,便能做處理達到藍芽遙控器的功能。
圖四:手機 app -- BLE Scanner 連線畫面 |
最後,我們將實現的結果拍成影片,影片中不只用藍芽來遙控音樂的播放,也可以使用聲控的方式控制音樂播放與停止。YouTube 影片連結如下:
留言