Skip to content

yuanxiaoming8899/mongoose-cn

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mongoose - 嵌入式 Web 服务器/嵌入式网络库

许可证:GPLv2/商业 构建状态 代码覆盖率 模糊测试状态

Mongoose 是一个 C/C++ 网络库。它为 TCP、UDP、HTTP、WebSocket、MQTT 实现事件驱动的非阻塞 API。它专为连接设备并使它们上线而设计。自 2004 年上市以来,被大量开源和商业产品使用 - 它甚至在国际空间站上运行!Mongoose 使嵌入式网络编程变得快速、健壮且简单。特点包括:

  • 跨平台:
    • 适用于 Linux/UNIX、MacOS、Windows、Android
    • 适用于 STM32、NXP、ESP32、NRF52、TI、Microchip 等
    • 编写一次代码 - 它在任何地方都可以工作
    • 非常适合统一整个公司的网络基础设施代码
  • 内置协议:普通 TCP/UDP、SNTP、HTTP、MQTT、Websocket
  • 对 mbedTLS 和 OpenSSL 的 SSL/TLS 支持
  • 异步 DNS 解析器
  • 静态和运行时占用空间极小
  • 源代码符合 ISO C 和 ISO C++ 标准
  • 非常容易集成:只需将文件复制mongoose.cmongoose.h源代码树中即可。查看 具体步骤
  • 可在任何具有套接字 API 的环境中工作,例如 LwIP、Zephyr、Azure
  • 内置 TCP/IP 堆栈,带有适用于裸机或 RTOS 系统的驱动程序
    • 可用驱动程序:STM32F、STM32H;恩智浦 RT1xxx;德州仪器TM4C;微芯片 SAME54;维智网W5500
    • 裸机 Nucleo-F429ZI上的完整 Web 设备仪表板只有 6 个文件
    • 作为比较,CubeIDE 生成的 HTTP 示例有 400 多个文件
  • 内置 TLS 1.3 服务器端支持
  • 不依赖任何其他软件来实现联网
  • STM32H5、STM32H7 等即将推出的内置固件更新
  • 详细的用户指南、API 参考和大量教程

用法

创建一个提供目录服务的简单 Web 服务器。HTTP 服务器的行为由其事件处理函数指定:

#include "mongoose.h"

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", fn, NULL); // Setup listener for (;;) { mg_mgr_poll(&mgr, 1000); // Run an infinite event loop } return 0; }

// HTTP server event handler function void fn(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); } }

  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>

HTTP 服务器实现了返回当前时间的 REST API。JSON 格式:

static void fn(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_http_match_uri(hm, "/api/time/get")) {
      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")); 
    }
  }
}

订阅主题aa/bb并打印所有传入消息的 MQTT 客户端:

static void fn(struct mg_connection *c, int ev, void *ev_data) {
  if (ev == MG_EV_MQTT_OPEN) {
    struct mg_mqtt_opts opts = {.qos = 1, .topic = mg_str("aa/bb")};
    mg_mqtt_sub(c, &opts);
  } else if (ev == MG_EV_MQTT_MSG) {
    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;
    printf("Topic: %.*s, Message: %.*s",
           mm->topic.len, mm->topic.ptr,
           mm->data.len, mm->data.ptr);
  }
}

商业用途

  • Mongoose 被数百家企业使用,从西门子、施耐德电气、博通、博世、谷歌、三星、高通、卡特彼勒等财富 500 强巨头到小型企业
  • 用于解决广泛的业务需求,例如在设备上实现Web UI界面、RESTful API服务、遥测数据交换、产品远程控制、远程软件更新、远程监控等
  • 部署到全球生产环境中的数亿台设备
  • 查看施耐德电气(工业自动化)、Broadcom(半导体)、Pilz(工业自动化)等尊贵客户的案例研究
  • 查看将 Mongoose 集成到其商业产品中的工程师的推荐
  • 我们提供评估和商业许可支持、咨询和集成服务- 请随时联系我们

安全

我们认真对待安全:

  1. Mongoose 存储库运行 由 GitHub 支持的持续集成测试,该测试在每次提交到存储库时都会运行数百个单元测试。我们的单元测试 采用现代地址清理技术构建,有助于及早发现安全漏洞
  2. Mongoose 存储库已集成到 Google 的 oss-fuzz 连续模糊器中 ,可连续扫描潜在漏洞
  3. 我们定期收到来自独立安全组织(例如 Cisco TalosMicrosoft 安全响应中心MITRE CorporationCompass Security等)的漏洞报告。如果发现漏洞,我们将根据行业最佳实践采取行动:保留该出版物,修复软件并通知所有拥有适当订阅的客户
  4. 我们的一些客户(例如 NASA)有特定的安全要求并运行独立的安全审核,我们会收到通知,如果出现任何问题,请采取与 (3) 类似的操作。

贡献

欢迎贡献!请遵循以下准则:

  • 签署Cesanta CLA并发送 GitHub 拉取请求
  • 确保 PR 只有一次提交,并且只处理一个问题

About

嵌入式网络服务器

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 91.9%
  • C++ 7.1%
  • Other 1.0%