[OK210開發板體驗]系統篇(1) 基于S5PV210的智能家居系統之Boa服務器搭建

原創 2015-12-24 10:10:00 S5PV210 智能家居系統 Boa服務器搭建
前面進行了OK210試用體驗的入門篇和功能篇的體驗,分別為:
入門篇:
[OK210開發板體驗]入門篇(1):開箱驗板
[OK210開發板體驗]入門篇(2):板載資源
[OK210開發板體驗]入門篇(3):開發環境(軟件安裝,開發環境,燒寫系統)
[OK210開發板體驗]入門篇(4):編程入門(NFS登錄,驅動入門)
    
功能篇:
[OK210開發板體驗]功能篇(1):Linux字符驅動之Led
[OK210開發板體驗]功能篇(2):Linux字符驅動之Key按鍵
[OK210開發板體驗]功能篇(3):Linux Input子系統之Key按鍵
[OK210開發板體驗]功能篇(4):Linux字符驅動之DS18B20
[OK210開發板體驗]功能篇(5):Linux字符驅動之PWM蜂鳴器
[OK210開發板體驗]
功能篇(6):Linux字符驅動之紅外遙控 
[OK210開發板體驗]功能篇(7):Linux字符驅動之ADC模數轉換
通過4篇入門篇的介紹,初步了解了OK210開發板的系統資源,并根據飛凌公司的提供的軟件手冊和硬件手冊,結合自身的經驗,搭建了相應的Linux系統開發環境。通過7篇功能篇的介紹,初步熟悉了OK210開發板的部分資源,對相應驅動模塊的學習,為智能家居系統的搭建奠定了基礎
今天是OK210試用體驗的功能篇,Boa服務器的搭建:主要包括三部分,智能家居系統組成、Boa服務器搭建及附錄。
一、智能家居系統組成
本設計的智能家居系統大體分為四大模塊,數據采集、數據控制與處理、網絡和終端顯示與控制,具體如下圖所示
 

數據采集分為5大部分,主要包括家庭安防、環境檢測、燈光控制、窗簾控制和可視對講,這些功能通過OK210連接的外設完成。數據控制與處理,主要通過OK210上的S5PV210處理器完成,即將采集到的數據進行處理,打包,通過網絡發送到用戶端。而網絡部分可采用有線或無線的方法,來連接智能家居系統和用戶端。終端顯示與控制,主要實現用戶對家居系統的檢查和控制,可通過PC端或移動端來實現。
二、Boa服務器搭建

Boa 服務器是一個小巧高效的web服務器,是一個運行于unix或linux下的,支持CGI的、適合于嵌入式系統的單任務的http服務器。作為一種單任務Web服務器,Boa只能依次完成用戶的請求,而不會fork出新的進程來處理并發連接請求。但Boa支持CGI,能夠為CGI程序fork出一個進程來執行。Boa的設計目標是速度和安全。它的最大特點是源代碼開放、性能高,其可執行代碼只有大約60KB左右。

由于Boa服務器運行在Linux系統,所以搭建分兩步,第一步首先在Ubuntu主機上實現;第二步,完成在OK210的移植。其中,在Ubuntu上搭建有兩個目的:(1)為在OK210上移植做準備,(2)方便程序功能代碼的調試。
(一)主機上搭建

第一步編譯Boa
1、下載Boa源碼
下載地址: http://www.boa.org/ 或 http://sourceforge.net(當前版本為boa-0.94.13)
下載boa-0.94.13.tar.gz
解壓: tar xvzfboa-0.94.13.tar.gz
2、生成Makefile文件
cd/boa-0.94.13/src
運行configure文件:./configure
3、安裝bison和flex
sudoapt-get install bison
sudoapt-get install flex
4、編譯
make
ps:編譯前安裝附錄(1)(2)(3)修改相應的源碼,不然會在編譯或運行的過程中出錯,修改后,進行編譯
5、安裝
將生成的可執行文件boa復制到/usr/local/bin/ 目錄下
sudo cp /boa-0.94.13/src/boa /usr/local/bin/
第二步 Boa的配置
1、創建目錄和文件
sudo mkdir /etc/boa
sudo mkdir -p  /var/www/cgi-bin/
sudo mkdir /var/log/boa/
sudo touch /var/log/boa/error_log
sudo touch /var/log/boa/access_log
2、修改權限
sudo chmod  -R 777  /var/www /var/log/boa/error_log/var/log/boa/access_log
sudo chmod  777 /uar/local/boa
3、配置boa.conf
將boa-0.94.13/boa.conf 復制到/etc/boa/ 目錄下
sudo cp boa.conf /etc/boa/
(1)修改Group參數
將Group nogroup修改為Group 0
ps:由于在/etc/group文件中沒有nogroup組,所以設成0。另外在/etc/passwd中有nobody用戶,所以User nobody不用修改
(2)修改ScriptAlias參數
將ScriptAlias /cgi-bin/  /usr/lib/cgi-bin/修改為ScriptAlias /cgi-bin/  /var/www/cgi-bin/
第三步:Boa的執行
boa
ps:如果在第二步沒有執行sudo chmod  777 /uar/local/boa,在此使用sudo boa
第四步:功能測試
1、靜態網頁測試
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>http://bbs.elecfans.com</title>
  6. </head>
  7. Hello World
  8. <body>
  9. </body>
  10. </html>
復制代碼
將靜態網頁index.html存入/var/www目錄下
直接在瀏覽器中輸入:本機地址
靜態HTML調試成功。
2、CGI腳本測試
1、編寫Helloworld.c程序
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.      printf("Content-type: text/html\n\n ");
  5.      printf("<html> ");
  6.      printf("<head><title>CGI Output</title></head> ");
  7.      printf("<body> ");
  8.      printf("<h1>Hello,world.</h1> ");
  9.      printf("<body> ");
  10.      printf("</html> ");
  11.      return 0;
  12. }
復制代碼
ps:
(1)形狀應寫成printf("Content- type: text/html\n\n");
(2)主程序的程序開頭一定要用Tab,而不是空格

2、編譯helloworld.c成helloworld.cgi
若在主機上測試,則用: gcc -ohelloworld.cgi helloworld.c
若在開發板上測試,則用:arm-linux-gcc -o helloworld.cgi helloworld.c
3、瀏覽
將helloworld.cgi拷貝至/var/www/cgi-bin/下,瀏覽器輸入http://IP/cgi-bin/helloworld.cgi
(二)OK210上搭建

第一步:編譯Boa
1、修改Makefile
CC = gcc
CPP = gcc -E   
該為:
CC = arm-linux-gcc
CPP = arm-linux-gcc -E
修改成功后,直接make
2、Boa瘦身

可以發現boa的大小前后差距很大,這為我們節省了很大的空間
第二步:配置boa
將主機 /etc/ 目錄下的 mime.types 文件拷貝到開發板 /etc 目錄下
第三步:移植
其實在OK210開發板上,已經移植好了Boa服務器,我們需要知道的是配置文件在/etc/boa目錄下,可執行程序在/sbin/目錄下,網頁文件在/usr/local/boa下,我們可以替換成我們自己編譯好的,也可以使用當前的,下面的是使用當前的測試結果:即在OK210開發板上運行Boa服務器,在PC上輸入OK210的IP地址顯示的結果。

三、附錄
附錄1
1)修改 src/compat.h,定位到120
找到
#define TIMEZONE_OFFSET(foo)foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo)(foo)->tm_gmtoff
否則會出現錯誤:
util.c:100:1: error: pasting "t"and "->" does not give a valid preprocessing token make: ***[util.o] 錯誤 1
2)修改 src/log.c,定位到72
注釋掉
if (dup2(error_log, STDERR_FILENO) == -1) {
                         DIE("unableto dup2 the error log");
                   }
為:
/*if (dup2(error_log, STDERR_FILENO) == -1){
                         DIE("unableto dup2 the error log");
                   }*/
否則會出現錯誤:
log.c:73 unable to dup2 the error log:badfile descriptor
3)修改src/boa.c,定位到210行和228
注釋掉下面兩句話:
if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }
#if 0
        if (passwdbuf == NULL) {
        DIE(”getpwuid”);
        }
        if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
        DIE(”initgroups”);
        }
        #endif
否則會出現錯誤:boa.c:211 - getpwuid: No such file or directory
注釋掉下面語句:
if (setuid(0) != -1) {
                        DIE(”ickyLinux kernel bug!”);
        }
#if 0
         if (setuid(0) != -1) {
                        DIE(”ickyLinux kernel bug!”);
                }
#endif
否則會出現問題:boa.c:228 - icky Linux kernel bug!: No such file or directory
附錄2
boa.conf中各參數的含義:
Port 80                                #監聽的端口號,缺省都是80,一般無需修改
#Listen 192.68.0.5                #bind調用的IP地址,一般注釋掉,表明綁定到INADDR_ANY,通配于服務器的所有IP地址
User nobody                         #作為哪個用戶運行,即它擁有該用戶的權限,一般都是nobody,需要/etc/passwd中有nobody用戶
Group nogroup                     #作為哪個用戶組運行,即它擁有該用戶組的權限,一般都是nogroup,需要在/etc/group文件中有nogroup
#ServerAdmin root@localhost  #當服務器發生問題時發送報警的email地址,目前未用,注釋掉
ErrorLog /var/log/boa/error_log       #錯誤日志文件。如果沒有以/開始,則表示從服務器的根路徑開始。如果不需要錯誤日志,則用#/dev/null。在下面設置時,注意一定要建立/var/log/boa目錄
#AccessLog/var/log/boa/access_log     #訪問日志文件。如果沒有以/開始,則表示從服務器的根路徑開始。如果不需要錯誤日志,則用#/dev/null或直接注釋掉。在下面設置時,注意一定要建立/var/log/boa目錄
#UseLocaltime                         #是否使用本地時間。如果沒有注釋掉,則使用本地時間。注釋掉則使用UTC時間
#VerboseCGILogs                       #是否記錄CGI運行信息,如果沒有注釋掉,則記錄,注釋掉則不記錄
ServerName www.hyesco.com             #服務器名字
#VirtualHost                          #是否啟動虛擬主機功能,即設備可以有多個網絡接口,每個接口都可以擁有一個虛擬的Web服務器。一般注釋掉,即不需要啟動
DocumentRoot /var/www                 #非常重要,HTML文檔的主目錄。如果沒有以/開始,則表示從服務器的根路徑開始。
UserDir public_html                   #如果收到一個用戶請求的話,在用戶主目錄后再增加的目錄名
DirectoryIndex index.html             #HTML目錄索引的文件名,也是沒有用戶只指明訪問目錄時返回的文件名
#DirectoryMaker/usr/lib/boa/boa_indexer     #HTML目錄沒有索引文件時,用戶只指明訪問目錄時,boa會調用該程序生成索引文件然后返回給用戶,因為該過程比較慢最好不執行,可以注釋掉或者給每個HTML目錄加DirectoryIndex指明的文件,如果                                                            DirectoryIndex不存在,并且DirectoryMaker被注釋,那么就用Boa自帶的索引
#DirectoryCache/var/spool/boa/dircache      #生成程序來生成目錄的索引文件并輸出到下面目錄,該目錄必須是Boa能讀寫
KeepAliveMax 1000                           #一個連接所允許的HTTP持續作用請求最大數目,注釋或設為0都將關閉HTTP持續作用
KeepAliveTimeout 10                        #HTTP持續作用中服務器在兩次請求之間等待的時間數,以秒為單位,超時將關閉連接
MimeTypes /etc/mime.types                   #指明mime.types文件位置。如果沒有以/開始,則表示從服務器的根路徑開始。可以注釋掉避免使用mime.types文件,此時需要用AddType在本文件里指明
DefaultType text/plain                      #文件擴展名沒有或未知的話,使用的缺省MIME類型
CGIPath/bin:/usr/bin:/usr/local/bin         #提供CGI程序的PATH環境變量值
#AddType application/x-httpd-cgicgi         #將文件擴展名和MIME類型關聯起來,和mime.types文件作用一樣。如果用mime.types文件,則注釋掉,如果不使用mime.types文件,則必須使用
#Redirect /barhttp://elsewhere/feh/bar      #指明文檔重定向路徑
Alias /doc /usr/doc                         #為路徑加上別名
ScriptAlias /cgi-bin//var/www/cgi-bin/      #非常重要,指明CGI腳本的虛擬路徑對應的實際路徑。一般所有的CGI腳本都要放在實際路徑里,用戶訪問執行時輸入站點+虛擬路徑+CGI腳本名

相關產品 >

  • OKMX6UL-C開發板

    飛凌嵌入式專注imx6系列imx6ul開發板、飛思卡爾imx6ul核心板等ARM嵌入式核心控制系統研發、設計和生產,i.mx6UL系列產品現已暢銷全國,作為恩智浦imx6ul,imx6ul開發板,i.mx6提供者,飛凌嵌入式提供基于iMX6 iMX6UL解決方案定制。

    了解詳情
    OKMX6UL-C開發板
  • OKMX6ULL-C開發板

    40*29mm,雙網雙CAN,8路串口| i.MX6ULL開發板是基于NXP i.MX6ULL設計開發的的一款Linux開發板 ,主頻800MHz,體積小,其核心板僅40*29mm,采用板對板連接器,適應場景豐富。 了解詳情
    OKMX6ULL-C開發板

推薦閱讀 換一批 換一批