ARM9与远程web服务器交互之灯控实验

2016-8-24 / 11 评论 / 10272 阅读

     摘要:网上又不少历程关于ARM平台的web实验,基本上都是在内网完成的,本地搭建好web服务器,而ARM平台的web服务器不支持内网穿透,继而无法从外网访问控制,或许你有公网IP可以进行端口映射访问,不过本次实验目的不在此,本次主要完成ARM9开发板通过HTTP协议与Apache服务器数据交互。如有错误或者建议,敬请批评指正。

捕获.PNG

实验设备:  EasyARM i.mx283(周立功ARM9板子)  linux2.6.35系统

                   ECS云服务器 具备公网IP  120.27.4.152 (ubunut14.04系统 Apache2+PHP5+MySQL)  配置方法 —>点此

                   交叉编译工具 arm-none-linux-gnueabi-gcc 

                   宿主机 Ubuntu14.04 

语言需求:C ,HTML,JavaScript,jquery,PHP,MySQL,shell脚本(了解)   


实验原理: 

                通过ARM开发板不断向web服务器发送POST/GET请求,来获得服务器返回的数据,数据中携带了light0的value值,通过C对字符串分析获得服务器数据库类light0的value值,来更改P2.4引脚的电平高低,从而达到下位机控灯,至于web页面通过ajax GET方式提交至相应PHP文件,从而修改数据库类light0 的value值。完成web服务器控灯实验


开发板方面不做过多介绍,周立功官网上面提供了手册, 提一下重要操作就是关于灯控的高低点平,/sys/class/gpio/在这个类下面(GPIO驱动已经提供了,先拿来用) 我们按照手册上面所提供的数据建立好一个 68 P2.4引脚的虚拟控制文件, (linux下面一切皆为文件),生成了引脚电平控制文件 /sys/devices/virtual/gpio/gpio68/value   通过echo 1(0) > value 可以更改P2.4引脚高低电平。


C语言文件

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/types.h>  
#include<sys/socket.h>  
#include<arpa/inet.h>  
#include<string.h>
#include<fcntl.h>
#include<unistd.h>

#define IP_ADDR "120.27.4.152"  
#define ARCHIVE "/data/light.php" 
#define PORT        80  

#define DEV_PATH "/sys/devices/virtual/gpio/gpio68/value"
#define HIGH    "1"
#define LOW     "0"

int main(int argc, char *argv[]){  

   int fd;
   int sockfd;  
   int len;  
   struct sockaddr_in address;  
   int result;  
   char data[1024];  
   memset(data, 'a', 1024);  
   char httpstring[2048];  
   sprintf(httpstring,"POST /%s  HTTP/1.1\r\n"  
         "Host: %s\r\n"  
         "Content-Length: %d\r\n"  
         "Connection:Close\r\n\r\n"  
         "Content-Type: Application/octet-stream\r\n\r\n"  
         "$name=rainfly"
         "%s",  
         ARCHIVE, IP_ADDR, strlen(data), data);  
   char ch;  
   sockfd = socket(AF_INET, SOCK_STREAM, 0);  
   address.sin_family = AF_INET;  
   address.sin_addr.s_addr = inet_addr(IP_ADDR);  
   address.sin_port = htons(PORT);  
   len = sizeof(address);  
   result = connect(sockfd,(struct sockaddr *)&address,len);  
   if(result == -1)  
   {  
      perror("oops: client");  
      return 1;  
   } 

   write(sockfd,httpstring,strlen(httpstring));  
   while(read(sockfd,&ch,1)) 
   {  
//     printf("%c", ch);
   }

//   printf("%c",ch);
   int a= ch-48;//ASCII change
//   printf("%d",a);
   if(a==1)
   {
     printf("open");
        fd=open(DEV_PATH,O_WRONLY);
    if(fd<0){printf("open value fail!");}
    write(fd,HIGH,strlen(HIGH));
    close(fd);
   }
   else{
        printf("close");    
        fd=open(DEV_PATH,O_WRONLY);
    if(fd<0){printf("open value fail!");}
    write(fd,LOW,strlen(LOW));
    close(fd);
   }

   close(sockfd);  
   printf("\n"); 
   return 0;  
}

 注意: 不管data的数据内容是什么上面我发送的是1024个'a' 虽然这毫无用出,关于这个POST GET提交方式,在本次实验都是可以的携带的data数据并没有实质性作用,(PS:或许在以后的实验中,需要用到数据提交给服务器)。这里仅实现对服务器发送POST请求,然后通过服务器判断是否携带了数据参数来进行输出,或者修改数据库


核心PHP脚本。
/data/light.php

<?PHP
$lnk = mysql_connect("127.0.0.1:3306","root","Dyf1314520");
if (!$lnk){
  die('Could not connect: ' . mysql_error());
}
if(mysql_query("CREATE DATABASE smarthome",$lnk)){
     mysql_select_db('smarthome', $lnk);
     $sql = "CREATE TABLE light    
            (
            LightName varchar(7),
            value int
            )";
    mysql_query($sql,$lnk);//创建表结构
    mysql_query("INSERT INTO light (LightName, value) 
         VALUES ('light0', '1')");  //插入新表项
}

mysql_select_db('smarthome', $lnk); //选中数据库

//带参数访问更改 数据库中 light0的值
if (isset($_GET['light0'])) {
    $light0=$_GET['light0'];
    mysql_query("UPDATE light SET value = ".$light0." WHERE LightName = 'light0'");
    echo $light0;
}
else {  //如果直接访问就获得数据库数据
    $result = mysql_query("SELECT * FROM light WHERE LightName='light0'");
//mysql系的函数中都是逐行读取的,即第一次mysql_fetch_array得到第一行,第二次得到第二行
//实际上一个灯只需要第一行
while($row = mysql_fetch_array($result))
  {
  echo $row['value'];
  }
}

?>

该文件既处理Ajax提交过来的GET请求,将数据库中light0 的value值进行修改,也应答下位机POST请求,将value值通过HTTP协议发送给下位机。 


捕获1.PNG

  home_light.php 页面AJAX提交源码


      //去除str的前后空格
        function trim(str){   
    return str.replace(/^(\s|\u00A0)+/,'').replace(/(\s|\u00A0)+$/,'');   
        } 

        var light0_temp=1;
        var light0;
        $(document).ready(function(){        
        $("#light0").click(function(){

                light0_temp = ~ light0_temp;
                if(light0_temp!='1'){light0=0;}
                else {light0=1;} //js判断

            var url = '/data/light.php'; // 取Form中要提交的链接
            var param = {}; // 组装发送参数
            param['light0']  = light0;
          $.get(url, param, function(dom) { 
              dom=trim(dom);
                if (dom=='1') {

                    $('#light0_img').attr("src","img/light_on.png");        
                }
                else {

                    $('#light0_img').attr("src","img/light_off.png");    
                }

            }) ;  // 发送并显示返回内容
        });
        })

源码在下方下载,其余功能正在开发中.....


实验文档来源:360  | 大小:0MB  | 提取密码:f579 | 解压密码:www.rainfly.cn
已经过安全软件检测无毒,请您放心下载。          若链接失效可联系管理员!

    评论一下?

    OωO
    取消
      1. 头像
        宁国房产网
        第8楼
        辛苦了,谢谢分享!
        回复
      1. 头像
        卡森卫星城
        第7楼
        厉害了我的歌
        回复
      1. 头像
        烟雨平生
        第6楼
        厉害
        回复
      1. 头像
        摩天之星
        第5楼
        大神啊,膜拜下
        回复
      1. 头像
        任务易
        第4楼
        虽然看不太懂,还是进来点个赞,支持博主
        回复
        1. 头像
          怎样炒股
          @任务易:谢谢分享。。。
          回复
      1. 头像
        essaypinglun
        地板
        感谢楼主的分享
        回复
      1. 头像
        海云博客
        板凳
        撒花撒花撒花撒花
        回复
      1. 头像
        购物街
        沙发
        很不错的分享
        回复
        1. 头像
          外贸跨境电商
          @购物街:这个文章必须顶。。
          回复
        1. 头像
          外贸跨境电商
          @购物街:顶。。一定得顶。。。。
          回复