【嵌入式Web伺服器】嵌入式Web框架選型

Emma1111發表於2024-11-04

1.業界流行的嵌入式端Web伺服器

在嵌入式平臺中,內建Web介面通常用於裝置配置、監控和控制。以下是一些流行的嵌入式平臺Web介面框架:

  1. uIP Web伺服器框架

    • 一個非常輕量級的Web伺服器框架,專為嵌入式系統設計,支援小型TCP/IP協議棧。
  2. ESP8266/ESP32 Web框架

    • 針對ESP8266和ESP32 WiFi模組的Web框架,如ESP8266Web框架和ESPAsyncWebServer等。
  3. MicroWebSrv

    • 一個為嵌入式系統設計的輕量級Web伺服器,支援C++編寫,適用於多種平臺。
  4. mongoose

    • 一個輕量級的網路庫,提供了HTTP、WebSocket和MQTT客戶端和伺服器功能。
  5. TASMOTA

    • 一個基於ESP8266/ESP32的開源韌體,提供了豐富的Web介面,用於智慧家居裝置。
  6. WebThings Gateway

    • 一個基於W3C Web of Things標準的開源框架,用於構建連線物理裝置和Web應用的閘道器。
  7. Node-RED

    • 一個基於流的開發工具,用於連線硬體裝置、API和線上服務,支援在嵌入式裝置上執行。
  8. OpenWrt/LEDE

    • 一個基於Linux的開源韌體專案,提供了豐富的Web介面和網路功能。
  9. Contiki

    • 一個開源的物聯網作業系統,提供了輕量級的Web伺服器實現。
  10. LwIP

    • 一個輕量級的TCP/IP協議棧,支援HTTP伺服器功能。
  11. FreeRTOS Web server

    • 一個為FreeRTOS作業系統設計的Web伺服器,用於建立基於Web的介面。
  12. Qt for Embedded Linux

    • Qt提供了跨平臺的C++圖形使用者介面框架,也可用於嵌入式Linux裝置。
  13. Pimoroni's Picolipo

    • 一個為樹莓派Pico和其他RP2040裝置設計的微型Web伺服器庫。
  14. IoT.js

    • 一個基於JavaScript的輕量級物聯網平臺,支援Node.js API。
  15. Express.js with Node.js

    • 雖然Express.js通常用於伺服器端開發,但也可以在嵌入式裝置上執行Node.js來建立Web介面。
  16. Boa

    • Boa是一個非常輕量級的 HTTP 伺服器軟體,最初由 Paul Phillips 為嵌入式系統和簡單 web 服務而開發。它以其小尺寸、易於配置和使用而聞名,特別適合資源受限的環境,如小型微控制器或嵌入式裝置。

2.Boa

2.1 Boa 的特點

  1. 輕量級 :Boa 非常小,通常編譯後的二進位制檔案大小隻有幾十KB,非常適合資源受限的系統。
  2. 易於配置 :Boa 的配置檔案簡單,易於理解和修改,使得它在嵌入式系統中快速部署變得容易。
  3. 支援基本的 HTTP 功能 :Boa 支援基本的 HTTP 功能,包括 GET 和 POST 請求,以及靜態檔案的伺服器功能。
  4. 安全性 :雖然 Boa 提供了基本的安全特性,但由於其簡單性,它可能不適用於需要高階安全特性的應用。
  5. 跨平臺 :Boa 可以在多種作業系統上執行,包括 Linux、Windows 和其他 Unix 系統。
  6. 可擴充套件性 :儘管 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/

image

當前最新版本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測試這一段測試程式註釋掉,暫時先配置透過

image

image

編譯原始碼

make

遇到以下報錯:

image

修改程式碼:

開啟compat.h檔案

image

再開啟boa.c檔案,將以下部分註釋掉

image

清理編譯環境:

make clean

重新編譯

make

又報以下錯誤

image

修改log.c

image

重新編譯後,編譯成功

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可執行程式

image

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

網頁成功出現,與預存圖片資源一致

image

參考資料:

嵌入式http伺服器boa 簡介_嵌入式boa-CSDN部落格

boa交叉編譯(移植到arm)-CSDN部落格

相關文章