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

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

  •  
  •   kydin ·
    HiKydin · 136 天前 via iPhone · 5283 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:
    需要提供一个 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  
       136 天前 via iPhone
    lwIP ?
    villivateur
        2
    villivateur  
       136 天前
    找找 Arduino 的 WEB 库吧,多得很
    kydin
        3
    kydin  
    OP
       136 天前 via iPhone
    @villivateur 请问是讲 Arduino 的库放在 Linux 中跑吗
    keep1234
        4
    keep1234  
       136 天前 via Android
    esp8266 AP 配置页面就是 web 页面,可以参考一下
    wyqn
        5
    wyqn  
       136 天前
    boa ,appweb ,goahead 等服务器+cgi
    villivateur
        6
    villivateur  
       136 天前
    @kydin 你是 Linux 的设备? 16MB 我觉得要不还是找个裸机或者 RTOS 开发方案吧,还能省不少空间
    villivateur
        7
    villivateur  
       136 天前
    @villivateur 艹,我眼瞎,刚看到 PetaLinux
    guanzhangzhang
        8
    guanzhangzhang  
       136 天前
    lwIP 很轻量
    emartcn
        9
    emartcn  
       136 天前
    用 golang 的 embed 功能,前后端一体。
    yplam
        10
    yplam  
       136 天前
    golang 然后用 upx 压一下应该可以到 1MB ,还要更小的话就用 Rust ,都支持 embed 前端资源
    Alexsen
        11
    Alexsen  
       136 天前
    lwip 应该能用
    suyuyu
        12
    suyuyu  
       136 天前
    前后端分离 (
    dezou
        13
    dezou  
       136 天前
    Mongoose
    masterclock
        14
    masterclock  
       136 天前
    golang 几乎不可能到 1MB 以下吧?随便引用点库,几乎都到 13M 了,upx 压缩后超 7M
    valord577
        15
    valord577  
       136 天前
    https://docs.gtk.org/gio/class.ThreadedSocketService.html

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

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

    https://github.com/nodejs/llhttp

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

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

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

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

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

    但是需要注意的是 GPL 授权 或商业购买。
    uIPC
        30
    uIPC  
       136 天前
    你的需求空间足够了,静态打包出来的 web 页面最多几百 k 字节。
    5xX4U5sUwdELgdQ3
        31
    5xX4U5sUwdELgdQ3  
       136 天前
    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  
       136 天前
    PetaLinux 不是给 zynq apsoc 构建 Linux 系统的吗?直接 go 构建后用 upx 压缩,一个 gin 工程还加了 modbus 库才 8M ,加上静态文件估计 10M 绰绰有余
    0xsui
        33
    0xsui  
       136 天前
    很多实现方式,
    1.参考 openwrt ;
    2.参考 padavan ;
    3.参考 ESP8266-RTOS ,https://github.com/fdivitto/ESPWebFramework
    LeeEnzo
        34
    LeeEnzo  
       136 天前
    node.js
    lsk569937453
        35
    lsk569937453  
       136 天前
    刚编译了一个 rust 的 web 项目,target 是 armv7-unknown-linux-gnueabihf ,strip 后的大小 6M 。
    内存紧张的话就把前端编译成静态文件放到固定目录下,后端项目通过路径去访问前端静态文件就行了,golang 、rust 是肯定可以。
    bjfane
        36
    bjfane  
       136 天前
    rust 看可以。编译完很小。且可以有 web 界面。
    azenk
        37
    azenk  
       136 天前 via Android
    直接用 c++的 Web 框架多好,比如 oat++,直接省去了 http server 和 html ,all in one 了。
    wxf666
        38
    wxf666  
       136 天前
    几百 KB 的 BusyBox ,有内嵌一个小型服务器 httpd 呀?

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

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