在树莓派上移植openwrt中的web服务
openwrt 中默认使用的web服务器是uhttpd,uhttp是一款功能全面又小巧的web服务器,非常适合学习web服务编程使用,此外,在嵌入式设备中使用该web服务器,也是一个不错的选择。
这里就介绍一下关于 uhttpd 移植相关的内容,以树莓派上的debian 系统为例,一步一步的将uhttpd移植过去。
uhttp相关依赖
- json-c
- ubox
- ubus
- lua
ubus 简介
ubus 是 openwrt 中实现进程间通信的一套通用框架,通过 ubus ,可以使得进程间的通信变得非常简单,这套进程间通信机制也可以非常方便的移植到其他的linux系统中,在移植 uhttpd 的同时,也将ubus 移植到了树莓派中,后续会另起一篇文章介绍一下 ubus 的使用。
移植步骤
uhttpd 是使用 cmake 进行编译的,因此在编译之前需要安装一下 cmake,这个就不介绍了。
移植 json-c
$ git clone https://github.com/json-c/json-c.git
$ cd json-c
$ ./autogen.sh --configure
$ make
$ make install
注意事项
在进行 autogen.sh 时 如果提示 autoreconf 不存在,则需要安装 autoreconf。
$ sudo apt-get install dh-autoreconf
移植 ubox
$ git clone git://git.openwrt.org/project/libubox.git
$ cd libubox
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_LUA=off
$ make
$ make install
移植 ubus
$ git clone git://git.openwrt.org/project/ubus.git
$ cd ubus
$ cmake -DBUILD_LUA=off
$ make
$ make install
编译完成后,会生成以下文件。
-rwxr-xr-x 1 root root 233K Sep 26 10:28 libubus.so
drwxr-xr-x 3 root root 4.0K Sep 26 10:27 lua
-rwxr-xr-x 1 root root 124K Sep 26 10:28 ubus
-rwxr-xr-x 1 root root 273K Sep 26 10:28 ubusd
注意事项
因为在 make install 的时候,默认没有将 libubus.so 安装到系统的库路径下,如果要使用 ubus 的话,还需要将 libusus.so 拷贝到系统库下面。
$ cp libubus.so /usr/local/lib/
移植 lua
$ git clone https://github.com/lua/lua.git
$ cd lua
$ make linux
$ make install
注意事项
编译过程中如果提示 缺少 readline.h 则需要安装 libreadline-dev
$ sudo apt-get install libreadline-dev
移植 uhttpd
$ cd uhttpd/build
$ cmake ..
$ make
$ make install
注意事项
如果不需要 uhttpd 支持 TLS 则需要在 CMakeList.txt 文件中将 TLS_SUPPORT 选项设置为 OFF。
# CMakeList.txt
OPTION(TLS_SUPPORT "TLS support" OFF)
测试
所有软件移植完成后,uhttpd就可以正常运行了。
root@raspberrypi:/home/qiao/http/uhttpd/ubus/build# ubus
Usage: ubus [<options>] <command> [arguments...]
Options:
-s <socket>: Set the unix domain socket to connect to
-t <timeout>: Set the timeout (in seconds) for a command to complete
-S: Use simplified output (for scripts)
-v: More verbose output
-m <type>: (for monitor): include a specific message type
(can be used more than once)
-M <r|t> (for monitor): only capture received or transmitted traffic
Commands:
- list [<path>] List objects
- call <path> <method> [<message>] Call an object method
- listen [<path>...] Listen for events
- send <type> [<message>] Send an event
- wait_for <object> [<object>...] Wait for multiple objects to appear on ubus
- monitor Monitor ubus traffic
root@raspberrypi:/home/qiao/http/uhttpd/ubus/build# uhttpd --help
uhttpd: invalid option -- '-'
Usage: uhttpd -p [addr:]port -h docroot
-f Do not fork to background
-c file Configuration file, default is '/etc/httpd.conf'
-p [addr:]port Bind to specified address and port, multiple allowed
-h directory Specify the document root, default is '.'
-E string Use given virtual URL as 404 error handler
-I string Use given filename as index for directories, multiple allowed
-S Do not follow symbolic links outside of the docroot
-D Do not allow directory listings, send 403 instead
-R Enable RFC1918 filter
-n count Maximum allowed number of concurrent script requests
-N count Maximum allowed number of concurrent connections
-l string URL prefix for Lua handler, default is '/lua'
-L file Lua handler script, omit to disable Lua
-u string URL prefix for UBUS via JSON-RPC handler
-U file Override ubus socket path
-a Do not authenticate JSON-RPC requests against UBUS session api
-X Enable CORS HTTP headers on JSON-RPC api
-x string URL prefix for CGI handler, default is '/cgi-bin'
-y alias[=path] URL alias handle
-i .ext=path Use interpreter at path for files with the given extension
-t seconds CGI, Lua and UBUS script timeout in seconds, default is 60
-T seconds Network timeout in seconds, default is 30
-k seconds HTTP keepalive timeout
-A seconds TCP keepalive timeout, default is unset
-d string URL decode given string
-r string Specify basic auth realm
-m string MD5 crypt given string
root@raspberrypi:/home/qiao/http/uhttpd/ubus/build#uhttpd -f -h /www -T 30 -k 20 -A 1 -n 3 -N 100 -R -p 0.0.0.0:80 -p [::]:80
结尾
以上就是整个移植过程,移植完成之后,下一步就开始在树莓派上使用 uhttpd 了,此外,还能够使用 ubus 框架在 树莓派上实现进程间通信,请等待后续更新…