目录

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。