# 功能特性|Features
## 核心功能
### 1. 跨平台支持
NetLeaf支持Windows和Linux平台,以及多种CPU架构(已验证):
| 平台 | 架构 | 状态 |
|------|------|------|
| Windows | x64 | ✅ |
| Windows | x86 | ✅ |
| Windows | ARM64 | ✅ |
| Linux | amd64 | ✅ |
| Linux | i386 | ✅ |
| Linux | ARM | ✅ |
| Linux | ARM64 | ✅ |
| Linux | RISC-V 64 | ✅ |
| Linux | PowerPC 64 LE | ✅ |
| Linux | MIPS | ✅ |
| Linux | s390x | ✅ |
### 2. 协议支持
- **HTTP/1.1**: 完整支持
- **HTTP/2**: 多路复用、头部压缩
- **HTTP/3 (QUIC)**: 基于QUIC的下一代协议
- **WebSocket**: 实时双向通信
- **TCP/UDP**: 原始套接字支持
### 3. Web服务器功能
#### 3.1 内联网页支持
```c
// 创建Web服务器(自动启动)
nl_web_server_t* server = nl_web_create(8080);
// 添加HTML页面
nl_web_add_html(server, "/", "
Hello World
");
// 添加Vue页面
nl_web_add_vue(server, "/app", "{{ message }}
");
// 服务器已自动启动,无需调用 nl_web_start()
```
#### 3.2 变量硬编码功能
**新增功能**: 服务器端变量替换,用户即使使用F12无法看到原始变量名。
```c
const char* vars[] = {"username", "user_id"};
const char* values[] = {"张三", "12345"};
nl_web_add_html_with_vars(server, "/profile",
"欢迎, {{username}}
\n"
"用户ID: {{user_id}}
",
vars, values, 2);
```
**输出到客户端**:
```html
欢迎, 张三
用户ID: 12345
```
变量格式: `{{变量名}}`
#### 3.3 编码设置
```c
// 设置响应编码(默认为UTF-8)
nl_web_set_encoding(server, "UTF-8");
```
#### 3.4 文件热加载
修改外部HTML/Vue/JSON文件后,刷新页面立即生效,无需重启服务器。
```c
nl_web_add_html_file(server, "/", "index.html");
nl_web_add_vue_file(server, "/app", "app.vue");
nl_web_add_json_file(server, "/data", "data.json");
```
**平台**: Windows/Linux/macOS
#### 3.5 HTTP重定向
支持301永久重定向和302临时重定向,可在运行时切换类型。
```c
// 添加重定向路由
nl_web_add_redirect(server, "/old", "/new");
nl_web_add_redirect(server, "/goto", "https://example.com");
// 运行时切换重定向类型
nl_web_set_redirect_type(server, NL_REDIRECT_PERMANENT); // 301
nl_web_set_redirect_type(server, NL_REDIRECT_TEMPORARY); // 302(默认)
// 获取当前重定向类型
nl_redirect_type_t type = nl_web_get_redirect_type(server);
```
**重定向类型:**
- `NL_REDIRECT_TEMPORARY` (302): 临时重定向
- `NL_REDIRECT_PERMANENT` (301): 永久重定向
**平台**: Windows/Linux/macOS
#### 3.6 智能检测
`nl_web_add_html/vue/json` 自动识别URL、文件路径或静态内容:
- URL → 自动创建重定向路由
- 文件路径 → 自动创建热加载路由
- 其他字符串 → 作为内联静态内容
```c
nl_web_add_html(server, "/goto", "https://google.com"); // URL→重定向
nl_web_add_html(server, "/", "index.html"); // 文件→热加载
nl_web_add_html(server, "/hello", "Hello
"); // 静态→内联
```
**平台**: Windows/Linux/macOS
### 4. 运行时动态路由管理(v2.2.2新增)
在服务器运行期间添加、移除、查询和更新路由。
```c
// 运行时添加新路由
nl_web_add_route(server, "/api/status", "{\"status\":\"ok\"}", "application/json");
// 查询路由数量
int count = nl_web_get_route_count(server);
// 列出所有路由路径
char* paths[32];
for (int i = 0; i < 32; i++) paths[i] = (char*)calloc(256, 1);
int n = nl_web_list_routes(server, paths, 32);
// 更新路由内容
nl_web_update_route(server, "/api/status", "{\"status\":\"maintenance\"}", "application/json");
// 移除路由
nl_web_remove_route(server, "/old-path");
```
**API:**
- `nl_web_add_route()` - 添加静态内容路由
- `nl_web_remove_route()` - 移除指定路径的路由
- `nl_web_get_route_count()` - 获取当前路由数量
- `nl_web_list_routes()` - 列出所有路由路径
- `nl_web_update_route()` - 更新路由内容(仅支持静态内容类型)
**平台**: Windows/Linux/macOS
### 5. 日志系统
```c
// 设置日志级别
nl_log_set_level(NL_LOG_DEBUG);
// 输出日志
nl_log_debug("调试信息");
nl_log_info("一般信息");
nl_log_warn("警告信息");
nl_log_error("错误信息");
// 启用调试模式
nl_debug_enable(1);
```
### 6. 数据解析
- **JSON解析**: 完整的JSON支持
- **TOML解析**: TOML配置文件支持
### 7. 系统信息组件(懒加载)
获取非敏感的系统信息,采用懒加载机制。
```c
#include "netleaf.h"
int main() {
// 获取系统信息(首次调用时懒加载)
const char* os_name = nl_sys_info_get_os_name();
const char* arch = nl_sys_info_get_architecture();
const char* cpu = nl_sys_info_get_cpu_model();
int64_t ram = nl_sys_info_get_total_ram();
const char* runtime = nl_sys_info_get_runtime_version();
printf("OS: %s\n", os_name);
printf("Architecture: %s\n", arch);
printf("CPU: %s\n", cpu);
printf("Total RAM: %lld bytes\n", (long long)ram);
printf("Runtime: %s\n", runtime);
return 0;
}
```
**RAM进制配置:**
- `NL_RAM_UNIT_DECIMAL (1000)`: Linux默认,符合SI标准
- `NL_RAM_UNIT_BINARY (1024)`: Windows默认,传统二进制
### 8. 全局懒加载
所有组件支持懒加载机制,仅在首次使用时加载。
```c
#include "netleaf.h"
int main() {
// 预加载特定模块
nl_lazy_preload_module(NL_LAZY_MODULE_HTTP);
// 检查模块状态
if (nl_lazy_is_module_loaded(NL_LAZY_MODULE_HTTP)) {
printf("HTTP模块已加载\n");
}
// 停止模块释放资源
nl_lazy_stop_module(NL_LAZY_MODULE_HTTP);
return 0;
}
```
**支持懒加载的模块:**
- `NL_LAZY_MODULE_HTTP` - HTTP服务器
- `NL_LAZY_MODULE_WEBSOCKET` - WebSocket
- `NL_LAZY_MODULE_TCP` - TCP通信
- `NL_LAZY_MODULE_UDP` - UDP通信
- `NL_LAZY_MODULE_TOML` - TOML解析
- `NL_LAZY_MODULE_JSON` - JSON解析
- `NL_LAZY_MODULE_SYSINFO` - 系统信息
### 9. 多线程优化
```c
// 设置线程池大小(1-256)
nl_lazy_set_thread_count(8);
// 获取当前线程池大小
int threads = nl_lazy_get_thread_count();
```
**线程池建议:**
- **IO密集型**: 推荐设置较大线程数(如CPU核心数的2倍)
- **CPU密集型**: 推荐设置为CPU核心数
### 10. 反向代理(数据驱动事件引擎,**Beta**)
> ⚠️ **Beta 阶段**:反向代理引擎已实现完整功能,但 API 与行为可能在后续版本调整。
> 三平台实现:Linux `epoll` / macOS `kqueue` / Windows `IOCP`(`select` 作为兼容回退)。
> **混合路由支持**:同一 Web 服务器可同时启用 `proxy + static + content + redirect + file` 路由,
> 引擎内部统一处理,彻底消除早期"proxy 路由激活后其它路由返回 501"的限制。
NetLeaf 的 Web 反向代理已升级为**数据驱动的异步并行事件引擎**:不
为每个连接建立独立对象,而是把连接状态编码为 **8 位无状态字节(
`pr_state`)** + 一组按设备动态定容的**整数 ring buffer 数组**(`pr_fd_client` /
`pr_fd_upstream` / `pr_route_idx` / `pr_hbuf` / `pr_hbuf_out` / `pr_hdr_len` /
`pr_remain` / `pr_free`)。**单线程**通过 I/O 多路复用一次泵多个连接,彻底
摆脱旧版"并发 ≈ worker 数"的瓶颈,同时保持极低 CPU / 内存占用。
**多路复用后端(按平台自动选择):**
| 平台 | 后端 | 索引携带方式 | 空闲退避 |
|------|------|--------------|----------|
| Linux | `epoll` | `event.data.u32` 编码 idx + 方向位 | `epoll_wait` 1000ms |
| macOS | `kqueue` | `kevent.udata` 编码 idx + 方向位 | `kevent` 1s |
| Windows | `IOCP` 完成端口 | `AcceptEx` 预 post + `GetQueuedCompletionStatus` 分发 | 200ms 退避 |
**极低占用设计:**
- 所有 fd(listen / 客户端 / 上游)一律**非阻塞**(`O_NONBLOCK` /
`ioctlsocket(FIONBIO)`),事件驱动、忙时零等待。
- 空闲时退避超时(Linux/macOS 1s、Windows 200ms),无连接时近乎零 CPU。
- **单线程**引擎:`nl_web_start` 检测到 proxy 路由时直接起 1 个引擎线程,
**不分配 worker 池**;无 proxy 路由时回退到原有 worker 池,行为不变。
- `pr_remain` 记录每方向"已收待发余量",先补发上次 `EAGAIN` /
`WSAEWOULDBLOCK` 未发完的部分再读新数据,杜绝半包丢数据。
**ring 容量按设备动态调整(三平台统一):**
- Linux / macOS / Windows:`逻辑核数 × 64`,下限 64、上限 4096(1 核=64、8 核=512、
16 核=1024,高压 4096)。
- Windows 采用 IOCP 内核完成端口,**不受 `FD_SETSIZE` 硬上限约束**;4096 为工程
保护值(防低内存设备爆掉),需要可按需调大。
**上游协议分流**(`upstream` 前缀决定):
- `tcp://host:port` —— 纯字节透传,不解协议。
- `http://` / `https://` —— 重组 request line + `Host` /
`X-Forwarded-For` / `Connection: close` 头,透传原始 header / body。
**用法:**
```c
#include "netleaf.h"
int main(void) {
nl_web_server_t* server = nl_web_create(8080);
// 把 /api/ 透明转发到上游 API 服务(自动走数据驱动引擎)
nl_web_add_proxy(server, "/api/", "http://127.0.0.1:9000");
// TCP 上游(如 Redis)
nl_web_add_proxy(server, "/cache/", "tcp://127.0.0.1:6379");
nl_web_start(server); // 有 proxy 路由时单线程引擎自动拉起
nl_web_stop(server);
nl_web_destroy(server);
return 0;
}
```
**引擎接线细节:**
- `nl_web_start` 持锁遍历 `routes`,发现任意 `NL_ROUTE_TYPE_PROXY` 即起引擎
线程(`pthread_create` / `CreateThread` 包装 `nl_web_proxy_engine`)。
- **混合路由统一分发**(v2.4.2 修复):引擎内对四种路由类型做完整分发,
非 proxy 路由(REDIRECT / FILE / CONTENT)临时把 fd 切阻塞处理后立即 close +
释放 slot,proxy 路由保持非阻塞走引擎 pump 链路,彻底消除早期"proxy 路由
激活后其它路由返回 501"的限制;路由查找走引擎内锁保护的 `pr_lookup_route_idx`。
- `nl_web_stop` 关闭 listen socket 后 join 引擎线程;引擎正常退出时已自行
`close` 全部活跃连接并逐字段 `free` ring。stop / destroy 额外做兜底
清理(防 `TerminateThread` 路径残留),保证无泄漏。
### 11. 编码动态适配
实现"见人说人话,见鬼说鬼话"的智能编码协商机制。
```c
#include "netleaf.h"
int main() {
// 创建服务器
nl_web_server_t* server = nl_web_create(8080);
// 启用自动编码协商
nl_web_enable_auto_encoding(server, 1);
// 设置回退编码(当客户端未指定时使用)
nl_web_set_fallback_encoding(server, "UTF-8");
// 添加页面(内部始终使用UTF-8)
nl_web_add_html(server, "/", "你好,世界!
");
// 添加JSON响应(自动转码)
nl_web_add_json(server, "/api/data", "{\"message\": \"你好世界\"}");
// 服务器会自动根据客户端Accept-Charset头转换编码
return 0;
}
```
**编码转换API:**
```c
// 编码转换(双向转换)
char* gbk_output = nl_encoding_convert(utf8_string, strlen(utf8_string),
"UTF-8", "GBK");
// 自动检测编码
const char* detected = nl_encoding_detect(data, data_len);
// 获取系统默认编码
const char* sys_enc = nl_encoding_get_system_default();
```
**支持的编码:**
- UTF-8
- GBK
- GB2312
- GB18030
- Big5
- ISO-8859-1
- US-ASCII
- UTF-16
**全场景支持:**
- ✅ 控制台输出
- ✅ Web响应
- ✅ HTML页面
- ✅ Vue组件
- ✅ JSON响应
- ✅ TOML响应
**特性:**
- ✅ 自动解析Accept-Charset请求头
- ✅ 运行时自动转码
- ✅ 双向编码转换
- ✅ 跨平台支持(Windows/Linux)
- ✅ 编码自动检测
- ✅ 懒加载机制:功能拉起使用后自动下线,减少内存占用
- ✅ 智能优化:仅对非ASCII字符进行转码,减少性能开销
## 安全特性
- ✅ 空指针检查
- ✅ 缓冲区溢出防护
- ✅ 字符串格式化安全
- ✅ 数组边界检查
- ✅ 内存管理安全
- ✅ 只能停止本库启动的端口
## 附加模块 (v2.4.0)
NetLeaf支持多个独立可拆卸模块,与主库共用版本号。
### Auto-complete (netleaf_autocomplete)
**功能**: 自动补全charset标签和自动引入Vue库
**特性**:
- Charset自动补全:根据统一编码格式添加 `` 和 ``
- Vue自动引用:检测Vue代码但无引用时自动从CDN引入
- 灵活启用方式:支持 `true/false`, `on/off`, `yes/no`, `1/0`
- 单独控制:charset和Vue功能可独立启用/禁用
**平台**: Windows/Linux/macOS
### Auto-route (netleaf_autoroute)
**功能**: 404时自动查找相近端点并在错误页面提示
**特性**:
- Levenshtein距离算法计算路径相似度
- 多策略评分:路径段匹配、前缀共有、段数相同
- 通配符支持:`*` 和 `**`
**平台**: Windows/Linux/macOS
### ErrorPage (netleaf_errorpage)
**功能**: 支持自定义错误页面模板,强制预留变量区域
**特性**:
- 独立standalone模块,其他模块不可使用其功能
- 模板必须预留变量:`{{ERROR_CODE}}`, `{{ERROR_MESSAGE}}`, `{{REQUESTED_PATH}}`, `{{SERVER_VERSION}}`, `{{TIMESTAMP}}`
- 支持 `{{#if SUGGESTION}}` 条件块
- 可与Auto-route联动显示路由建议
**平台**: Windows/Linux/macOS
### IPC (netleaf_ipc) - v2.2.1新增
**功能**: 进程间通讯服务
**特性**:
- Windows: Named Pipe
- Linux: Unix Domain Socket
- 支持服务端监听和客户端连接
- 跨进程数据传输
- 线程安全设计
**平台**: Windows/Linux
### Link Aggregation (netleaf_linkagg) - v2.2.1新增
**功能**: 同端口链路聚合,将请求转发到多个后端
**特性**:
- 单端口监听
- 负载均衡策略: Round Robin, Random, Least Connections, Weighted Round Robin
- 支持 HTTP 和 IPC 后端
- 同端口路由聚合
**平台**: Windows/Linux
### Vue (netleaf_vue) - v2.2.2新增
**功能**: Vue.js 后端支持和 HTML 生成
**特性**:
- Vue CDN 配置(unpkg、cdnjs、jsdelivr、local)
- Vue 代码检测和自动导入
- HTML 页面生成(带 Vue CDN)
- **本地 Vue.js 文件支持**(离线/内嵌模式)
- **预制系统信息页面**(`nl_vue_generate_sysinfo` / `nl_vue_generate_sysinfo_inline`)
- 变量替换支持
**平台**: Windows/Linux/macOS
## 统一模块接口 (v2.2.1)
所有独立模块通过统一接口进行管理:
```c
typedef struct nl_module_info {
nl_module_type_t type;
const char* name;
const char* version;
uint32_t capabilities;
nl_module_status_t status;
int platform_windows;
int platform_linux;
int platform_macos;
int (*init)(void);
void (*shutdown)(void);
int (*is_available)(void);
const char* (*get_version)(void);
const char* description;
const char* author;
struct nl_module_info* next;
} nl_module_info_t;
```
**模块管理API**:
- `nl_module_register()` - 注册模块
- `nl_module_unregister()` - 注销模块
- `nl_module_find()` - 查找模块
- `nl_module_get_all()` - 获取所有模块列表
- `nl_module_init_all()` - 初始化所有模块
- `nl_module_shutdown_all()` - 关闭所有模块
### Lang (netleaf_lang) - 多语言错误消息 + 变量替换(v2.4.0)
**功能**: 提供统一的多语言错误消息翻译功能,并增强支持**变量替换**和**条件表达式求值**
**特性**:
- 中英文错误消息支持
- 所有 NetLeaf 库的错误码统一翻译
- 简单易用的 API
- 运行时语言切换
- **变量替换**:`{{VAR_NAME}}` 模板语法,支持字符串/整数/浮点/布尔类型
- **条件表达式**:支持 `== != >= <= > <` 运算符,兼容数值和字符串比较
- **脚本引擎**:通过回调注册 Lua/Python/JavaScript 引擎(扩展 API)
- **动态变量**(v2.4.1):`nl_lang_var_set_provider()` 按需计算变量值
- **外部变量**(v2.4.1):`nl_lang_var_bind_env()` / `nl_lang_var_load_env()` / `nl_lang_var_load_file()`
- **表驱动错误注册**(v2.4.1):`NL_ERROR_BEGIN/NL_ERROR/NL_ERROR_END` + `nl_lang_register_errors()`
**API 示例**:
```c
#include "netleaf_lang.h"
// 设置语言为中文
nl_lang_set(NL_LANG_ZH);
// 获取 LinkAgg 错误消息
const char* msg = nl_lang_get_error(NL_LIB_LINKAGG, -9);
// 输出: "不接入,ID被占用"
// 设置语言为英文
nl_lang_set(NL_LANG_EN);
msg = nl_lang_get_error(NL_LIB_LINKAGG, -9);
// 输出: "ID already in use, not connected"
// === v2.4.0 新增:变量替换 ===
nl_lang_var_set("user", "Alice");
nl_lang_var_set_int("age", 25);
nl_lang_var_set_float("price", 3.14);
nl_lang_var_set_bool("active", 1);
char buf[256];
nl_lang_var_replace("Hello {{ user }}, age={{ age }}", buf, sizeof(buf));
// buf == "Hello Alice, age=25"
// === v2.4.0 新增:条件表达式 ===
int result = nl_lang_var_condition_eval("age > 18"); // 1 (true)
result = nl_lang_var_condition_eval("user == 'Alice'"); // 1 (true)
result = nl_lang_var_condition_eval("price >= 3.0"); // 1 (true)
result = nl_lang_var_condition_eval("active == true"); // 1 (true)
// === v2.4.0 新增:脚本引擎注册 ===
nl_script_result_t* my_exec(const char* script, const char* lang_code, int error_code, void* userdata) {
// 实现脚本执行逻辑
static nl_script_result_t result;
result.status = 0;
result.result_type = 1;
result.result_str = "hello from script";
return &result;
}
nl_lang_register_script_engine("myscript", my_exec, NULL);
char script_out[256];
nl_lang_execute_script("myscript", "echo hello", NULL, 0, script_out, sizeof(script_out));
```
**平台**: Windows/Linux/macOS
**库标识符**:
| 库 | 标识符 |
|----|--------|
| Core | `NL_LIB_CORE` (0x0000) |
| IPC | `NL_LIB_IPC` (0x0001) |
| LinkAgg | `NL_LIB_LINKAGG` (0x0002) |
| Auto-route | `NL_LIB_AUTOROUTE` (0x0003) |
| Auto-complete | `NL_LIB_AUTOCOMPLETE` (0x0004) |
| ErrorPage | `NL_LIB_ERRORPAGE` (0x0005) |
| Lang | `NL_LIB_LANG` (0x0006) |
| TLS | `NL_LIB_TLS` (0x0007) |
| MQTT | `NL_LIB_MQTT` (0x0008) |
---
## TLS/SSL 加密扩展 (v2.4.0)
**模块**: `netleaf_tls.dll`
**说明**: TLS/SSL 是一个独立的扩展库,其他通信协议(包括 MQTT)可通过 NL 扩展系统调用其功能。基于 mbedTLS 2.28.10 LTS 构建,支持多种安全协议。
### 特性
- ✅ **协议支持**: TLS 1.0, 1.1, 1.2, 1.3
- ✅ **密码套件**: 多种主流密码套件
- ✅ **证书验证**: CA 证书链验证、客户端证书认证
- ✅ **随机数生成**: 基于硬件熵源的加密安全随机数
- ✅ **内存管理**: 自动内存分配和释放
- ✅ **线程安全**: 支持多线程并发使用
> ⚠️ **安全提示(不推荐 TLS 1.0 / 1.1)**:TLS 1.0/1.1 已被 RFC 8996 废弃且不再安全,**不建议使用**。
> TLS 由本**独立的 TLS 扩展库**(`netleaf_tls`,内置 mbedTLS)统一负责,保留 1.0/1.1 仅为兼容老旧对端;
> 请将 `min_proto` 设置为 `NL_TLS_PROTO_TLS1_2` 或更高。
### 架构
```mermaid
flowchart TD
subgraph NLEXT["NetLeaf 扩展系统"]
MQTT["netleaf_mqtt"]
OTHER["其他扩展库"]
end
TLS["netleaf_tls.dll
(TLS/SSL 加密扩展)"]
MQTT -->|调用| TLS
OTHER -->|调用| TLS
```
### 构建配置
```cmake
# CMakeLists.txt
option(BUILD_TLS "Build TLS/SSL extension" ON)
# 编译时自动包含 mbedTLS 源码
if(BUILD_TLS)
target_link_libraries(netleaf_mqtt PRIVATE netleaf_tls)
endif()
```
**平台**: Windows/Linux/macOS
---
## MQTT v5.0 协议客户端 (v2.4.0)
**模块**: `netleaf_mqtt.dll`
**说明**: 轻量级 MQTT v5.0 协议客户端实现,支持 QoS 0/1/2、主题订阅发布、消息回调等核心功能。可选集成 TLS 加密通信。
### 特性
- ✅ **MQTT 5.0**: 完整支持 MQTT v5.0 协议
- ✅ **QoS 级别**: QoS 0 (至多一次), QoS 1 (至少一次), QoS 2 (恰好一次)
- ✅ **主题订阅**: 支持通配符 (+ 和 #)
- ✅ **消息回调**: 异步消息接收和处理
- ✅ **连接管理**: 自动重连、心跳保活
- ✅ **属性支持**: 完整的属性编码/解码
- ✅ **TLS 加密**: 可选集成 TLS/SSL 安全通信
### 架构
```mermaid
flowchart TD
subgraph MQTT["netleaf_mqtt.dll"]
direction LR
CORE["MQTT 核心
(netleaf_mqtt.c)"]
MTLSP["MQTT TLS 模块
(netleaf_mqtt_tls.c)"]
end
TLS["netleaf_tls
(可选)"]
MQTT --> TLS
```
### 构建配置
```cmake
# CMakeLists.txt
option(BUILD_MQTT "Build MQTT client module" ON)
option(BUILD_TLS "Build TLS/SSL extension for MQTT" ON)
```
**平台**: Windows/Linux/macOS
---
## 开源项目来源
NetLeaf 项目中使用了以下开源项目,特此致谢:
| 项目 | 许可证 | 用途 | 链接 |
|------|--------|------|------|
| **mbedTLS** | Apache 2.0 / GPL v2.0 | TLS/SSL 加密库 | [github.com/Mbed-TLS/mbedTLS](https://github.com/Mbed-TLS/mbedTLS) |
| **MQTT 规范** | EPL-2.0 / EDL 1.0 | MQTT v5.0 协议定义 | [mqtt.org](https://mqtt.org/) |
| **Paho MQTT C** | EPL-2.0 / EDL 1.0 | MQTT 协议参考实现 | [github.com/eclipse/paho.mqtt.c](https://github.com/eclipse/paho.mqtt.c) |
**注意**: 本项目中 mbedTLS 源码已内置于 `third-party/mbedtls/` 目录,编译时自动包含,无需用户单独安装。