【ARM】在NUC977上搭建基于boa的嵌入式web服务器

简介: 【ARM】在NUC977上搭建基于boa的嵌入式web服务器

一、实验目的

搭建基于arm开发板的web服务端程序,通过网页控制开发板LED状态

二、boa简介

Boa服务器是一个小巧高效的web服务器,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。Boa是一种非常小巧的Web服务器,其可执行代码只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。

三、源码下载

下载链接直达:http://www.boa.org/news.html

四、源码编译

# 解压
tar- xvf boa-0.94.14rc21.tar.gz
cd boa-0.94.14rc21
# 配置生成makefile
./configure
# 修改makefile编译工具:这里选择自己的交叉编译器
vim ./src/Makefile
CC = arm-linux-gcc
CPP = arm-linux-gcc -E
# 编译
make

为了保险期间我们使用file指令查看一下生成的文件是否为arm版本

然后我们开始准备开发板上需要的文件配置

mkdir nuc977
cp src/boa
cp src/boa ./nuc977/
cp examples/boa.conf ./nuc977/
cp /etc/mime.types ./nuc977/
touch ./nuc977/group
mkdir ./nuc977/www
mkdir ./nuc977/www/cgi-bin
touch ./nuc977/index.html
cd nuc977/

// 如果这里没有example文件夹可以使用“find ./ -name boa.conf”这个命令查找一下源码下conf文件的位置一定有的

然后将这些文件传输到nfs文件夹中

五、开发板配置

mkdir /etc/boa
cp /mnt/nuc977/www / -rf
cp /mnt/nuc977/boa /etc/boa
cp /mnt/nuc977/boa.conf /etc/boa
cp /mnt/nuc977/mime.types /etc
cp /mnt/nuc977/group /etc
cp /mnt/nuc977/index.html /www

然后需要修改我们的etc/boa/box.conf文件内容

Group nogroup 改为Group 0 // 修改nogroup为0
ErrorLog /etc/boa/error_log  // 更改路径
AccessLog /etc/boa/access_log // 更改路径
ServerName www.your.org.here // 取消注释
DocumentRoot /www  // 修改路径
ScriptAlias /cgi-bin/ /www/cgi-bin/  // 修改路径

修改index.html界面,内容如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>LED控制页面</title>
    </head>
    <body> 
    <input type="button" value="开"/>
    <input type="button" value="关"/>
    </body>
</html> 
cd /etc/boa 
 ./boa

然后我们ifconfig查看开发板ip,然后在我们pc端浏览器输入该ip地址查看效果

六、控制led灯实验

方案1

boaapp.c文件

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
void led_on()
{
    char ubuf[2] = {1, 0};    
    int fd; 
    fd = open("/dev/led",O_RDWR);
 
    if(fd < 0)
    {
        printf("open runled device error\r\n");
        return;
    }   
    write(fd, ubuf, 1); 
    close(fd);
}
void led_off()
{
    char ubuf[2] = {0, 0};    
    int fd; 
    fd = open("/dev/led",O_RDWR);
 
    if(fd < 0)
    {   
        printf("open runled device error\r\n");
        return;
    }   
    write(fd, ubuf, 1); 
    close(fd);
}
int main(void)
{
    char *data;
    printf("Content-Type:text/html;charset=gb2312\n\n");//它是一个MIME头信息,它告诉Web服务器随后的输出是以html的形式
    printf("<html>\n");
    printf("<body>\n");
    printf("<title>this is title</title> ");
    printf("<h3>this is h3</h3> ");
    data = getenv("QUERY_STRING");//得到客户端发送过来的数据
    printf("<p>接受到的数据为:%d</p>",data);
    if(strcmp(data,"on"))
    {
        led_on();
    }else if(strcmp(data,"off"))
    {
        led_off();
    }
    printf("</body>\n");
    printf("</html>\n");
    // free(data);
    return 0;
}

编译

arm-linux-gcc boaapp.c -o boaapp.cgi -static

然后我们将编译出来的文件拷贝到开发板的www/cgi-bin文件夹中,然后我们进入浏览器进行访问,然后一直出现错误,经过实验可以得知问题出在函数getenv上(http://192.168.1.3/cgi-bin/boaapp.cgi

只要把这里注释掉就正常访问了

方案2

下载https://github.com/boutell/cgic

修改cgictest.c

#include"cgic.h"
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
void led_on()
{
    char ubuf[2] = {1, 0};     
    int fd;
    fd = open("/dev/led",O_RDWR);
 
    if(fd < 0)
    {
        printf("<p align=\"center\">open onled device error<\p>>");
        return;
    }
    write(fd, ubuf, 1);
    close(fd);
}
void led_off()
{
    char ubuf[2] = {0, 0};     
    int fd;
    fd = open("/dev/led",O_RDWR);
 
    if(fd < 0)
    {
        printf("<p align=\"center\">open offled device error<\p>>");
        return;
    }
    write(fd, ubuf, 1);
    close(fd);
}
int cgiMain()
{ 
  char state[10]; 
  // cgiFormString("led_num", led_num, 10); // 从表单中的led_num字段获取值存入到led_num 
  cgiFormString("state", state, 10);// 从表单中的led_state字段获取值存入到led_state 
  cgiHeaderContentType("text/html"); // 设定输出的内容格式 这里我们要输出HTML
  fprintf(cgiOut,"<title>LED Test</title>"); 
  fprintf(cgiOut,"<p align=\"center\">recv from arm:</p>");
  fprintf(cgiOut,"<form action=\"cgictest.cgi\" align=\"center\">LED_STATE<br><input type=\"text\" name=\"state\" \
          value=\"on\"><br><input type=\"submit\" value=\"push\"></form>");
  // fprintf(cgiOut,"led_num: %s", led_num);
  fprintf(cgiOut,"<br> <p align=\"center\">state: %s</p>", state);
  
  if(!strcmp(state,"on"))
    {
        led_on();
    system("echo 1>/dev/led");
    }else if(!strcmp(state,"off"))
    {
        led_off();
    system("echo 0>/dev/led");
    }
  
  return 0;
}

修改makefile:参考

CFLAGS=-g -Wall
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
LIBS=-L./ -lcgic
all: libcgic.a cgictest.cgi
install: libcgic.a
  cp libcgic.a /usr/local/lib
  cp cgic.h /usr/local/include
  @echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include.
libcgic.a: cgic.o cgic.h
  rm -f libcgic.a
  $(AR) rc libcgic.a cgic.o
  $(RANLIB) libcgic.a
#mingw32 and cygwin users: replace .cgi with .exe
cgictest.cgi: cgictest.o libcgic.a
  $(CC) cgictest.o -o cgictest.cgi ${LIBS}
clean:
  rm -f *.o *.a cgictest.cgi capture cgicunittest
test:
  $(CC) -D UNIT_TEST=1 cgic.c -o cgicunittest
  ./cgicunittest

最后目录组成

执行make然后将生成的.cgi文件拷贝到板子的www/cgi-bin目录下然后打开浏览器

最终效果(目前)


相关文章
|
1月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
1月前
|
人工智能 安全 大数据
ARM 服务器上安装 OpenEuler (欧拉)
openEuler 是华为于2019年开源的操作系统,支持多种处理器架构,包括X86和鲲鹏。截至2020年底,openEuler 拥有3万社区用户、2万多个拉取请求、2000多名贡献者和7032款软件。openEuler 提供高效、稳定、安全的系统,适用于数据库、大数据、云计算和人工智能等场景。本文介绍了在神州鲲泰 R522 服务器上安装 openEuler 的详细步骤,包括下载镜像、配置 RAID 和 BIOS 设置等。
189 0
ARM 服务器上安装 OpenEuler (欧拉)
|
1月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器计算架构X86/ARM/GPU/FPGA/ASIC/裸金属/超级计算集群有啥区别?
阿里云服务器ECS提供了多种计算架构,包括X86、ARM、GPU/FPGA/ASIC、弹性裸金属服务器及超级计算集群。X86架构常见且通用,适合大多数应用场景;ARM架构具备低功耗优势,适用于长期运行环境;GPU/FPGA/ASIC则针对深度学习、科学计算、视频处理等高性能需求;弹性裸金属服务器与超级计算集群则分别提供物理机级别的性能和高速RDMA互联,满足高性能计算和大规模训练需求。
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
44 3
|
1月前
|
数据处理
基于ARM的嵌入式原理与应用:ALU的功能与特点
基于ARM的嵌入式原理与应用:ALU的功能与特点
|
3月前
|
JavaScript 搜索推荐 前端开发
从零搭建到部署:Angular与Angular Universal手把手教你实现服务器端渲染(SSR),全面解析及实战指南助你提升Web应用性能与SEO优化效果
【8月更文挑战第31天】服务器端渲染(SSR)是现代Web开发的关键技术,能显著提升SEO效果及首屏加载速度,改善用户体验。Angular Universal作为官方SSR解决方案,允许在服务器端生成静态HTML文件。本文通过具体示例详细介绍如何使用Angular Universal实现SSR,并分享最佳实践。首先需安装Node.js和npm。
76 1
|
2月前
|
Ubuntu 开发工具 git
在Ubuntu上部署BOA服务器的步骤
部署BOA服务器是一个涉及多个步骤的过程,包括系统更新、安装依赖、下载和编译源代码、配置服务器以及启动和验证。遵循上述步骤,可以在Ubuntu系统上成功部署BOA服务器,为开发和测试提供一个轻量级的Web服务器环境。
65 0
|
3月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
159 0
|
3月前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
40 0
|
3月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
55 0