C++ 怎么编写嵌入式 Web 服务器支持通过浏览器网页配置设备参数

夏枫酱_7516

夏枫酱_7516

2026-10-24

707人浏览

原创

mongoose最合适——单文件、无依赖、支持静态网页与post表单、内存占用低于100kb,仅需基础posix接口,适配freertos等嵌入式环境。

c++ 怎么编写嵌入式 web 服务器支持通过浏览器网页配置设备参数

用什么轻量级库最合适?选 mongoose 而不是 libmicrohttpd 或 cpp-httplib

嵌入式设备资源紧张,C++ Web 服务器必须满足:单文件、无依赖、支持静态网页、能处理 POST 表单、内存占用低于 100KB。mongoose 是唯一满足全部条件的成熟选择——它把整个 HTTP/HTTPS/WS 实现压缩在 mongoose.h + mongoose.c 两个文件里,编译后代码段不到 60KB(ARM Cortex-M4 + FreeRTOS 下实测),且原生支持 URL 路由、表单解析、静态文件服务。

libmicrohttpd 依赖 GNU TLS 和 libgcrypt,交叉编译链容易断裂;cpp-httplib 是纯头文件但基于 C++11 线程和 STL 容器,在裸机或 RTOS 上无法直接用;而 mongoose 只需 read/write/select 等基础 POSIX 接口,FreeRTOS、Zephyr、ThreadX 甚至裸机加 lwIP 都能适配。

  • 别碰 mongoose 的 HTTPS 模块——除非你有硬件加密加速器,否则 AES/SHA 在 Cortex-M3 上会卡死连接
  • 默认关闭 WebSocket 支持(注释掉 #define MG_ENABLE_WS),省下约 8KB 代码空间
  • 静态网页建议放 SPI Flash 或 QSPI NOR 中,用 mg_http_serve_file() 直接 mmap 映射,避免 RAM 加载整页 HTML

怎么解析浏览器发来的配置参数?用 mg_http_get_var() 而不是手写 strstr 解析

浏览器提交表单时,数据是 application/x-www-form-urlencoded 格式(如 temp_set=25&fan_mode=auto),手动用 strstr 拆解极易漏掉 URL 编码字符(空格变 +、中文变 %E4%BD%A0)。mongoose 提供 mg_http_get_var() 直接解码并提取值,安全可靠。

关键点:该函数只对当前请求的 body 生效,所以必须在 MG_EV_HTTP_MSG 事件里调用,且要先确认 hm->body.len > 0(GET 请求无 body,参数在 URL query 里,得用 mg_url_decode() 先拆)。

page-agent 浏览器控制(CDP)
page-agent 浏览器控制(CDP)

使用 page-agent CLI(CDP)控制浏览器;CLI只能通过 GitHub Release 的 .tgz 安装,npm 官方包暂未发布。

下载
  • POST 表单:检查 hm->method == MG_HTTP_METHOD_POST,再用 mg_http_get_var(&hm->body, "temp_set", buf, sizeof(buf))
  • GET 参数:先用 mg_url_decode(hm->uri.ptr, hm->uri.len, uri_decoded, sizeof(uri_decoded), 0),再传给 mg_http_get_var()
  • 数值校验必须自己做——mg_http_get_var() 返回的是字符串,atoi() 前要判断是否为空或含非法字符

怎么让网页实时显示设备状态?用 Server-Sent Events (SSE) 而不是轮询或 WebSocket

浏览器需要每秒刷新温度、电压等状态,但 WebSocket 在嵌入式端开销大(每个连接占 2KB+ RAM),HTTP 轮询又浪费带宽。SSE 是单向流式协议:浏览器用 EventSource 连接一个固定 URL(如 /status),服务器持续推送 data: {"vcc":3.28,"temp":24.7}\n\n,天然适合嵌入式只发不收的场景。

mongoose 本身不内置 SSE 封装,但只需三步:设置响应头(mg_printf(c, "HTTP/1.1 200 OK\r\nContent-Type: text/event-stream\r\nCache-Control: no-cache\r\nConnection: keep-alive\r\n\r\n"))、<strong>循环发送 data 行</strong>(注意结尾两个换行符)、<strong>每次发送后调用 <code>mg_sock_send() 强制刷出缓冲区(否则数据卡在 TCP 发送队列里)。

  • SSE 连接默认 30 秒超时,浏览器会自动重连,无需客户端写重连逻辑
  • 避免在 SSE 处理中调用阻塞操作(如 I2C 读传感器)——用定时器触发状态采集,SSE 回调只负责发缓存值
  • 每个 SSE 连接独占一个 socket,连接数超过 5 个时,务必检查 MG_CFG_MAX_OPEN_SOCKS 是否足够(默认 10,可改)

为什么网页总打不开或参数不生效?重点查这三处

实际调试中最常卡在这三个地方,和代码逻辑无关,纯属环境或配置疏漏:

  • 网页 JS 里访问 /api/config 时被浏览器同源策略拦截——确保服务器返回的 Access-Control-Allow-Origin: * 响应头(用 mg_printf(c, "Access-Control-Allow-Origin: *\r\n"))
  • 设备 IP 改变后浏览器仍缓存旧 DNS 或 HSTS 记录——强制用 http://192.168.1.100(而非 http://device.local)测试,禁用浏览器预加载(Chrome 地址栏输 chrome://net-internals/#hsts 删除)
  • 修改参数后设备未保存到 Flash——mg_http_get_var() 拿到值只是第一步,后续必须调用你的 Flash 写函数(如 flash_write_page()),且要等写完成中断后再返回 HTTP 响应,否则浏览器收到 200 但实际没存上

最易被忽略的是:所有 HTTP 响应体末尾必须有 \r\n\r\n(空行),少一个 \r 就会导致浏览器一直转圈等待响应结束——这是纯文本协议的硬性要求,不是风格问题。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程