嵌入式网络库:Mongoose

发布于 2023-07-05  558 次阅读


Mongoose 是一个非常小巧易用的网络库。

它为 TCP、UDP、HTTP、WebSocket、MQTT 实现了基于事件驱动的非阻塞 API,非常适合在嵌入式系统上使用。

官网链接

https://mongoose.ws/

Github 链接

https://github.com/cesanta/mongoose

1、小巧易用,全部代码就一个 mongoose.c 和一个 mongoose.h 文件。

2、依赖少,就是纯粹的 Socket 编程,没有引用任何第三方库。

3、稳定可靠,Github 上有 8.1K 的 Star,且大量知名企业都基于 Mongoose 推出了商业产品。

4、丰富的文档和示例。

Mongoose 怎么用?

Mongoose 解决了广泛的业务需求,如在设备上实现 Web UI 界面、RESTful API 服务、遥测数据交换、产品远程控制、远程软件更新、远程监控等。

下面是官方提供的示例

示例1:实现 HTTP server

// main.c 
#include "mongoose.h"

static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
  // Serve local dir
  struct mg_http_serve_opts opts = {.root_dir = "."};
  if (ev == MG_EV_HTTP_MSG) mg_http_serve_dir(c, ev_data, &opts);
}

int main(int argc, char *argv[]) {
  struct mg_mgr mgr;
  mg_mgr_init(&mgr);
  // Setup listener
  mg_http_listen(&mgr, "http://localhost:8000", fn, &mgr);
  // Event loop
  for (;;) mg_mgr_poll(&mgr, 1000);
  mg_mgr_free(&mgr);
  return 0;
}

将上面的 main.c 和 mongoose.c 一起编译,就可以得到一个最简单的 HTTP server了,它会列举 server 当前所在目录下的文件列表。

对于源码,mg_http_listen() 负责建立 http server,然后 mg_mgr_poll() 负责等待事件的发生。

示例2:swupdate

swupdate 是一个关于 嵌入式 Linux OTA 的开源项目。它集成了 Mongoose, 以实现通过 web 来上传更新包的功能。

具体的代码实现请自行阅读:

https://github.com/sbabic/swupdate/blob/master/mongoose/mongoose_interface.c


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。