rv1106-sdk-的ipcweb-分析
目录
rv1106 sdk 的ipcweb 分析
控制开关
ipcweb 的编译控制开关在Boardconfig文件中
# build ipc web backend
# export RK_APP_IPCWEB_BACKEND=y
缺省是关闭的,去除#号打开编译开关。
主Makefile分析
主Makefile在luckfox-pico/project/app/ipcweb/中
Boardconfig文件中的RK_APP_IPCWEB_BACKEND传递到这里,如果为真,添加ipcweb-build
# define project/cfg/BoardConfig*.mk
ifeq ($(RK_APP_IPCWEB_BACKEND),y)
PKG_TARGET := ipcweb-build
endif
ipcweb-build是编译主要部分
all: $(PKG_TARGET)
@echo "build $(PKG_NAME) done"
ipcweb-build:
# 设置各种文件夹
@rm -rf $(PKG_BIN) $(PKG_TARPATH) && mkdir -p $(PKG_TARPATH) $(PKG_BIN) $(PKG_BUILD);
@cp -rfa $(PKG_TARBALL)/include $(PKG_TARPATH)/;
@cp -rfa $(PKG_TARBALL)/usr $(PKG_TARPATH)/;
@echo "PKG_TARPATH is $(PKG_TARPATH)";
pushd $(PKG_BUILD)/; \
rm -rf CMakeCache.txt; \
cmake $(CURRENT_DIR)/$(PKG_NAME)/ \
-DCMAKE_C_COMPILER=$(RK_APP_CROSS)-gcc \
-DCMAKE_CXX_COMPILER=$(RK_APP_CROSS)-g++ \
-DCMAKE_INSTALL_PREFIX="$(CURRENT_DIR)/$(PKG_BIN)" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_COLOR_MAKEFILE=OFF \
-DCMAKE_SYSTEM_NAME=Linux \
-DUSE_RKIPC=ON \
$(PKG_CONF_OPTS) ;\
make -j$(RK_APP_JOBS) || exit -1; \
make install; \
popd;
(mkdir -p $(PKG_BIN)/usr;mv $(PKG_BIN)/www $(PKG_BIN)/usr;);
ifeq ($(PKG_INSTALL_TO_ROOTFS),YES)
@cp -rfa $(PKG_TARBALL)/etc $(PKG_TARPATH)/;
@cp -rfa $(PKG_TARBALL)/usr $(PKG_TARPATH)/;
else
@cp -rfa $(PKG_TARBALL)/etc4oem $(PKG_TARPATH)/etc
endif
@test ! -d $(PKG_BIN)/root/include || mv $(PKG_BIN)/root/include $(PKG_BIN)/;
$(call MAROC_COPY_PKG_TO_APP_OUTPUT, $(RK_APP_OUTPUT), $(PKG_BIN))
整个过程是进入ipcweb-backend,编译,把etc4oem里面的内容复制到etc文件夹里面
ipcweb-backend 的Cmakelist分析
这个文件就是添加源代码的目录
add_subdirectory(src)
这个就是把src目录添加进来编译
src的Cmakelist分析
这个文件也是设置编译规则,添加源代码文件,最后把各个文件安装到安装目录
在末尾把编译出来的entry.cgi放到oem的www/cgi-bin文件夹
把www-rkipc 的内容放到 www 文件夹
if(IPCWEBBACKEND_INSTALL_ON_OEM_PARTITION)
install(TARGETS entry.cgi RUNTIME DESTINATION /www/cgi-bin)
else()
install(TARGETS entry.cgi RUNTIME DESTINATION www/cgi-bin)
endif()
if (${USE_RKIPC})
install(DIRECTORY ${PROJECT_SOURCE_DIR}/www-rkipc/ DESTINATION www)
endif()
www-rkipc 文件夹分析
这里是前端的文件,根据md的说明,使用了angular架构
luckfox-pico/project/app/ipcweb/ipcweb-backend/www-rkipc$ tree ./
./
├── assets
│ ├── css
│ │ └── bootstrap-extended.css.gz
│ ├── i18n
│ │ └── zh-CN.json.gz
│ ├── images
│ │ ├── btn_blue_01.9.png.gz
│ │ ├── btn_blue_02.9.png.gz
│ │ ├── btn_red_01.9.png.gz
│ │ ├── btn_red_02.9.png.gz
│ │ ├── icon_checkbox_01.png.gz
│ │ ├── icon_checkbox_02.png.gz
│ │ ├── icon_choice_01.png.gz
│ │ ├── icon_choice_02.png.gz
│ │ ├── icon_copy_time_table.png.gz
│ │ ├── icon_play_l_01.png.gz
│ │ ├── icon_play_l_02.png.gz
│ │ ├── icon_stop_l_01.png.gz
│ │ ├── icon_stop_l_02.png.gz
│ │ ├── icon_triangle_s_b_01-12.png.gz
│ │ ├── icon_triangle_s_b_01.png.gz
│ │ ├── icon_triangle_s_b_02-12.png.gz
│ │ ├── icon_triangle_s_b_02.png.gz
│ │ ├── left_icon_a_01.png.gz
│ │ ├── left_icon_a_02.png.gz
│ │ ├── left_icon_b_01.png.gz
│ │ ├── left_icon_b_02.png.gz
│ │ ├── left_icon_c_01.png.gz
│ │ ├── left_icon_c_02.png.gz
│ │ ├── left_icon_d_01.png.gz
│ │ ├── left_icon_d_02.png.gz
│ │ ├── left_icon_e_01.png.gz
│ │ ├── left_icon_e_02.png.gz
│ │ ├── left_icon_f_01.png.gz
│ │ ├── left_icon_f_02.png.gz
│ │ ├── left_icon_g_01.png.gz
│ │ ├── left_icon_g_02.png.gz
│ │ ├── left_icon_h_01.png.gz
│ │ ├── left_icon_h_02.png.gz
│ │ ├── left_icon_i_01.png.gz
│ │ ├── left_icon_i_02.png.gz
│ │ ├── left_icon_j_01.png.gz
│ │ ├── left_icon_j_02.png.gz
│ │ ├── light-on.gif
│ │ ├── play_icon_a_01.png.gz
│ │ ├── play_icon_a_02.png.gz
│ │ ├── play_icon_b_01.png.gz
│ │ ├── play_icon_b_02.png.gz
│ │ ├── play_icon_c_01.png.gz
│ │ ├── play_icon_c_02.png.gz
│ │ ├── play_icon_d_01.png.gz
│ │ ├── play_icon_d_02.png.gz
│ │ ├── play_icon_dot.png.gz
│ │ ├── play_icon_e_01.png.gz
│ │ ├── play_icon_e_02.png.gz
│ │ ├── play_icon_f_01.png.gz
│ │ ├── play_icon_f_02.png.gz
│ │ ├── play_icon_h_01.png.gz
│ │ ├── play_icon_h_02.png.gz
│ │ ├── play_icon_i_01.png.gz
│ │ ├── play_icon_i_02.png.gz
│ │ ├── top_icon_i_01.png.gz
│ │ ├── top_icon_i_02.png.gz
│ │ ├── top_icon_quit_01.png.gz
│ │ ├── top_icon_quit_02.png.gz
│ │ ├── top_icon_user_01.png.gz
│ │ ├── top_icon_user_02.png.gz
│ │ ├── yt_icon_a_01.png.gz
│ │ ├── yt_icon_a_02.png.gz
│ │ ├── yt_icon_b_01.png.gz
│ │ ├── yt_icon_b_02.png.gz
│ │ ├── yt_icon_c_01.png.gz
│ │ ├── yt_icon_c_02.png.gz
│ │ ├── yt_icon_d_01.png.gz
│ │ ├── yt_icon_d_02.png.gz
│ │ ├── yt_icon_e_01.png.gz
│ │ ├── yt_icon_e_02.png.gz
│ │ ├── yt_icon_f_01.png.gz
│ │ ├── yt_icon_f_02.png.gz
│ │ ├── yt_icon_g_01.png.gz
│ │ ├── yt_icon_g_02.png.gz
│ │ ├── yt_icon_h_01.png.gz
│ │ ├── yt_icon_h_02.png.gz
│ │ ├── yt_icon_i_01.png.gz
│ │ ├── yt_icon_i_02.png.gz
│ │ ├── yt_icon_j_01.png.gz
│ │ ├── yt_icon_j_02.png.gz
│ │ ├── yt_icon_k_01.png.gz
│ │ ├── yt_icon_k_02.png.gz
│ │ ├── yt_icon_l_01.png.gz
│ │ ├── yt_icon_l_02.png.gz
│ │ ├── yt_icon_m_01.png.gz
│ │ ├── yt_icon_m_02.png.gz
│ │ ├── yt_icon_n_01.png.gz
│ │ ├── yt_icon_n_02.png.gz
│ │ ├── yt_icon_o_01.png.gz
│ │ ├── yt_icon_o_02.png.gz
│ │ ├── yt_icon_p_01.png.gz
│ │ ├── yt_icon_p_02.png.gz
│ │ ├── yt_icon_q_01.png.gz
│ │ ├── yt_icon_q_02.png.gz
│ │ ├── yt_icon_r_01.png.gz
│ │ ├── yt_icon_r_02.png.gz
│ │ ├── yt_icon_s_01.png.gz
│ │ ├── yt_icon_s_02.png.gz
│ │ ├── yt_icon_t_01.png.gz
│ │ ├── yt_icon_t_02.png.gz
│ │ ├── yt_icon_u_01.png.gz
│ │ └── yt_icon_u_02.png.gz
│ └── wxplayer
│ ├── prod.all.wasm.combine.js.gz
│ ├── prod.h265.wasm.combine.js.gz
│ ├── wxplayer.d.ts
│ └── wxplayer.js.gz
├── favicon.ico
├── index.html
├── main-es2015.325ceb896438639cd1f7.js.gz
├── polyfills-es2015.ca64e4516afbb1b890d5.js.gz
├── runtime-es2015.0811dcefd377500b5b1a.js.gz
├── scripts.6ee986b7cd7aefa6baef.js.gz
├── styles.7ce364de74ca93e3cffa.css.gz
├── yt_icon_r_02.5ab0362730f3d936e77e.png.gz
├── yt_icon_s_02.963b0e47ebf0b2056c86.png.gz
└── yt_icon_t_02.cb9304ec1b4d2eadae95.png.gz
ipcweb-env-arm文件夹分析
luckfox-pico/project/app/ipcweb/ipcweb-backend/ipcweb-env-arm$ tree ./
./
├── etc
│ ├── init.d
│ │ ├── S50fcgiwrap
│ │ └── S50nginx
│ └── nginx
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ └── win-utf
├── etc4oem //有OEM分区时候的配置文件
│ ├── init.d
│ │ ├── S50fcgiwrap //启动fcgiwrap,nginx本身不支持cgi,要通过fcgiwrap代理
│ │ └── S50nginx 启动nginx
│ └── nginx //nginx的配置文件
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ └── win-utf
├── include
│ ├── cgicc
│ │ ├── Cgicc.h
│ │ ├── CgiDefs.h
│ │ ├── CgiEnvironment.h
│ │ ├── CgiInput.h
│ │ ├── CgiUtils.h
│ │ ├── FormEntry.h
│ │ ├── FormFile.h
│ │ ├── HTMLAtomicElement.h
│ │ ├── HTMLAttribute.h
│ │ ├── HTMLAttributeList.h
│ │ ├── HTMLBooleanElement.h
│ │ ├── HTMLClasses.h
│ │ ├── HTMLDoctype.h
│ │ ├── HTMLElement.h
│ │ ├── HTMLElementList.h
│ │ ├── HTTPContentHeader.h
│ │ ├── HTTPCookie.h
│ │ ├── HTTPHeader.h
│ │ ├── HTTPHTMLHeader.h
│ │ ├── HTTPPlainHeader.h
│ │ ├── HTTPRedirectHeader.h
│ │ ├── HTTPResponseHeader.h
│ │ ├── HTTPStatusHeader.h
│ │ ├── HTTPXHTMLHeader.h
│ │ ├── MStreamable.h
│ │ ├── XHTMLDoctype.h
│ │ ├── XMLDeclaration.h
│ │ └── XMLPI.h
│ └── nlohmann
│ └── json.hpp
└── usr
├── bin
│ └── cgi-fcgi
├── lib
│ ├── libcgicc.so -> libcgicc.so.3
│ ├── libcgicc.so.3
│ ├── libfcgi++.so
│ ├── libfcgi.so -> libfcgi.so.0
│ ├── libfcgi.so.0
│ ├── libpcre.so -> libpcre.so.1
│ └── libpcre.so.1
└── sbin
├── fcgiwrap
└── nginx //nginx的主程序
S50nginx 分析
#!/bin/sh
#
# Start/stop nginx
#
# 指定nginx位置
NGINX=/oem/usr/sbin/nginx
# 指定nginx的PID文件
PIDFILE=/var/run/nginx.pid
case "$1" in
start)
echo "Starting nginx..."
mkdir -p /var/log/nginx /var/tmp/nginx
sleep 1
# 配置文件 /oem/usr/etc/nginx/nginx.conf
start-stop-daemon -S -x "$NGINX" -p "$PIDFILE" -- -c /oem/usr/etc/nginx/nginx.conf
;;
stop)
echo "Stopping nginx..."
start-stop-daemon -K -x "$NGINX" -p "$PIDFILE" -o
;;
reload|force-reload)
echo "Reloading nginx configuration..."
"$NGINX" -s reload
;;
restart)
"$0" stop
sleep 1 # Prevent race condition: ensure nginx stops before start.
"$0" start
;;
*)
echo "Usage: $0 {start|stop|restart|reload|force-reload}"
exit 1
esac
nginx.conf 文件分析
http 部分
http {
include mime.types;
default_type application/octet-stream;
access_log off;
# 头控制
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Range,Content-Type,Authorization';
add_header 'Access-Control-Expose-Headers' 'X-Location';
sendfile on;
keepalive_timeout 65;
# 压缩支持
gzip on;
gzip_min_length 20;
gzip_comp_level 5;
gzip_vary on;
gzip_types text/html application/javascript application/x-javascript text/javascript image/png image/x-icon;
gzip_static on;
gzip_buffers 2 4k;
gzip_http_version 1.1;
# 端口80
server {
listen 80;
server_name localhost;
# /live开flv
location /live {
flv_live on;
}
# /主文件夹/oem/usr/www, 入口index.html index.htm
location / {
root /oem/usr/www;
index index.html index.htm;
}
# 媒体文件
location ~* (mp4|bmp)$ {
root /oem/usr/www;
if ($request_uri ~* view$) {
add_header Content-Disposition inline;
}
if ($request_uri !~* view$) {
add_header Content-Disposition attachment;
}
}
error_page 404 /;
# cgi调用
location /cgi-bin/ {
gzip off;
root /oem/usr/www;
fastcgi_pass unix:/run/fcgiwrap.sock;
fastcgi_index entry.cgi;
fastcgi_param DOCUMENT_ROOT /oem/usr/www/cgi-bin;
fastcgi_param SCRIPT_NAME /entry.cgi;
include fastcgi_params;
set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?cgi)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
}
rtmp 反代
rtmp {
server {
listen 1935;
chunk_size 4096;
#allow publish 127.0.0.1;
#deny publish all;
application live {
live on;
}
#application hls {
# live on;
# hls on;
# hls_path /tmp/hls;
# hls_fragment 1s;
#}
}
}
无cgi的nginx 服务器测试
单纯用nginx加index.html可以测试静态服务器
启动
创建启动文件夹并把启动文件复制过去
[root@luckfox etc]# mkdir ./init.d/
luckfox-pico/project/app/ipcweb/ipcweb-backend/ipcweb-env-arm/etc4oem/init.d$ scp ./S50nginx root@192.168.9.161:/oem/usr/etc/init.d
nginx配置
luckfox-pico/project/app/ipcweb/ipcweb-backend/ipcweb-env-arm/etc4oem$ scp -r ./nginx root@192.168.9.161:/oem/usr/etc
nginx主程序
luckfox-pico/project/app/ipcweb/ipcweb-backend/ipcweb-env-arm$ scp -r ./usr root@192.168.9.161:/oem
创建前端文件夹
[root@luckfox usr]# mkdir ./www
在前端文件夹里面创建index.html
<!DOCTYPE html>
<html>
<head>
<title>nginx测试</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
测试
重启下位机,在浏览器输入下位机ip,正常显示hello world。