Mongoose:嵌入式网络神器,让设备互联秒变“网红”

你有没有遇到过这样的情况:想给自己的设备加个 Web 界面、搞个 MQTT 通信、或者简单地推个 RESTful API,结果网络库各种坑、平台各种兼容性问题让人头大……别着急,今天咱聊聊一个逆天的 C/C++ 网络库——Mongoose,瞬间搞定各种协议,甚至跑在国际空间站上!

Mongoose 是什么
Mongoose 是一款从 2004 年就开始开源的 C/C++ 网络库,专门用来“让设备上网”——提供事件驱动、非阻塞的 TCP、UDP、HTTP、WebSocket、MQTT 等协议 API。它体积小、性能高、易移植,简单到只要把 mongoose.c 和 mongoose.h 拷过去就能用。

它解决了哪些痛点

  • • 依赖地狱:不靠外部库,一套源码搞定所有平台。

  • • 平台分裂:Linux、Windows、嵌入式 MCU……一次开发,多处跑。

  • • 协议繁琐:TCP、HTTP、MQTT……内置好了,接口统一上手快。

  • • 资源受限:占用少,静态/运行时 footprint 都很小,嵌入式友好。

核心特性速览

特性

说明

跨平台

Linux/Mac/Windows/Android/STM32/ESP32/NXP…

协议支持

TCP/UDP/SNTP/HTTP/WebSocket/MQTT/TLS…

异步 DNS

内置非阻塞 DNS 解析

轻量级

源码只有两个文件,无额外依赖

内置 TCP/IP 栈

支持 bare-metal 或 RTOS,多种 MCU 驱动

外部 TLS 支持

mbedTLS/OpenSSL,也可用自带 TLS 1.3 ECC 栈

平台支持一览

类型

举例

操作系统

Linux、MacOS、Windows、Android

第三方 TCP/IP 栈

lwIP(ESP32)、Zephyr、FreeRTOS-TCP

内置 TCP/IP 驱动(RTL)

STM32Fxx/H7、NXP i.MX RT、Wiznet W5500

代码实例
下面给你两个超简单示例,感受一下 Mongoose 的魔力。

  1. 1. 简单 HTTP 文件服务器

#include "mongoose.h"
// 事件回调:收到 HTTP 请求时,返回目录内容
void ev_handler(struct mg_connection *c, int ev, void *ev_data){
   if(ev == MG_EV_HTTP_MSG){
     mg_http_serve_dir(c,(struct mg_http_message *)ev_data,
                  &(struct mg_http_serve_opts){.root_dir ="./web_root/"});
   }
}
int main() {
  struct mg_mgr mgr;
  mg_mgr_init(&mgr);
  mg_http_listen(&mgr,"http://0.0.0.0:8000", ev_handler,NULL);
  for(;;) mg_mgr_poll(&mgr,1000);
  return 0;
}
  1. 1. MQTT 客户端:订阅 device1/rx,收到后原样发布到 device1/tx

#include "mongoose.h"
staticconstchar*url ="mqtt://broker.hivemq.com:1883";
staticstruct mg_connection *conn;
// 事件回调
stati void ev_handler(struct mg_connection *c, int ev, void *ev_data){
  if (ev == MG_EV_MQTT_OPEN) {
    mg_mqtt_sub(c,&(struct mg_mqtt_opts){.qos =1,.topic = mg_str("device1/rx")});
  } else if(ev == MG_EV_MQTT_MSG){
  struct mg_mqtt_message *msg = ev_data;
  mg_mqtt_pub(c,&(struct mg_mqtt_opts){
     .qos =1,
     .topic = mg_str("device1/tx"),
     .message = mg_str_n(msg->data.ptr, msg->data.len)
  });
 }
}
int main(){
  struct mg_mgr mgr;
  mg_mgr_init(&mgr);
  mg_mqtt_connect(&mgr, url,&(struct mg_mqtt_opts){.clean =true}, ev_handler,NULL);
  for(;;) mg_mgr_poll(&mgr,1000);
  return 0;
}

优缺点分析

优点

缺点

一套代码,多平台跑,无需额外依赖

对新手来说,事件驱动模型需要适应

协议丰富(HTTP、MQTT、WebSocket、TLS 等)

文档略多,需要花时间熟悉

轻量、文件少,嵌入式设备也能轻松部署

免费版商用许可有一定限制

社区活跃,商用案例丰富(国际空间站、Fortune500…)

部分特定 MCU 驱动需额外配置

总结
总的来说,Mongoose 就像一个网络瑞士军刀,让你在嵌入式和桌面环境都能“照猫画虎”式地实现各种联网需求。不管是想做个设备 Web UI,还是搞个远程控制、OTA 升级、数据上云,它都能帮你省掉大把踩坑时间。如果你正好要做网络相关的 C/C++ 项目,强烈建议试一试!

项目地址:https/github.com/cesanta/mongoose

发表评论