V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kydin
V2EX  ›  程序员

怎么在嵌入式中实现一个 web 页面?

  •  
  •   kydin ·
    HiKydin · 6 天前 via iPhone · 4651 次点击
    背景:
    需要提供一个 Web 页面给到嵌入式开发板,就是像路由器一样输 IP 进入。
    开发板的 Flash 大小为 16MB ,这个大小目前暂时不可能扩大,除去系统占用留下的空间 10MB 内。
    运行的是 PetaLinux 系统,这个板子的性能是够的,就是 Flash 小。

    需求:
    1. 显示一些系统信息:比如版本号、MAC 地址....
    2. 显示我的程序的一些数据:比如我程序的 MQTT 连接状态.....
    3. 提供下载系统日志/内核日志的按钮
    4. 提供一个输入框来配置我的程序的配置文件:比如 MQTT 服务器端口、地址......

    提问:
    因为小弟之前做过 OpenWrt 相关的程序,所以目前能想到的就是用 ubus+uhttpd+luci 。
    加上 c 语言使用 ubus 库对于需求的第 2 点和第 4 点实现起来非常简单,然后需求的第 3 点直接用 cgi 来做就好了。
    但是目前的系统不是 OpenWrt ,同时也想尝试其它不同的技术,所以想问一下大家有没有什么建议?
    46 条回复    2024-06-23 00:33:32 +08:00
    cssk
        1
    cssk  
       6 天前 via iPhone
    lwIP ?
    villivateur
        2
    villivateur  
       6 天前
    找找 Arduino 的 WEB 库吧,多得很
    kydin
        3
    kydin  
    OP
       6 天前 via iPhone
    @villivateur 请问是讲 Arduino 的库放在 Linux 中跑吗
    keep1234
        4
    keep1234  
       6 天前 via Android
    esp8266 AP 配置页面就是 web 页面,可以参考一下
    wyqn
        5
    wyqn  
       6 天前
    boa ,appweb ,goahead 等服务器+cgi
    villivateur
        6
    villivateur  
       6 天前
    @kydin 你是 Linux 的设备? 16MB 我觉得要不还是找个裸机或者 RTOS 开发方案吧,还能省不少空间
    villivateur
        7
    villivateur  
       6 天前
    @villivateur 艹,我眼瞎,刚看到 PetaLinux
    guanzhangzhang
        8
    guanzhangzhang  
       6 天前
    lwIP 很轻量
    emartcn
        9
    emartcn  
       6 天前
    用 golang 的 embed 功能,前后端一体。
    yplam
        10
    yplam  
       6 天前
    golang 然后用 upx 压一下应该可以到 1MB ,还要更小的话就用 Rust ,都支持 embed 前端资源
    Alexsen
        11
    Alexsen  
       6 天前
    lwip 应该能用
    suyuyu
        12
    suyuyu  
       6 天前
    前后端分离 (
    dezou
        13
    dezou  
       6 天前
    Mongoose
    masterclock
        14
    masterclock  
       6 天前
    golang 几乎不可能到 1MB 以下吧?随便引用点库,几乎都到 13M 了,upx 压缩后超 7M
    valord577
        15
    valord577  
       6 天前
    https://docs.gtk.org/gio/class.ThreadedSocketService.html

    这个不知道适不适合你 但是 glib 静态库 + 一个.c main 打包 release + strip 后也有 3.5M

    如果很在意大小的话 建议参考 gio 的代码 手撸一个 tcp server 吧
    valord577
        16
    valord577  
       6 天前
    处理 http request 报文 可以用 nodejs 的库 基于事件处理的

    https://github.com/nodejs/llhttp

    如果是 respone 报文 直接 sprintf 拼一下就行
    masterclock
        17
    masterclock  
       6 天前
    我们的做法是做一个 SPA ,比如用 React ,出来的结果几百 K
    用 c++等做 API ,出来结果也是几百 K
    1zh3n
        18
    1zh3n  
       6 天前
    Rust 也够呛,不上框架也许可以。上个框架随随便便就 10M+ 了
    valord577
        19
    valord577  
       6 天前
    17 楼的办法 也是可行的 前后端分离

    如果页面比较多 需要炫酷的前端特效 **方案比我的靠谱**

    手撸一个 spa 类似 nginx try_files 的 web server 也不是很难 :P
    chenxuuu
        20
    chenxuuu  
       6 天前
    这种简单功能,手写个 http server 得了,本身 http 协议也不复杂
    主要逻辑功能都用前端来轮询,静态网页文件+几个接口完事
    valord577
        21
    valord577  
       6 天前
    http server 也不用手撸 https://www.gnu.org/software/libmicrohttpd/

    [捂脸笑] arm64 static releas+strip 140K
    diivL
        22
    diivL  
       6 天前
    你这点需求,socat + bash 都行.
    话说楼上很多人看个标题就开始乱答了吗? 什么 lwip, Arduino 都出来了.
    elechi
        23
    elechi  
       6 天前
    最简单快速的还是 go
    Mainer
        24
    Mainer  
       6 天前
    我们的做法是, 用 C++写 API, 使用 websocket 协议通信.
    web 静态页面占用几百 K, 输入路由 IP 进入 web 页面后, 通过 websocket 长链接来进行调试.
    leconio
        25
    leconio  
       6 天前   ❤️ 1
    https://github.com/lexbor/lexbor
    前段时间看到了这个,官方宣传是 Fast embeddable web browser engine written in C with no dependencies
    KylinYou
        26
    KylinYou  
       6 天前 via Android
    16MB 限制的话需要考虑 web 代码的压缩
    AFOX
        27
    AFOX  
       6 天前
    cpp-httplib
    bfdh
        28
    bfdh  
       6 天前
    uhttpd + cgi + html + css + jquery ,手撕前端,不要什么框架,jquery 请求 cgi ,前后端分离。
    anytk
        29
    anytk  
       6 天前
    Mongoose +1

    官方有样例 https://mongoose.ws/documentation/tutorials/device-dashboard/

    但是需要注意的是 GPL 授权 或商业购买。
    uIPC
        30
    uIPC  
       6 天前
    你的需求空间足够了,静态打包出来的 web 页面最多几百 k 字节。
    5xX4U5sUwdELgdQ3
        31
    5xX4U5sUwdELgdQ3  
       6 天前
    arduino 之前出过基于 OpenWrt 的开发板, arduino yun 和 linino, 我试玩过, MCU 和 Linux 的通信有点 tricky. 不过似乎停止维护了, 你可以看看能不能得到什么启发.

    https://github.com/arduino/linino
    https://docs.arduino.cc/retired/getting-started-guides/ArduinoYunLin/
    BingoXuan
        32
    BingoXuan  
       6 天前
    PetaLinux 不是给 zynq apsoc 构建 Linux 系统的吗?直接 go 构建后用 upx 压缩,一个 gin 工程还加了 modbus 库才 8M ,加上静态文件估计 10M 绰绰有余
    0xsui
        33
    0xsui  
       6 天前
    很多实现方式,
    1.参考 openwrt ;
    2.参考 padavan ;
    3.参考 ESP8266-RTOS ,https://github.com/fdivitto/ESPWebFramework
    LeeEnzo
        34
    LeeEnzo  
       6 天前
    node.js
    lsk569937453
        35
    lsk569937453  
       6 天前
    刚编译了一个 rust 的 web 项目,target 是 armv7-unknown-linux-gnueabihf ,strip 后的大小 6M 。
    内存紧张的话就把前端编译成静态文件放到固定目录下,后端项目通过路径去访问前端静态文件就行了,golang 、rust 是肯定可以。
    bjfane
        36
    bjfane  
       6 天前
    rust 看可以。编译完很小。且可以有 web 界面。
    azenk
        37
    azenk  
       6 天前 via Android
    直接用 c++的 Web 框架多好,比如 oat++,直接省去了 http server 和 html ,all in one 了。
    wxf666
        38
    wxf666  
       6 天前
    几百 KB 的 BusyBox ,有内嵌一个小型服务器 httpd 呀?

    可以运行 CGI 脚本,或者为 URL 后缀指定解释器(如 php )?

    lkiuyu
        39
    lkiuyu  
       6 天前
    c++有个开源的 cpp-httplib 项目,可以试试
    Jax2000
        40
    Jax2000  
       6 天前
    @LeeEnzo nodejs 的 runtime 16MB 够吗
    sampeng
        41
    sampeng  
       6 天前
    你这个板子是啥啊? smt32 ?还是 arm 的 cpu 。。。目测是后者。好了。现在有 linux 了。10MB 。。可以做很多事了。rust 走起。c/c++不是不可以。。有高级语言干嘛用低级语言。。
    DOLLOR
        42
    DOLLOR  
       6 天前 via Android
    @bfdh jQuery 太臃肿了,换 zepto ,或者干脆用 DOM API 。
    humbass
        43
    humbass  
       6 天前
    比较好奇,10M 左右的内存,够嵌入一个迷你的 web 的引擎(假如有的话)吗?
    yinmin
        44
    yinmin  
       6 天前 via iPhone
    petalinux 的配置菜单里选 busybox 的 httpd ,生成引导镜像。动态页面使用 cgi ( c 程序编写,也可以尝试 sh 程序)
    lovelylain
        45
    lovelylain  
       5 天前 via Android
    @humbass 绰绰有余,你想想以前 tplink 的路由器,经常 4M 8M flash 的,还能嵌那么多功能和页面。
    humbass
        46
    humbass  
       4 天前
    @lovelylain 说的不是一码事,一种是直接在单片机上显示 web ,一种只是提供 web service
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2778 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:36 · PVG 22:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.