工作中遇到的需求。
物联网设备很多硬件配置都不高。相对来说。。
设备需要一个管理设备数据、控制设备的入口。这时候需要一个可配置的页面。例如:路由器、串口服务器、PDU等。
方案采取thttpd作为web服务器,接口使用cgi进行开发。简介明了,占用资源少。
官网:http://acme.com/software/thttpd/
thttpd 是一个简单、小巧、便携、快速且安全的 HTTP 服务器。
简单的:
它只处理实现 HTTP/1.1 所需的最低限度。好吧,也许比最低限度多一点。
小的:
参见 对比图 它还具有非常小的运行时大小,因为它不会分叉和对内存分配非常小心。
便携的:
它可以在大多数任何类 Unix 操作系统上干净地编译,特别包括FreeBSD、SunOS 4、Solaris 2、BSD/OS、Linux、OSF。
快速地:
在典型使用中,它与最好的全功能服务器一样快Apache、NCSA、网景)。在极端负载下它要快得多。
安全的:
它不遗余力地保护网络服务器机器免受 来自其他站点的攻击和入侵。
它还有一个非常有用的功能( 基于 URL 流量的限制 )目前没有其他服务器。另外,它支持 IPv6 开箱即用,无需修补。
tar -zxvf thttpd-2.29.tar.gz
cd thttpd-2.29/
./configure CC=arm-linux-gcc --host=arm-linux --prefix=/home/pnc120432be01/Desktop/liyuworkspace/arm/thttpd
make
make install
编译出来的可执行文件thttpd直接拷贝到arm机器上
关于配置的建议:
1.thttpd.conf可以配置thttpd的运行参数
port=80
user=www
host=0.0.0.0
logfile=/usr/local/thttpd/logs/thttpd.log
pidfile=/usr/local/thttpd/logs/thttpd.pid
#throttles=/usr/local/thttpd/etc/throttle.conf
#urlpat=*.txt|*.mp3
#charset=utf-8
dir=/usr/www
cgipat=/usr/local/thttpd/www/cgi-bin/
带着配置文件运行即可
thttpd -D -C /etc/thttpd.conf &
2.可以直接执行thttpd时配置(推荐这个,直接写个shell)
./thttpd -d /home/freeproject/liyu/web -u root -p 80 -c "cgi/**.cgi" -T utf-8
此时就可以在浏览器打开页面了
交叉编译cgi。
我使用的cJSON库,返回数据都是JSON数据,可以直接被网页处理。
样例代码:
/*
* Copyright (c), 2022, liyu, All rights reserved.
*
* @FilePath: /pthread/home/freeproject/liyu/code/cgi/testcgi/test.c
* @brief:
*
* @author: liyu
* @version: 0.0.0.1
* @Date: 2022-04-05 01:37:53
* @email: liyu19981212@outlook.com
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "../pub/cgic.h"
#include "../pub/cJSON.h"
int32_t cgiMain()
{
int32_t ret;
char *buff;
cJSON *cgi_verification;
cJSON *root;
cgiHeaderContentType("text/html");
cgi_verification = cJSON_CreateObject();
if (NULL == cgi_verification) {
return -1;
} else {
cJSON_AddNumberToObject(cgi_verification, "state", 0);
cJSON_AddStringToObject(cgi_verification,"msgstr","");
}
root = cJSON_CreateObject();
cJSON_AddStringToObject(root,"name","liyu");
cJSON_AddNumberToObject(root,"age",23);
cJSON_AddItemToObject(cgi_verification,"data",root);
buff = cJSON_PrintUnformatted(cgi_verification);
printf("%s", buff);
free(buff);
cJSON_Delete(cgi_verification);
return 0;
}
交叉编译该文件
arm-linux-gcc test.c cgic.c cJSON.c -o test.cgi
将文件放到配置的cgi目录中
给予可执行权限
chmod 755 test.cgi
页面获取数据:
{
"state": 0,
"msgstr": "",
"data": {
"name": "liyu",
"age": 23
}
}