1.業界流行的嵌入式端Web伺服器
在嵌入式平臺中,內建Web介面通常用於裝置配置、監控和控制。以下是一些流行的嵌入式平臺Web介面框架:
-
uIP Web伺服器框架
- 一個非常輕量級的Web伺服器框架,專為嵌入式系統設計,支援小型TCP/IP協議棧。
-
ESP8266/ESP32 Web框架
- 針對ESP8266和ESP32 WiFi模組的Web框架,如ESP8266Web框架和ESPAsyncWebServer等。
-
MicroWebSrv
- 一個為嵌入式系統設計的輕量級Web伺服器,支援C++編寫,適用於多種平臺。
-
mongoose
- 一個輕量級的網路庫,提供了HTTP、WebSocket和MQTT客戶端和伺服器功能。
-
TASMOTA
- 一個基於ESP8266/ESP32的開源韌體,提供了豐富的Web介面,用於智慧家居裝置。
-
WebThings Gateway
- 一個基於W3C Web of Things標準的開源框架,用於構建連線物理裝置和Web應用的閘道器。
-
Node-RED
- 一個基於流的開發工具,用於連線硬體裝置、API和線上服務,支援在嵌入式裝置上執行。
-
OpenWrt/LEDE
- 一個基於Linux的開源韌體專案,提供了豐富的Web介面和網路功能。
-
Contiki
- 一個開源的物聯網作業系統,提供了輕量級的Web伺服器實現。
-
LwIP
- 一個輕量級的TCP/IP協議棧,支援HTTP伺服器功能。
-
FreeRTOS Web server
- 一個為FreeRTOS作業系統設計的Web伺服器,用於建立基於Web的介面。
-
Qt for Embedded Linux
- Qt提供了跨平臺的C++圖形使用者介面框架,也可用於嵌入式Linux裝置。
-
Pimoroni's Picolipo
- 一個為樹莓派Pico和其他RP2040裝置設計的微型Web伺服器庫。
-
IoT.js
- 一個基於JavaScript的輕量級物聯網平臺,支援Node.js API。
-
Express.js with Node.js
- 雖然Express.js通常用於伺服器端開發,但也可以在嵌入式裝置上執行Node.js來建立Web介面。
-
Boa
- Boa是一個非常輕量級的 HTTP 伺服器軟體,最初由 Paul Phillips 為嵌入式系統和簡單 web 服務而開發。它以其小尺寸、易於配置和使用而聞名,特別適合資源受限的環境,如小型微控制器或嵌入式裝置。
2.Boa
2.1 Boa 的特點
- 輕量級 :Boa 非常小,通常編譯後的二進位制檔案大小隻有幾十KB,非常適合資源受限的系統。
- 易於配置 :Boa 的配置檔案簡單,易於理解和修改,使得它在嵌入式系統中快速部署變得容易。
- 支援基本的 HTTP 功能 :Boa 支援基本的 HTTP 功能,包括 GET 和 POST 請求,以及靜態檔案的伺服器功能。
- 安全性 :雖然 Boa 提供了基本的安全特性,但由於其簡單性,它可能不適用於需要高階安全特性的應用。
- 跨平臺 :Boa 可以在多種作業系統上執行,包括 Linux、Windows 和其他 Unix 系統。
- 可擴充套件性 :儘管 Boa 本身功能有限,但它可以透過 CGI 指令碼或嵌入式 Perl 指令碼進行擴充套件。
2.2 Boa的使用場景
- 嵌入式裝置 :在智慧家居裝置、工業控制系統等嵌入式裝置中提供 web 介面。
- 小型伺服器 :在不需要複雜功能的小型伺服器上提供簡單的 web 服務。
- 測試和開發 :在開發和測試階段,Boa 可以作為一個快速搭建的本地伺服器。
2.3 Boa的下載,編譯和安裝
安裝 Boa 通常涉及下載原始碼,然後使用 make 命令進行編譯和安裝。配置 Boa 涉及編輯其配置檔案,通常是一個名為 boa.conf
的檔案,其中可以設定監聽埠、文件根目錄、CGI 指令碼目錄等。
2.3.1 下載boa原始碼
官網網址
http://www.boa.org/
當前最新版本0.94.13
2.3.2 boa原始碼的編譯
將boa-0.94.13.tar.gz解壓後,進入src目錄下:
tar -xvf boa-0.94.13.tar.gz
cd ./boa-0.94.13/src/
配置我本地環境的交叉編譯器
source /opt/environment-setup-cortexa53-crypto-fsl-linux
./configure
執行log:
user@user:~/soft/boa-0.94.13/src$ ./configure
....
checking for fcntl.h... yes
checking for sys/fcntl.h... yes
checking for limits.h... yes
checking for sys/time.h... yes
checking for sys/select.h... yes
checking for getopt.h... yes
checking for working const... yes
checking for uid_t in sys/types.h... (cached) {ac_cv_type_uid_t=yes}
checking for pid_t... yes
checking whether time.h and sys/time.h may both be included... yes
checking whether setvbuf arguments are reversed... configure: error: can not run test program while cross compiling
此處最後一句遇到環境檢查報錯,表示configure指令碼在檢測某些函式的行為時無法交叉編譯,嘗試了以下幾種方法,都沒有效果
# 指定交叉編譯工具
./configure --host=arm-linux-gnueabihf
# 使用--disable-checking
./configure --disable-checking
# 禁用測試
CFLAGS="-DSETVBUF_ARGS_REVERSED=0" ./configure
最後只能將編譯setvbuf測試這一段測試程式註釋掉,暫時先配置透過
編譯原始碼
make
遇到以下報錯:
修改程式碼:
開啟compat.h檔案
再開啟boa.c檔案,將以下部分註釋掉
清理編譯環境:
make clean
重新編譯
make
又報以下錯誤
修改log.c
重新編譯後,編譯成功
user@user:~/soft/boa-0.94.13/src$ file boa
boa: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=20cb5a73822daf5e028add0b20892b31464636b3, for GNU/Linux 3.14.0, with debug_info, not stripped
2.3.3 boa部署到目標平臺中
編譯出來的可執行程式佔用空間大小為:
-rwxrwxr-x 1 user user 320680 Nov 4 14:03 boa
如果想最佳化空間佔用,可以去除除錯資訊,減小體積:
user@user:~/soft/boa-0.94.13/src$ aarch64-fsl-linux-strip boa
# 最佳化後佔用體積
-rwxrwxr-x 1 user user 85248 Nov 4 14:21 boa
先在pc環境中準備好boa的執行環境後再傳送到目標平臺上,我想將整個boa執行環境放到目標平臺的/opt環境下,需要做以下工作:
1.按下圖修改原始碼defines.h中的SERVER_ROOT,然後重新編譯boa可執行程式
2.準備執行環境
新建立一個boa的資料夾,組織執行環境的目錄結構如下:
user@user:~/soft/boa-0.94.13/boa$ tree
.
├── boa
├── boa.conf
├── boa_indexer
├── cgi-bin
│ ├── test.c
│ └── test.cgi
├── log
│ ├── access_log
│ └── error_log
├── mime.types
└── www
├── image.PNG
└── index.html
3 directories, 10 files
將src目錄下編譯出來的boa和boa_indexer交叉編譯出來的可執行程式直接複製到boa路徑下
將配套修改好的boa.conf也複製到此路徑下,修改後的boa.conf內容如下(與原版差異可以自行比較)
Port 80
User 0
Group 0
ErrorLog /opt/boa/log/error_log
AccessLog /opt/boa/log/access_log
DocumentRoot /opt/boa/www
UserDir public_html
DirectoryIndex index.html
DirectoryMaker /opt/boa/boa_indexer
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /opt/boa/mime.types
DefaultType text/plain
CGIPath /bin:/usr/bin:/usr/local/bin
Alias /doc /usr/doc
ScriptAlias /cgi-bin/ /opt/boa/cgi-bin/
建立cgi-bin,log和www子資料夾
在log目錄下建立access_log,error_log兩個log檔案
在www目錄下放入圖片資源和index.html,index.html內容如下:
<html>
<body>
<h3>this is a test!</h3><br/>
<img src="image.PNG"/>
<h3>tree picture</h3><br/>
<a href="/cgi-bin/test.cgi">to cgi page</a>
</body>
</html>
在cgi-bin下建立test.c,交叉編譯為test.cgi
// test.c檔案內容
#include <stdio.h>
int main()
{
printf("Content-type:text/html\n\n"); //這句一定要加上
printf("<html><body>");
printf("<font style=\"color:red; font-size:30px;\">Hello, CGI!</font><br/>");
printf("<a href=\"/index.html\">return index.html</a>");
printf("</body></html>");
return 0;
}
我本地環境下的交叉編譯過程
source /opt/environment-setup-cortexa53-crypto-fsl-linux
$CC -o test.cgi test.c
而mime.types是直接從Ubuntu環境下的/etc/mime.types複製過來的,demo實測沒有影響
3.將組織好的執行環境透過網路複製到目標板的/opt目錄下
4.到/opt/boa目錄下手動執行boa
cd /opt/boa
./boa
到/opt/boa/log路徑下檢視log:
root@:/opt/boa/log# cat error_log
[28/Apr/2022:23:07:23 +0000] boa: server version Boa/0.94.13
[28/Apr/2022:23:07:23 +0000] boa: server built Nov 4 2024 at 07:44:09.
[28/Apr/2022:23:07:23 +0000] boa: starting server pid=9749, port 80
boa執行成功
5.使用瀏覽器訪問目標板ip地址,檢視內建網頁成功
開啟瀏覽器,訪問我板子的ip地址
http::/172.168.7.12:80
網頁成功出現,與預存圖片資源一致
參考資料:
嵌入式http伺服器boa 簡介_嵌入式boa-CSDN部落格
boa交叉編譯(移植到arm)-CSDN部落格