1.项目描述:
\qquad基于飞凌单片机OKA40i-C开发板,使用browser+boa进行通信,可以通过网页下载单片机的文件,也可以通过网页上传电脑客户端的文件到单片机。
2.开发环境:
\qquad单片机是飞凌公司的OKA40i-C开发板,使用系统镜像为sun8iw11p1_linux_OKA40i_C_uart0-1080p.img
;
\qquad另外有两台电脑,负责对单片机进行开发,一台操作系统是Ubuntu20.04.1;另外一台为windows10。Ubuntu电脑的交叉编译器是arm-linux-gnueabi-gcc-5.3.1。
\qquad单片机和两台电脑通过交换价互相连接,可以基于局域网的IP地址,通过ssh,telnet方式进行控制,通过sftp,ftp方式进行文件传输。
3. 问题描述
3.1 把boa移植到Ubuntu电脑上和网页的简单编写
83~92讲
3.2 把boa移植到开发板上
嵌入式boa的移植
在嵌入式Linux系统(OK6410)中移植Boa 服务器
3.3 网页把电脑文件上传到单片机
CGIC编程
\qquad在这一步遇到问题,首先是网页上传文件不成功,出现下面错误:
502 Bad Gateway The CGI was not CGI/1.1 compliant
\qquad这个问题一直没有解决,然后发现在Ubuntu电脑经过交叉编译器编译的程序,通过ftp发到单片机中,运行会出现下面错误:
** segmentation fault**
\qquad参考这篇文章之后,发现解决方案
segmentation fault,顺着这个思路,发现前者那个问题也有了思路,单片机和开发电脑之间的文件传输,有两种方式,一个是ftp,一个是sftp。
\qquad我发现经过sftp方式,上传到单片机的编译完的程序在单片机上运行都没问题,然后我改变的发送方式,将upload.cgi
和upload.html
通过sftp方式发送到单片机,然后通过网页上传文件就可以成功了。
4.boa的移植
4.1 boa的编译
将boa的压缩包解压之后,进入src文件,这里面放置boa的源码,在进行make之前,需要进行修改里面的文件,和安装一些必须工具比如flex,bison,再进行make编译,编译之后得到可执行文件boa。
4.2 配置boa.conf
boa.conf的放置位置有define.h决定,一般放在/etc/boa下面,在boa.conf中,可以修改端口号,log日志文件的存放位置,HTML文件存放位置,cgi程序文件的存放位置。没有相应的目录和文件的话,需要进行创建。
4.3 移植和启动
将boa可执行程序和boa.conf移植到开发板
5.浏览器和单片机之间的http通信
浏览器中输入ip地址,默认端口号为80,再加上要请求的文件,比如index.html,浏览器界面就可以跳转到对应的文件。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Test Upload</title><meta name="author" content="scorpio"><!-- Date: 2016-07-30 -->
</head>
<body>
<form action="cgi-bin/upload.cgi" method="post" enctype="multipart/form-data" target="_blank"><input type="file" name="file" value="" /><input type="submit" name="submit" value="OK">
</form>
</body>
</html>
6.cgi编程
cgi是外部拓展应用程序和web服务器交互的标准接口, CGIC是一个功能比较强大的支持CGI开发的标准C库。
6.1 CGI处理步骤
1、通过浏览器将用户请求送到服务器
2、服务器接收用户请求并交给CGI程序处理
3、CGI程序把处理结果传送给服务器
4、服务器把结果送回到浏览器
1.取得html页面中file元素的值,应该是文件在客户机上的路径名
cgiFormFileName("file", name, sizeof(name))2.目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件
cgiFormFileOpen("file", &file) 3.在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录))建立新文件 \
open(fileNameOnServer,O_RDWR|O_CREAT|O_TRUNC|O_APPEND,mode); 4.从系统临时文件中读出文件内容,并放到刚创建的目标文件中
cgiFormFileRead(file, buffer, BufferLen, &got)