RT-Thread qemu 環(huán)境運(yùn)行 BLE

RT-Thread qemu 環(huán)境運(yùn)行 BLE

最近在基于 RT-Thread 環(huán)境開發(fā) BLE,覺得每次都需要燒錄代碼到開發(fā)板太麻煩了,想利用 RT-Thread 的 qemu 環(huán)境開發(fā) BLE 應(yīng)用,于是我想起了之前使用 Zephyr 時,它提供的 qemu 環(huán)境能夠直接訪問物理機(jī)上的 Bluetooth Controller,也就是說,qemu 環(huán)境里運(yùn)行 Bluetooth Host,能夠直接發(fā)送 HCI 命令給 Controller,從而達(dá)到在 qemu 環(huán)境里運(yùn)行 BLE 應(yīng)用的目的。

并且這種 qemu Host + 物理機(jī) Controller 的模式,能夠直接使用物理機(jī)自帶的藍(lán)牙控制器,也可以接入外部的藍(lán)牙卡片充當(dāng)控制器,十分靈活。下面介紹如何在 RT-Thread 的 qemu 環(huán)境里接入 Bluetooth Controller 。

環(huán)境安裝

這里的環(huán)境安裝主要是編譯 bluez 的源碼,因?yàn)閷?shí)現(xiàn)該功能需要 bluez 提供的工具 btattach,btproxybtmon,一般系統(tǒng)自帶的 bluez 并未編譯這些工具,所以最好自己編譯 bluez 的源碼。如何編譯 bluez 的源碼,可以參考我之前的文章 Zephyr - Bluetooth 環(huán)境搭建 - QEMU 篇。

btproxy 配置

首先需要確定物理機(jī)內(nèi)擁有 Bluetooth Controller,如何利用外接的藍(lán)牙卡片充當(dāng) Controller 在以后的文章里介紹,在命令行輸入 hciconfig ,一般會有下述信息顯示:

這就代表系統(tǒng)內(nèi)有了 hci0 這個設(shè)備。

之后關(guān)閉 Controller,再利用 btproxy 工具創(chuàng)建一個 Bluetooth Controller 的代理(proxy),命令如下:

tangjia@FA001334:~/bluez$ sudo systemctl stop bluetooth
tangjia@FA001334:~/bluez$ sudo tools/btproxy -u -i 0

其中 -u 代表使用 Unix Server,默認(rèn)路徑為 /tmp/bt-server-bredr-i 0 代表使用 hci0 設(shè)備。上述命令執(zhí)行完后應(yīng)該會有下述顯示:

說明 btproxy 把 hci0 設(shè)備和 /tmp/bt-server-bredr 設(shè)備之間建立了聯(lián)系,其他程序可以通過 /tmp/bt-server-bredr 這個設(shè)備訪問 hci0 設(shè)備,從而訪問 Bluetooth Controller 。

qemu 配置

目前在 R 的 qemu-vexpress-a9 環(huán)境里,運(yùn)行 qemu 程序的命令為:

qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -serial stdio -sd sd.bin

只需要更改執(zhí)行命令為:

qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -sd sd.bin -serial mon:stdio -serial unix:/tmp/bt-server-bredr

即可成功在 qemu 環(huán)境里與 Bluetooth Controller 交互,下面稍微介紹下原理和注意事項。

新增加的 qemu 命令參數(shù)為 -serial mon:stdio -serial unix:/tmp/bt-server-bredr,-serial 參數(shù)的介紹為:

-serial dev redirect the serial port to char device 'dev'

這個參數(shù)將 qemu 程序的串口重定向到物理機(jī)的設(shè)備文件,

第一個-serial mon:stdio 將 qemu 里的 uart0 重定向到了物理機(jī)的 stdio 設(shè)備文件,而且在 qemu 程序里 uart0 用作 msh 命令行工具,類似 stdio,因此我們可以在物理機(jī)上看到 qemu 程序的打印數(shù)據(jù),也可以輸入命令。

第二個 -serial unix:/tmp/bt-server-bredr 是將 qemu 里的 uart1 重定向到物理機(jī)的 /tmp/bt-server-bredr 文件,而這個文件又是 hci0 設(shè)備的代理,因此從 qemu 程序的角度來看,就是使用 H4 協(xié)議,通過 uart1 去訪問 Bluetooth Controller。uart1 的波特率使用 115200 即可(未找到說明,但一般都是這樣使用)。

注意:上述兩個 -serial 的順序不能顛倒,否則 qemu 程序無法正常運(yùn)行。

測試

我使用了目前正在開發(fā)的 hm 組件來測試環(huán)境是否搭建正常,hm 是 HCI-Middleware 的簡稱,是我在開源軟件供應(yīng)鏈點(diǎn)亮計劃 - 暑期2021活動中開發(fā)的項目,它的用途是一個 HCI Transport 的通用組件,方便不同的藍(lán)牙卡片對接,能夠靈活地對接到不同的開源藍(lán)牙協(xié)議棧,由于正在開發(fā),只能簡單地測試一下 qemu 環(huán)境能否使用藍(lán)牙 Controller 。

輸入命令運(yùn)行程序:

qemu-system-arm -M vexpress-a9 -kernel rtthread.bin -nographic -serial mon:stdio -serial unix:/tmp/bt-server-bredr

可以看見 RT-Thread 環(huán)境已經(jīng)啟動了,

并且 btproxy 界面里也顯示有 client 連接了這個代理。

運(yùn)行單元測試,測試成功,

并且在 btmon 監(jiān)控 HCI 命令的界面,

可以看見發(fā)送了三條測試 HCI 命令,并且 Controller 返回了相應(yīng)數(shù)據(jù),因此 qemu 環(huán)境成功訪問物理機(jī)的 Bluetooth Controller 。


如何在搭建環(huán)境或者實(shí)際使用中遇到了問題,歡迎聯(lián)系我。

如果有對藍(lán)牙感興趣的小伙伴,歡迎加入 RT-Thread 開源社區(qū)的 BLE 小組。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容