使用Web頁面遠程控制LED

使用Web頁面遠程控制LED

CGI(通用網關接口)是Web服務器運行時外部程序的規範,按CGI編寫的程序可以拓展服務器功能。CGI程序可以與瀏覽器進行交互,還可以通過數據API與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據。格式化爲HTML文檔後,發送給瀏覽器,也可以從瀏覽器中獲取數據存放到數據庫中。幾乎所有的服務器都支持CGI,可以使用任何語言編寫CGI。CGI分爲直接CGI和間接CGI兩種,標準CGI使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通信採用標準輸入輸出方式。間接CGI又稱緩衝CGI,在CGI程序和CGI接口之間插入一個緩衝程序,緩衝程序與CGI接口間用標準輸入輸出進行通信

實驗步驟:

  1. 替換/www目錄下的index.html文件

  2. 確認boa.conf(/etc/boa/)配置文件中CGI的存放路徑,打開boa.conf,確定內容爲ScriptAlias /cgi-bin/ /www/cgi-bin

  3. 進入/www/cgi-bin,將交叉編譯myled.c生成的可執行文件(文件後綴必須是.cgi)拷貝到該目錄

    arm-none-linux-gnueabi-gcc -o myled.cgi myled.c -static

  4. 修改可執行文件myled.cgi的權限爲777

  5. 網絡設備輸入http://192.168.3.20(開發板IP地址)

    程序執行結果

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-53KMkGNl-1585803115651)(F:\Typora\圖片\1585796295242.png)]

相關代碼如下:

index.html

<!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>led遠程控制</title>
<style type="text/css">
body {
	background-color: #999900;
	text-align: center;
}
.ziti {
	font-size: 24px;
}
.juzhong {
	text-align: center;
}
.hsz {
	text-align: center;
}
.hsz td {
	color: #00F;
	font-size: 18px;
}
.hsz {
	background-color: #FCC;
}
.juzhong table {
	text-align: center;
}
.juzhong table tr {
}
#h1 {
	background-color: #0FC;
}
#h2 {
	background-color: #FF9;
}
.h3 {
	background-color: #0CF;
}
.ys1 {
	font-size: 24px;
}
.STYLE1 {font-size: 36px}
</style>
</head>

<body class="juzhong">
<table width="900" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td><p class="STYLE1">&nbsp;</p>
    <p class="STYLE1">iTOP-4412 WEB SERVER </p></td>
  </tr>
 
  <tr>
    <td height="30">&nbsp;</td>
  </tr>
  <tr>
    <td><form action="/cgi-bin/myled.cgi" method="get" enctype="application/x-www-form-urlencoded" name="form1" target="_blank" id="form1">
      <table width="300" border="1" align="center" cellpadding="1" cellspacing="1">
        <tr>
          <td>Led1</td>
          <td><input name="led1" type="checkbox" id="led1" value="1" />
            <label for="led1"></label></td>
        </tr>
        <tr>
          <td>Led2</td>
          <td><input name="led2" type="checkbox" id="led2" value="2" />
            <label for="led2"></label></td>
        </tr>
       
        <tr>
          <td colspan="2"><input type="submit" name="submit" id="submit" value="submit" /></td>
          </tr>
      </table>
    </form></td>
  </tr>
  <tr>
    <td ><p>&nbsp;</p>    </td>
  </tr>
</table>
<p>&nbsp;</p>
</body>
</html>

myled.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *data;

	int leds[2] = {0, 0};

	long m, n;

	int exit=0,i,fd;

	printf("Content-Type:text/html;charset=gb2312\n\n");

	printf("<html>\n"); 
	printf("<body>\n");
	printf("<title>iTOP-4412</title> ");
	printf("<h3>iTOP-4412</h3> ");

	data = getenv("QUERY_STRING");
	printf("<p>receive data:%s</p>",data);
	
	while(*data != '\0')
	{
		if(*data=='=')
		switch(*(data+1))
		{
			case '1':leds[0]=1;break;
			case '2':leds[1]=1;break;
			default:exit=1;break;
		}
		if(exit == 1)
			break;
		data++;
	}

	fd=open("/dev/leds",0);

	for(i=0;i<2;i++)
	{
		if(leds[i]==1)
			printf("<p>%d\t</p>",i+1);
		ioctl(fd,leds[i],i);
	}

	printf("</body>\n");
	printf("</html>\n");

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