Boa 移植说明
- 官方下载:Boa Webserver;
- ./configure ;或者直接修改 ./configure --host=arm-linux CC=arm-linux-gnueabihf-gcc
- 更改Makefile的gcc编译连接为arm-linux-gnueabihf-gcc,更改defines.h中SERVER_ROOT 为开发板指定目录(关联查找boa.conf);
- 然后 make并修复编译报错;
- copy系统文件/etc/mine.types(关联解析html) 、压缩包里/example/boa.conf(联网配置)、/src/boa(编译后执行文件) 进开发板指定目录;// 建议放入/usr/local
- 修改boa.conf内的ServerName为本机IP,MimeTypes路径"默认/etc/",DocumentRoot路径"默认/var/www"。其他为默认配置;
- 通过上述交叉编译链编译cgi文件: arm-linux-gnueabihf-gcc -o test.cgi test.c;//cgi包括post和get两个method,分别对应上传与下载数据内容
- 书写test.html文件,cgi文件与html文件均放入上述指定目录下;//需要专业前端人员来写最好
- 保证PC与板子在同一网段直连,输入ipxxx/test.html,可以看到hello word;
- 执行脚本放入/etc/init.d下实现开机自启动
- 后续建议与网页交互通过json的形式,上载文件以及下发参数用json标准化,源码使用github上的cjson.c与cjson.h,路径:https://github.com/DaveGamble/cJSON,json的解析与应用可自行百度学习
- 在CGI响应执行一些linux系统命令system()时,务必加上路径/sbin/
CGI例程:同时处理上载与下载数据
int main(void)
{
tagHardware_Info tHardware_Info;
char *method=NULL;
char buff[MAX_BUFF_LEN]={0};// WATCH OUT MAX 500BYTE
int file_size=0;
int len=0;
int ret=0;
char cmdip[40]={0};
fprintf(stdout, "Content-Type: application/json\r\n");
fprintf(stdout, "Access-Control-Allow-Origin:*\r\n\r\n");
method = getenv("REQUEST_METHOD");
if(!memcmp(method,"POST",4))//IN
{
fscanf(stdin, "%s",buff);
memset(&tHardware_Info, 0, sizeof(tagHardware_Info));
if(json_hardware_process(buff, &tHardware_Info))
{
fprintf(stdout,"{json Hardware Process Error!}\n");
return -1;
}
if(write_hardwate_file(&tHardware_Info))
{
fprintf(stdout,"{json Write Hardware File Error!}\n");
return -1;
}
if(write_boa_file(&tHardware_Info))
{
fprintf(stdout, "{Write BOA File Error!}\n");
return -1;
}
len=strlen((char *)tHardware_Info.cIp)+20;
ret=snprintf(cmdip,len+1,"/sbin/ifconfig eth0 %s",tHardware_Info.cIp);
if(ret!=len)
{
fprintf(stdout, "ip cmd snprintf fail, ret:%d,len:%d \n",ret,len);
return -1;
}
system(cmdip);
fprintf(stdout, "{Set Success!}\n");
}
else if(!memcmp(method,"GET",3))//OUT
{
file_size=Get_File_Size(HARD_CFG_PATH);
if((file_size<=0)||(file_size>=MAX_BUFF_LEN))
{
fprintf(stdout, "File Read Error!\n");
return -1;
}
if(File_Read(HARD_CFG_PATH, buff, file_size))
{
fprintf(stdout, "File Read Error!\n");
return -1;
}
fprintf(stdout, "%s\n",buff);
}
else
{
fprintf(stdout,"System Error!!!method = %s\n",method);
}
return 0;
}