嵌入式Web 服務器Boa 的移植及其應用

    隨着嵌入式技術的發展和高速寬帶網絡的普及, 利用網絡實現遠程監控已爲人們廣泛接受, 嵌入式網絡監控技術正是在此條件下逐步發展成熟起來的. 用戶使用Web 瀏覽器, 通過以太網遠程訪問內置Web 服務器的監控攝像機, 不但可以實現對現場的遠程視頻監控, 而且可以向監控現場發送指令. 在整個系統的實現過程中, 嵌入式Web 服務器起着十分重要的作用, 因此, 在嵌入式網絡視頻監控系統中,Web 服務器的設計對監控系統的整體性能具有直接的影響, 只有有了高效率的Web 服務器, 監控系統的性能才能得到充分的發揮.

      1 嵌入式Web 服務器Boa 的特點

      Boa 是一款單任務的HTTP 服務器, 與其他傳統的Web 服務器不同的是當有連接請求到來時, 它並不爲每個連接單獨創建進程, 也不通過複製自身進程來處理多鏈接, 而是通過建立HTTP 請求列表來處理多路HTTP 連接請求, 同時它只爲CGI 程序創建新的進程, 這樣就在最大程度上節省了系統資源, 這對嵌入式系統來說至關重要. 同時它還具有自動生成目錄、自動解壓文件等功能, 因此, Boa 具有很高的HTTP 請求處理速度和效率, 在嵌入式系統中具有很高的應用價值.

      2 Boa 的功能實現             嵌入式Web 服務器Boa 和普通Web 服務器一樣, 能夠完成接收客戶端請求、分析請求、響應請求、向客

      戶端返回請求結果等任務. 它的工作過程主要包括:

      ( a) 完成Web 服務器的初始化工作, 如創建環境變量、創建TCP 套接字、綁定端口、開始偵聽、進入循環結構, 以及等待接收客戶瀏覽器的連接請求;             ( b) 當有客戶端連接請求時,Web 服務器負責接收客戶端請求, 並保存相關請求信息;

      ( c) 在接收到客戶端的連接請求之後,分析客戶端請求, 解析出請求的方法、URL 目標、可選的查詢信息及表單信息, 同時根據請求做出相應的處理;

      ( d)Web 服務器完成相應處理後, 向客戶端瀏覽器發送響應信息, 關閉與客戶機的TCP 連接.           嵌入式Web 服務器Boa 根據請求方法的不同, 做出不同的響應. 如果請求方法爲HEAD, 則直接向瀏覽器返回響應首部; 如果請求方法爲GET, 則在返回響應首部的同時, 將客戶端請求的URL 目標文件從服務器上讀出, 並且發送給客戶端瀏覽器; 如果請求方法爲POST, 則將客戶發送過來的表單信息傳送給相應的CGI 程序, 作爲CGI 的參數來執行CGI 程序, 並將執行結果發送給客戶端瀏覽器. Boa 的功能實現也是通過建立連接、綁定端口、進行偵聽、請求處理等來實現的. 其初始化部分的源代碼如下:

      int server_s;

      server_s = socket( SERVER_PF,SOCK_STREAM,IPPROTO_TCP) ;

      if( server_s == - 1) {

      DIE( unable to create socket) ;

      }

      if( set_nonblock_fd( server_s) == - 1) {

      DIE( unable to set server socket to nonblocking) ;

      }

      if( fcntl( server_s,F_SETFD,1) == - 1) {

      DIE( can′t set close! on! exec on server socket! ) ;

      }

      if( ( setsockopt( server_s, SOL_SOCKET,SO_REUSEADDR,( void*)&sock_opt,

      sizeof( sock_opt) ) ) == - 1) {

      DIE( setsockopt) ;

      }

      if( bind_server( server_s, server_ip, server_port) == - 1) {

      DIE( unable to bind) ;

      }

      if( listen( server_s, backlog) == - 1) {

      DIE( unable to listen) ;

      }           上述代碼主要用於打開一個有效的socket 描述符, 然後將其轉換爲無阻塞套接字. 函數bind( ) 用於建立套接字描述符與指定端口間的關聯, 並通過函數listen( ) 在該指定端口偵聽, 等待遠程連接請求.當偵聽到連接請求時, Boa 調用函數get_request( int server_sock) 獲取請求信息, 通過調用函數accept( ) 爲該請求建立一個連接. 在建立連接之後, 接收請求信息, 同時對請求進行分析. 當有CGI 請求時, 爲CGI 程序創建進程, 並將結果通過管道發送輸出. Boa 的整體工作流程如圖1 所示.

      3 Boa 在ARM 上的移植

      3.1 修改Web 服務器Boa           爲進一步提高系統性能, 應根據嵌入式網絡視頻監控系統的特點, 對Web 服務器作適當的修改. 修改內容主要包括:

      ( a) 定義常數BUFFER_SIZE 爲8192, 通過增大BUFFER_SIZE 的值來增加輸入輸出緩存,以提高圖像傳輸速度, 從而加快系統的響應速度;

      ( b) 修改請求列表參數, 根據可能出現的請求數量修改服務器可以處理的HTTP 連接數量;

      ( c) 爲適應嵌入式系統資源較少的情況, 精簡uClinux 操作系統中的庫函數,使用uClibc 進行編譯, 因此要使Boa 在嵌入式系統上正常運行, 用戶必須自己實現一些函數功能, 如字符串查找函數strstr( ) 和字符串複製函數strdup( ) 等.

      3.2 交叉編譯Boa           爲了建立嵌入式交叉編譯環境, 首先必須安裝arm 交叉編譯工具arm-elf-gcc, 然後使用交叉編譯工具arm-elf-gcc 編譯Boa 源程序, 通過執行:

      . / configure -target = arm-elf -host = i686-pc-linux-gnu  -build = arm-elf

      Make           便可生成elf 格式的可執行文件boa.           通過arm-elf-strip -g boa 指令去除附帶的編譯信息, 以減少所佔用的空間. uClinux 系統採用的romfs 文件系統相對於一般的ext2 文件系統需要的空間較少, 因此需要採用elf2flt 工具將生成的boa 的可執行文件由elf 格式轉換成flat 格式, 並將其添加到romdisk 中.

      3.3 配置Web 服務器Boa           爲了能夠在ARM上運行Web 服務器Boa, 需要對其運行環境、參數等進行設置, 並將最終的配置文件Boa.conf 置於適當位置. 通過修改配置文件Boa.conf 可實現對Web 服務器的配置, 部分配置爲: 偵聽端口使用80 端口, 訪問日誌AccessLog 存放於/var/log/boa/access_log, 錯誤日誌ErrorLog 位於/var/log/boa/error_log, 文件的根目錄DocumentRoot 設在/home/httpd/, KeepAliveMax 的值修改爲50,KeepAliveTimeout 的值修改爲10, 設置CGIPath 爲/cgi-bin/ 等; 在Boa.conf 的最後加上ServerNameEmServer, 即將EmServer 作爲服務器名稱, 當然也可用其他名稱作爲服務器名; 最後將修改好的配置文件Boa.conf 存放於嵌入式系統根文件/etc/boa 目錄下. 通過鏡像製作工具執行命令genromfs-fromfs.img -d romdisk 生成romdisk 的鏡像文件romfs.img, 將romfs.img 通過bootloader 下載到flash 存儲器.

      3.4 測試Boa 的運行           爲了確保Boa 的正常運行, 利用簡單的測試程序測試Boa 的運行情況. 在目錄/home/httpd/ 下建立index.html 文檔, 其內容爲:

      <HTML>

      <BODY>

      This is boa

      < / BODY>

      < / HTML>           通過IE 瀏覽器連接到運行Boa 的嵌入式系統http://192.168.0.26/ , 若頁面顯示This is boa, 說明Boa可以正常獲取頁面.           在/cgi-bin/ 路徑下建立test 文件, 其內容爲:

      #!/bin/sh

      echo Content- type: text/html

      echo

      echo <html><body><pre>

      echo This is cgi test

      echo < / body>< / html>           在IE 瀏覽器輸入地址http: //192.168.0.26/cgi-bin/ test, 若頁面顯示This is cgi test, 說明服務器可以正常執行CGI 程序.

      4 Boa 在網絡監控系統中的應用

      將Boa 移植到運行uClinux 操作系統的ARM 處理器上, 建立嵌入式Web 服務器, 爲用戶提供基於HTTP 協議的網絡接入方式, 這樣的設計方案可以很好地運用到網絡監控系統中. 由於Boa 只支持基於CGI 的動態網頁, 因此需要編寫適當的CGI 程序來實現對視頻數據的發送和對控制指令的處理. Web 服務器通過調用CGI 程序實現網絡視頻監控, 同時向監控現場發送各種指令. 作者根據監控領域的實際需求, 按上述方案設計了一個網絡視頻監控系統, 該系統可以實現多路視頻數據接入, 8 個方向的雲臺控制等功能.目前系統已經在樓宇監控中獲得應用, 性能良好, 實時性強, 其監控界面如圖2 所示.         圖2 網絡視頻監控界面

      5 結束語

      Web 服務器是各種網絡應用系統的有機組成部分, 直接影響網絡應用系統的運行質量與效率. Boa 本身是爲嵌入式系統所設計, 它特有的連接處理方式以及直接調用操作系統的文件讀取方式, 大大提高了系統的性能. 它與Linux 系統上的Web 服務器Aparch 相比佔用系統資源少, 連接處理速度快. 在網絡監控系統中使用這種嵌入式Web 服務器, 可以節省系統資源, 提高系統運行效率, 充分發揮了網絡的優勢.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章