在设备中嵌入Web,作为配置软件的接口是目前嵌入式设备的常见做法了。
由于种种原因,暂定为这个方案,虽然行业中使用这个方案的人不多,但还是记录一下,万一有一样的小伙伴呢。
实现方案: 树莓派3B+、Nginx、spawn-fcgi、C++。
系统架构
软件安装
树莓派3B+,镜像版本:2020-05-27-raspios-buster-armhf.zip
1.安装Nginx
sudo apt-get install nginx
nginx -v
:”nginx version: nginx/1.14.2”
2.安装fast-cgi库
使用C++编写FCGI程序,需要安装fast-cgi库。
sudo apt-get install libfcgi-dev
3.安装spawn-fcgi
要启动cgi程序,需要安装spawn-fcgi。
sudo apt-get install spawn-fcgi
配置
配置Nginx:
1 | mkdir /home/pi/Web |
在http{}中添加:
1 | http { |
此配置项配置了server监听8080端口的http连接,使用http://设备ip:8080
就能访问到我们的Web服务;
网页的根目录为创建的/home/pi/Web
,网页静态文件存在这个目录下;
所有带有.cgi
后缀的访问都转发给fastcgi,fastcgi的地址为127.0.0.1:8000
;
include fastcgi.conf
是添加引用“fastcgi.conf”的规则,这个规则如下:
在/etc/nginx/
中添加文件fastcgi.conf:
1 | fastcgi_param GATEWAY_INTERFACE CGI/1.1; |
以上的fastcgi_param
配置,配置了Nginx传递给FCGI程序的环境变量。
在C++中可以使用FCGX_GetParam
函数获取到这些值。编辑一个用来测试的CGI程序,如下所示:
1 | // test.cpp |
编译:
1 | g++ test.cpp -o test -lfcgi -lfcgi++ |
启动CGI服务:
1 | spawn-fcgi -a 127.0.0.1 -p 8888 -f test # -n 进入调试模式,可以看到程序的错误输出信息 |
成功时输出:
1 | spawn-fcgi: child spawned successfully: PID: 7144 |
查看网络状态,确定FCGI程序是否正在运行:
1 | sudo netstat -apn | grep 8888 |
成功时会输出如下语句:
1 | tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 7144/./index |
启动Nginx服务:
1 | sudo nginx -s reload |
Nginx常用命令:
1 | sudo nginx |
现在打开浏览器,输入以下网址进行访问:
1 | http://ip:8080/test.cgi |
浏览器显示:
异步获取、设置设备参数
实现功能:
- 异步获取、设置设备版本参数
- 上传小于256KB的JPG文件到服务器
- 文件MD5校验
项目所有文件Web.tar.gz:
1 | Web |
makefile
1 | all : main.cpp urls.cpp md5.c char_md5.c |
main.cpp
1 |
|
urls.h
1 |
|
urls.cpp
1 |
|
index.html
1 |
|
index.js
1 | function getVersion() |