入門篇:
[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、靜態網頁測試
 
		
			
				
					
- 
						<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
- 
						<html xmlns="http://www.w3.org/1999/xhtml">
 
- 
						<head>
 
- 
						<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
- 
						<title>http://bbs.elecfans.com</title>
 
- 
						</head>
 
- 
						Hello World
 
- 
						<body>
 
- 
						</body>
 
- 
						</html> 
					
 
復制代碼 
		 
	 
	
		將靜態網頁index.html存入/var/www目錄下 
	
	
		直接在瀏覽器中輸入:本機地址 
	
 
	
靜態HTML調試成功。 
	
		2、CGI腳本測試 
	
	
		1、編寫Helloworld.c程序
 
		
			
				
					
- 
						#include <stdio.h>
 
- 
						int main(void)
 
- 
						{
 
- 
						     printf("Content-type: text/html\n\n ");
 
- 
						     printf("<html> ");
 
- 
						     printf("<head><title>CGI Output</title></head> ");
 
- 
						     printf("<body> ");
 
- 
						     printf("<h1>Hello,world.</h1> ");
 
- 
						     printf("<body> ");
 
- 
						     printf("</html> ");
 
- 
						     return 0;
 
- 
						} 
					
 
復制代碼 
		 
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腳本名