
嵌入式网络通信物联网【免费下载链接】mongooseEmbedded web server, with TCP/IP network stack, MQTT and Websocket项目地址https://gitcode.com/gh_mirrors/mon/mongoose点击查看免费下载Mongoose 是一款面向嵌入式领域的跨平台网络库只需把mongoose.c与mongoose.h两个文件放进任意 C/C 工程即可获得 HTTP、WebSocket、MQTT、TLS、固件 OTA 更新与设备仪表盘等完整能力。本指南以 README.md 为主线结合 mongoose.h 的公开 API 与 tutorials/ 下的真实示例系统讲解其核心设计、事件驱动编程模型、HTTP 服务、MQTT 客户端以及内置 TCP/IP 协议栈的落地方式帮助你在一小时内写出第一个可运行的嵌入式网络应用。阅读前提本文面向有一定 C 语言基础的嵌入式开发者。文中所有代码片段均以当前仓库 v7.23见 src/version.h为基准。一、Mongoose 是什么两份文件带来的完整网络能力Mongoose 是一个自 2004 年起持续演进的嵌入式网络库定位是嵌入式 Web 服务器 / 嵌入式网络库。它的集成方式极度简单——把mongoose.c和mongoose.h丢进任意 C/C 工程即可编译不需要链接任何外部依赖来实现网络功能。核心特性包括跨平台支持 Linux/UNIX、macOS、Windows、Android以及 STM32、NXP、ESP32、Nordic、TI、Microchip、Infineon、Renesas 等主流芯片平台同一份代码可在不同平台上编译运行内置协议原生支持 TCP/UDP、SNTP、HTTP、MQTT、WebSocket、Modbus-TCP 等异步 DNS 解析器域名解析不阻塞事件循环极小的静态与运行时开销适合资源受限的 MCU源码同时兼容 ISO C 与 ISO C协议栈可选既可使用内置 TCP/IP 协议栈运行于裸机或 RTOS 环境也可运行在 lwIP、Zephyr 等任何支持 BSD socket API 的第三方协议栈之上TLS 能力内置 TLS 1.3 ECC 栈同时支持对接 mbedTLS、OpenSSL 等外部 TLS 库内置固件升级支持 STM32 H5/H7、NXP IMXRT、RP2040/2350、ESP32 等平台的 OTA 更新。在仓库中mongoose.c根目录与 src/ 目录下的源码一一对应通过打包脚本见 test/pack.js合并成发布形态mongoose.h则是全部公开 API 的唯一权威声明。版本号统一维护在 src/version.h 与 mongoose.h 中。二、支持平台与协议栈矩阵Mongoose 对平台的支持分为两条路线路线一运行在任何支持 BSD socket API 的 TCP/IP 栈之上TCP/IP 栈说明lwIP所有运行 lwIP 的设备如 ESP32、ESP32S3、ESP32C3、ESP32C6 等ZephyrZephyr 支持的全部设备Other任何支持 BSD socket API 的协议栈如 Amazon FreeRTOS-TCPLinux / Mac / Windows工作站、服务器、单板计算机、运行在 MPU 或 FPGA 上的嵌入式 Linux 设备路线二使用 Mongoose 自带的内置 TCP/IP 协议栈免去额外网络软件同时支持裸机与 RTOS 环境硬件说明STM32所有带内置以太网的 STM32STM32Fxx、STM32H5xx、STM32H7xxNXP所有带内置以太网的 NXP MCUIMXRT102x/104x/105x/106x/117x、RW612、MCXN94xMicrochip带内置以太网的 ATSAME54Renesas带内置以太网的 RA5M、RA6M、RA8MInfineon带内置以太网的 XMC4、XMC7Texas Instruments带内置以太网的 TM4C、TMS570Cypress WiFi使用 CY43xx WiFi 芯片的任意 MCU如 RP2040 Pico-W、RP2350 Pico2-W、Arduino PortentaWiznet Ethernet使用 Wiznet W5500 / W5100 MACPHY 芯片的任意 MCUCellularNRF9160、SIM800从源码结构看内置协议栈按驱动拆分在 src/drivers/ 目录如stm32f.c、imxrt.c、same54.c、w5500.c、cyw.c等通过编译期宏如MG_ENABLE_TCPIP、MG_ENABLE_DRIVER_STM32H选择第三方协议栈则通过 src/net_lwip.h、src/net_rl.h 等适配层接入。三、事件驱动核心理解 mg_mgr 与 mg_connectionMongoose 的全部编程模型建立在两个核心概念之上事件管理器struct mg_mgrmongoose.h持有所有打开的连接链表、DNS 配置默认 IPv4 DNS 为8.8.8.8:53IPv6 为[2001:4860:4860::8888]:53、DNS 超时默认 3000ms、共享 TLS 上下文、定时器链表、内置协议栈的网络接口指针等连接struct mg_connectionmongoose.h一个连接对应一个事件处理器fn与用户参数fn_data内部携带收发缓冲recv/send、本地/远端地址、以及一组位标志is_listening、is_client、is_tls、is_websocket、is_udp、is_draining、is_closing等描述连接状态。典型生命周期如下struct mg_mgr mgr; // 声明事件管理器 mg_mgr_init(mgr); // 初始化设置 DNS、epoll/SIGPIPE、TLS 上下文等默认值 // ...创建监听、连接或定时器... for (;;) mg_mgr_poll(mgr, 1000); // 无限事件循环mg_mgr_init()mongoose.h初始化后即可创建连接与定时器若启用了内置协议栈MG_ENABLE_TCPIP1且选中了某个内置驱动它还会自动调用mg_tcpip_init()mg_mgr_poll(mgr, ms)mongoose.h每次调用最多等待ms毫秒处理 I/O 事件为就绪连接派发事件、触发到期的定时器ms0表示立即返回需要从主循环或专用网络任务中反复调用mg_mgr_free()关闭全部连接、释放定时器与 TLS 上下文可安全用于部分初始化的 mgr。用户只需编写一个形如void fn(struct mg_connection *c, int ev, void *ev_data)的事件处理函数根据ev事件类型分发处理逻辑。这也解释了为什么 README 中的示例代码如此简洁——协议状态机全部封装在库内部应用层只关心发生了什么事件。四、HTTP 服务器实战静态文件服务与 REST API4.1 三分钟搭建静态文件服务器README 给出的第一个示例展示了双文件 一个事件回调 可用 Web 服务器的全部过程#include mongoose.h // To build, run: cc main.c mongoose.c // HTTP server event handler function void ev_handler(struct mg_connection *c, int ev, void *ev_data) { if (ev MG_EV_HTTP_MSG) { struct mg_http_message *hm (struct mg_http_message *) ev_data; struct mg_http_serve_opts opts { .root_dir ./web_root/ }; mg_http_serve_dir(c, hm, opts); } } int main(void) { struct mg_mgr mgr; // Declare event manager mg_mgr_init(mgr); // Initialise event manager mg_http_listen(mgr, http://0.0.0.0:8000, ev_handler, NULL); // Setup listener for (;;) { // Run an infinite event loop mg_mgr_poll(mgr, 1000); } return 0; }编译运行只需一条命令cc main.c mongoose.c。关键点逐一拆解MG_EV_HTTP_MSG完整 HTTP 请求含请求行、头部与 body接收完毕时触发ev_data为struct mg_http_message *mongoose.h其中method、uri、query、proto、headers[]、body等字段均为指向接收缓冲的零拷贝切片mg_http_listen(mgr, http://0.0.0.0:8000, fn, NULL)mongoose.h在指定 URL 上创建 HTTP 监听连接URL 中的协议前缀http://或https://决定是否启用 TLSmg_http_serve_dir(c, hm, opts)mongoose.h将请求 URI 映射到root_dir下提供静态文件服务。目录列表功能取决于编译宏MG_ENABLE_DIRLIST在 mongoose.h 等多个架构分支中可见默认取值。struct mg_http_serve_optsmongoose.h的可配置项非常丰富完整的静态服务配置可以写成struct mg_http_serve_opts opts { .root_dir ./web_root/, // 静态文件根目录 .ssi_pattern #.html, // 服务端包含SSI文件模式NULL 禁用 .extra_headers X-Frame-Options: DENY\r\n, // 追加响应头 .mime_types binapplication/octet-stream, // 追加 MIME 映射 .page404 /404.html, // 自定义 404 页面 .fs mg_fs_posix, // 文件系统抽象NULL 默认 POSIX };4.2 用 REST API 返回 JSON 数据README 第二个示例演示了如何用mg_match()做 URI 路由、用mg_http_reply()输出 JSONstatic void ev_handler(struct mg_connection *c, int ev, void *ev_data) { if (ev MG_EV_HTTP_MSG) { struct mg_http_message *hm (struct mg_http_message *) ev_data; if (mg_match(hm-uri, mg_str(/api/time/get), NULL)) { mg_http_reply(c, 200, , {%m:%lu}\n, MG_ESC(time), time(NULL)); } else { mg_http_reply(c, 500, , {%m:%m}\n, MG_ESC(error), MG_ESC(Unsupported URI)); } } }mg_match()支持通配符 URI 匹配返回true/falsemg_http_reply(c, 200, , fmt, ...)mongoose.h发送带Content-Length的完整 HTTP 响应headers参数必须以\r\n结尾传表示不附加头body 使用 printf 风格格式化%M/%m调用自定义打印器MG_ESC(str)mongoose.h是 JSON 字符串转义打印器配合%m使用可安全输出字符串到 JSON 中避免注入与转义错误。这个模式正是仓库中 REST 类教程的通用骨架例如 tutorials/http/http-restful-server/main.c 与 tutorials/http/device-dashboard/main.c 都采用事件回调 URI 匹配 mg_http_reply的组织方式。4.3 更完整的服务器形态TLS 与文件上传仓库中 tutorials/http/http-server/main.c 是一个可实际编译运行的完整参考它展示了 README 示例之外的进阶用法在MG_EV_ACCEPT事件中对 TLS 连接调用mg_tls_init()注入证书与私钥实现 HTTPS用mg_match(hm-uri, mg_str(/upload), NULL)路由文件上传请求配合mg_http_next_multipart()逐段解析multipart/form-databody实现 HTTP 文件上传通过命令行参数控制根目录、监听地址、SSI 模式、hexdump 日志等运行参数。五、MQTT 客户端实战订阅、发布与自动重连README 第三个示例是一个完整的 MQTT 客户端连接公共 Brokerbroker.hivemq.com:1883订阅主题device1/rx并把收到的每条消息原样转发到device1/tx#include mongoose.h static const char *s_mqtt_url mqtt://broker.hivemq.com:1883; static struct mg_connection *s_mqtt_conn NULL; // MQTT connection event handler function static void ev_handler(struct mg_connection *c, int ev, void *ev_data) { if (ev MG_EV_OPEN) { MG_INFO((%lu created, connecting to %s ..., c-id, s_mqtt_url)); } else if (ev MG_EV_MQTT_OPEN) { struct mg_mqtt_opts opts {.qos 1, .topic mg_str(device1/rx)}; mg_mqtt_sub(c, opts); MG_INFO((%lu connected, subscribing to %s, c-id, opts.topic.buf)); } else if (ev MG_EV_MQTT_MSG) { char response[100]; struct mg_mqtt_message *mm (struct mg_mqtt_message *) ev_data; struct mg_mqtt_opts opts {.qos 1, .topic mg_str(device1/tx)}; mg_snprintf(response, sizeof(response), Received [%.*s] / [%.*s], mm-topic.len, mm-topic.buf, mm-data.len, mm-data.buf); opts.message mg_str(response); mg_mqtt_pub(c, opts); } else if (ev MG_EV_CLOSE) { MG_INFO((%u closing, c-id)); s_mqtt_conn NULL; } } // Reconnection timer function. If we get disconnected, reconnect again static void timer_fn(void *arg) { struct mg_mgr *mgr (struct mg_mgr *) arg; if (s_mqtt_conn NULL) { struct mg_mqtt_opts opts {.clean true}; s_mqtt_conn mg_mqtt_connect(mgr, s_mqtt_url, opts, ev_handler, NULL); } } int main() { struct mg_mgr mgr; // Mongoose event manager. Holds all connections mg_mgr_init(mgr); // Initialise event manager mg_timer_add(mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, mgr); for (;;) { mg_mgr_poll(mgr, 1000); // Infinite event loop } return 0; }这段代码可以拆成三层理解1. MQTT 事件流。连接建立MG_EV_OPEN→ 收到 CONNACKMG_EV_MQTT_OPEN→ 收到 PUBLISH 报文MG_EV_MQTT_MSGev_data为struct mg_mqtt_message *→ 连接关闭MG_EV_CLOSE。struct mg_mqtt_messagemongoose.h中的topic、data是指向接收缓冲的零拷贝切片只在下次mg_mgr_poll()前有效因此示例中立即用mg_snprintf拷贝到本地response数组再发布这是正确的做法。2. MQTT API 语义mongoose.hmg_mqtt_connect(mgr, url, opts, fn, NULL)打开客户端连接并发送 CONNECT 报文opts传NULL时使用 MQTT 3.1.1 默认值自动生成 client ID、无认证mg_mqtt_sub(c, opts)发送 SUBSCRIBE 报文应在MG_EV_MQTT_OPEN且 CONNACK 成功后调用mg_mqtt_pub(c, opts)发送 PUBLISH 报文对 QoS 0 返回 0对 QoS 1/2 返回分配的报文 ID重传时可用opts.retransmit_id指定上次返回的 ID。struct mg_mqtt_opts的核心字段mongoose.h包括versionMQTT 版本4 对应 3.1.15 对应 MQTT 50 表示默认 4、keepalive保活间隔秒数0 表示不超时、qos、retain保留标志、clean是否干净会话、client_id、user/pass认证等。MQTT 5 还支持通过props/num_props携带属性数组。3. 自动重连设计。mg_timer_add(mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, mgr)mongoose.h注册一个每 3000ms 触发一次的定时器MG_TIMER_REPEAT表示周期执行MG_TIMER_RUN_NOWmongoose.h表示注册后立即执行一次。回调中检查全局连接指针为NULL即已断开就重新mg_mqtt_connect()从而形成断线自动重连 周期保活的健壮客户端。更完整的 MQTT 实战可参考 tutorials/mqtt/mqtt-client/main.c含MG_EV_MQTT_CMD处理、mg_mqtt_ping()保活等以及 tutorials/mqtt/mqtt-client-aws-iot/main.cTLS AWS IoT 认证与 tutorials/mqtt/ota-over-mqtt/main.c基于 MQTT 的 OTA 固件升级。六、MQTT 服务器、WebSocket 与其他内置协议Mongoose 不止能做客户端。mg_mqtt_listen()mongoose.h可以直接创建 MQTT 服务器监听连接每个完整 MQTT 报文都会以MG_EV_MQTT_CMD事件ev_data为struct mg_mqtt_message *投递给应用层——tutorials/mqtt/mqtt-server/main.c 就是基于这一 API 的完整 Broker 实现配套的 test/mosquitto.conf 提供了与标准 mosquitto 对测的配置。同样地WebSocket 服务端/客户端、UDP 的 SNTP/mDNS/DNS 客户端、Modbus-TCP 等协议均以相似的事件驱动方式暴露 API仓库中分别有对应教程tutorials/websocket/websocket-server/main.c 与 tutorials/websocket/websocket-client/main.ctutorials/udp/sntp-time-sync/main.c、tutorials/udp/mdns-server/main.c、tutorials/udp/captive-dns-server/main.ctutorials/tcp/modbus-dashboard/ 等。从源码结构看src/mqtt.c、src/ws.c、src/sntp.c、src/modbus.c、src/dns.c 分别承载对应协议实现应用层的通用收发与事件分发统一由 src/net.c 完成——这也是协议栈可选设计得以成立的基础。七、内置 TCP/IP 协议栈与裸机/RTOS 部署当目标 MCU 没有现成协议栈或希望摆脱外部依赖时可以启用 Mongoose 自带的 TCP/IP 协议栈编译宏MG_ENABLE_TCPIP1它支持裸机与 RTOS 两种运行环境。驱动层位于 src/drivers/每个驱动一个源文件如 STM32 以太网stm32f.c、stm32h.c、NXPimxrt.c、rw612.c、netc.c、Microchipsame54.c、Renesasra.c、TItm4c.c、tms570.c、Infineonxmc.c、xmc7.c、Wiznetw5500.c、w5100.c、Cypress WiFicyw.c、蜂窝模组at_cmd.c等网络接口抽象struct mg_tcpip_if挂在mg_mgr.ifp上mongoose.h连接级额外内存由extraconnsize控制当启用了内置协议栈并选中唯一驱动时mg_mgr_init()会自动完成mg_tcpip_init()若使用多网口或希望手动控制初始化时机则需显式调用mg_tcpip_init()。仓库中对应了大量板级最小示例例如 tutorials/stm32/nucleo-f746zg/minimal/main.c、tutorials/renesas/ek-ra6m4-make-baremetal-builtin/main.c、tutorials/rp/pico-w/main.c、tutorials/wch/ch32v307-make-baremetal-builtin/ 等它们展示了内置驱动 mg_mgr_init HTTP/MQTT 应用在真实开发板上的完整落地路径。八、安全、测试与质量保障机制README 的 Security 章节详细说明了项目对安全性的投入这些机制在仓库中都有直接对应物持续集成 单元测试每次提交都会在 test/ 目录下运行数百个单元测试入口为 test/unit_test.c配套 Makefile 见 test/Makefile并采用 AddressSanitizer 等现代内存检测技术尽早发现漏洞test/mongoose.c 与 test/mongoose.h 是测试用的打包版本Google oss-fuzz 持续模糊测试仓库根目录的 test/fuzz.c 与 test/fuzz_tls.c 是 fuzz 入口独立安全团队漏洞报告流程包括 Cisco Talos、Microsoft Security Response Center、MITRE、Compass Security 等机构会定期提交漏洞报告发现问题时按行业最佳实践处理——先保密修复再通知有订阅的商业客户客户独立安全审计如 NASA 等客户有专项安全要求会独立执行安全审计。漏洞报告入口为github.com/cesanta/mongoose/security/advisoriesREADME 明确提示不要创建 GitHub issue 报告安全漏洞。九、商业授权与生态Mongoose 采用双许可模式GPL v2开源或商业许可见 LICENSE 与 mongoose.h 的SPDX-License-Identifier: GPL-2.0-only or commercial。README 提及它被西门子、施耐德电气、博通、博世、Google、三星、高通、卡特彼勒等数百家企业用于工业自动化、半导体、遥测数据交换、产品远程控制、远程软件更新与远程监控等场景并已部署到全球数亿台设备。说明上述企业名单、部署规模等商业信息均来自 README 原文本仓库不包含可独立验证的第三方数据引用时请以官方渠道信息为准。此外 README 的 Articles 章节整理了一系列深入的技术文章嵌入式 Web 服务器、STM32/ESP32 设备仪表盘、WebSocket、OTA、lwIP 集成等对应的可运行代码大多可以在本仓库的 tutorials/ 目录中找到是继续深入学习的首选路径。十、快速上手清单把根目录的 mongoose.c 与 mongoose.h 加入工程桌面开发直接cc main.c mongoose.c按目标平台选择协议栈路线桌面/已有 lwIP → 直接用 BSD socket 适配层裸机 MCU → 启用MG_ENABLE_TCPIP并选择对应 src/drivers/ 驱动编写事件处理函数处理MG_EV_HTTP_MSG、MG_EV_MQTT_OPEN、MG_EV_MQTT_MSG等事件用mg_mgr_init() 监听/连接 API mg_mgr_poll()搭起事件循环需要定时任务时用mg_timer_add()需要 TLS 时在MG_EV_ACCEPT/连接建立后用mg_tls_init()注入证书参考 tutorials/ 下与硬件匹配的示例如 tutorials/http/http-server/、tutorials/mqtt/mqtt-client/做裁剪移植。至此你已经掌握了 Mongoose 从双文件集成到事件驱动 HTTP/MQTT 应用再到内置协议栈裸机部署的完整路径。下一步可以直接在 tutorials/ 中选择与手头开发板最接近的示例跑通第一个嵌入式网络应用。赞分享嵌入式网络通信物联网【免费下载链接】mongooseEmbedded web server, with TCP/IP network stack, MQTT and Websocket项目地址https://gitcode.com/gh_mirrors/mon/mongoose点击查看免费下载相关推荐Mongoose 嵌入式网络库完整集成指南从双文件内核到 Web 设备仪表盘与固件 OTAMongoose 嵌入式网络库完整集成指南从双文件内核到 Web 设备仪表盘与固件 OTA Mongoose 是一个开源的双文件 C 网络库与嵌入式 Web嵌入式网络通信物联网RP2040/RP2350 RM2 WiFi 模块跑通 Mongoose 内置 TCP/IP 协议栈从 PIO SPI 驱动到 HTTP 服务器实战RP2040/RP2350 RM2 WiFi 模块跑通 Mongoose 内置 TCP/IP 协议栈从 PIO SPI 驱动到 HTTP 服务器实战 本指嵌入式网络通信物联网如何快速掌握Zotero Style插件面向研究者的完整效率指南如何快速掌握Zotero Style插件面向研究者的完整效率指南 Zotero Style是一款功能强大的Zotero文献管理插件通过创新的阅读进度追踪、智桌面应用知识管理科研创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考