你有没有遇到过这样的情况:想给自己的设备加个 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. 简单 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. 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