實作目的
本文要實現一個藍芽 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 晶片具有藍芽連接的能力,所以採用 BLE 來達到這項目的。本文的最後一段,有影片呈現實現的結果。
架構中,做為 BLE server 的設備,連線之前需要廣播 (advertising),而 BLE client 設備要進入掃描模式,然後再對 server 提出連線的請求。連線成功後,client 便可以取得 server 端的 GATT 各種屬性。
圖一:BLE client / server 架構圖 |
ESP32 client
在 Arduino IDE 開發環境中,ESP32 提供不少範例程式,其中打開範例 ESP32 BLE Arduino\BLE_client,這是一個 client 端的應用,它會開啟 scan 模式,掃描周遭的藍芽設備,並將名稱顯示在 COM port 上,如下圖所示,能掃描到藍芽位址,設備名稱,以及服務的UUID。
圖二:BLE client 掃描設備的結果 |
如果 client 端要連線某一指定的設備,要先知道設備名稱,比如我們這個實驗打算連線的是 Filogic 130A 開發板,它廣播的名稱為 "BLE_SMTCN",那 client 端的程式只要掃瞄到這個名稱就向設備進行連線。連線成功後,COM port 訊息如下,接下來我們就可以透過 BLE 的服務 UUID 通道傳送資料到 server 端。
圖三:BLE 連線成功 |
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
手機連線 (client 端)
手機上的 APP (BLE Scanner) 也可以做為 BLE client 端的測試工具,當連線到 Filogic 130A 板子後,呈現的畫面如下圖四,我們可以清楚看到 server 端所提供的服務與 UUID,服務的屬性。該板子有提供 "Write" 屬性,代表 client 端可以上傳資料到 server 端,server 端收到資料後,便能做處理達到藍芽遙控器的功能。
圖四:手機 app -- BLE Scanner 連線畫面 |
最後,我們將實現的結果拍成影片,影片中不只用藍芽來遙控音樂的播放,也可以使用聲控的方式控制音樂播放與停止。YouTube 影片連結如下:https://youtu.be/esCSL31hE9I
全站熱搜
留言列表