[應用] 藍芽 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 上,做到藍芽遙控的功能。

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 影片連結如下:

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[筆記] Visual Studio 遠端偵錯的設定步驟

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt