摘要:网上又不少历程关于ARM平台的web实验,基本上都是在内网完成的,本地搭建好web服务器,而ARM平台的web服务器不支持内网穿透,继而无法从外网访问控制,或许你有公网IP可以进行端口映射访问,不过本次实验目的不在此,本次主要完成ARM9开发板通过HTTP协议与Apache服务器数据交互。如有错误或者建议,敬请批评指正。
实验设备: 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协议发送给下位机。
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");
}
}) ; // 发送并显示返回内容
});
})
源码在下方下载,其余功能正在开发中.....



评论一下?