Libwebsockets 是一个易于使用、MIT 许可的纯 C 库,以安全、轻量级、可配置、可扩展和灵活的方式为http/1 、 http/2 、 websockets 、 MQTT和其他协议提供客户端和服务器。它可以通过 cmake 轻松构建和交叉构建,适用于从嵌入式 RTOS 到大规模云服务的任务。
它支持许多轻量级辅助实现,例如 JSON、CBOR、JOSE、COSE,并支持开箱即用的 OpenSSL 和 MbedTLS v2 和 v3。它在事件循环共享方面非常合群,支持 libuv、libevent、libev、sdevent、glib 和 uloop,以及自定义事件库。
100多个独立的最小示例,适用于各种场景,CC0许可(公共领域),可剪切粘贴,让您快速上手。
有很多关于各种主题的自述文件。
我们每次推送都会进行大量 CI 测试,目前在 30 个平台上进行了 582 个构建。您可以查看 lws CI 机架并了解如何使用基于 lws 的 Sai 来协调所有测试。
想要使用 HTML + CSS 驱动您的 EPD 或 TFT / OLED 显示器吗?只有 ESP32?
如果需要的话,想要远程 JPEG、PNG、HTML、RGBA 合成、伽玛、误差扩散吗?
实时渲染到行缓冲区中,因为您没有足够的堆用于帧缓冲区?
看看这里...
感谢 Felipe Gasper,现在metacpan 上提供了 lws 的 perl 绑定,这使用了 lws 中最近的通用事件循环支持,使 lws 作为现有 perl 事件循环上的来宾。
lws 中的安全流支持是几年前引入的,它是 lws wsi
级 api 的更高级别接口,通过将协议和端点信息等连接策略分离到单独的 JSON 策略文件中,并且只需处理代码来简化连接带有有效载荷;尽可能多的有线协议细节被隐藏或移至策略中,因此即使有线协议发生变化,用户代码也几乎相同。
用户代码仅要求通过“流类型名称”创建SS,它是根据策略中同名下的详细信息(协议、端点等)创建的。
端点等关键策略条目可以包含${metadata-name}
字符串替换,以通过元数据处理运行时适应。支持 h1、h2、ws 和 mqtt。
作为wsi
api 之上的一层,SS 提供了一种更高级别的方式来访问现有的 wsi 级别功能,这两种 API 都将保持支持。安全流比单个 wsi 的寿命更长,因此 SS 可以自行协调重试。基于 SS 的用户代码通常比 wsi 层小得多且更易于维护。
在主分支中,我已将较旧的示例移至./minimal-examples-lowlevel
中,并开始将更多案例从那里移植到基于 SS 的示例中。
特征 | “低级”wsi 方式 | 安全流方式 |
---|---|---|
创建上下文 | 代码 | 相同的 |
循环支持,sul 调度程序 | 默认,事件库 | 相同的 |
支持通讯模式 | 客户端、服务器、原始 | 相同的 |
支持协议 | h1、h2、ws、mqtt(客户端) | 相同的 |
TLS 支持 | mbedtls(包括 v3)、openssl(包括 v3)、wolfssl、boringssl、libressl | 相同的 |
可串行化、可代理、可复用、可传输 | 不 | 是的 |
自动分配每个连接的用户对象 | lws_protocols 中指定的 pss | 在 ss info 结构中指定 |
连接用户API | 特定于协议的 lws_protocols cbs (> 100) | SS API(仅限 rx、tx、状态回调) |
发送适配 | lws_callback_on_writeable() + WRITEABLE | lws_ss_request_write() + tx() cb |
发送缓冲区 | 用户选择 + malloc'd 部分处理 | SS 提供,无部分内容 |
创建虚拟主机 | 代码 | JSON 策略 |
TLS 验证 | 证书包或代码 | JSON 策略或证书包 |
连接重试/退避 | 代码 | JSON策略,自动 |
钉钉子 | 代码 | JSON策略,自动 |
端点和协议详细信息 | 分布在代码周围 | JSON 策略 |
协议选择、管道/流共享 | 代码 | JSON 策略 |
ws子协议选择 | 代码 | JSON 策略 |
ws 二进制/文本 | 代码 | JSON 策略 |
特定于协议的元数据 | 代码中特定于协议的 API(例如,lws_hdr) | JSON 策略,代码中的通用元数据 API |
连接有效性规则 | 结构体 | JSON策略,自动 |
作为长轮询进行流式传输 | 代码 | JSON 策略 |
授权 | 代码 | JSON 策略+ 自动轮换(如果提供商支持),否则代码 |
Secure Streams API 也是可序列化的,完全相同的客户端代码可以在您期望的同一进程中直接完成连接,或者将操作、元数据和有效负载转发到通过 Unix 域或 TCP 套接字连接拥有策略的 SS 代理集中履行。例如,这允许来自不同进程的 h2 流共享单个连接。
序列化的 SS 还可以通过 UART 等通用传输方式传输,提供了一个在 RPi Pico 上实现 Binance 示例的示例,其中 UART 传输到 UART 传输 SS 代理,其中 pico 本身没有网络堆栈、tls、压缩或 wss 堆栈,但可以像以前一样向端点发送和接收。
可选的lws_trasport_mux
用于插入 UART 传输和 SSPC 层之间,允许单个管道承载许多单独的 SS 连接。
用户 SS 代码是相同的,但其传输、复用和实现方式不同。
查看变更日志
lws 的首次提交是在 11 年前,即 2021 年 10 月 28 日,这是一项艰巨的工作。总共有 4.3K 个补丁,累计达到 800KLOC(这不是 repo 中的大小,而是多年来,补丁更改了多少源代码行)。
令人欣慰的是,多年来事实证明,其中约 15% 是由 404 位贡献者贡献的:这还不错。非常感谢所有提供补丁的人。
如今,至少有数千万设备和产品功能依赖 lws 来处理其通信,其中包括来自 FAANG 的一些设备和产品功能; Google 现在将 lws 作为 Android 源的一部分。
这是用于轻量级 websocket 客户端和服务器的 libwebsockets C 库。如需支持,请访问
https://libwebsockets.org
并考虑加入项目邮件列表:
https://libwebsockets.org/mailman/listinfo/libwebsockets
您可以从 git 获取该库的最新版本:
用于开发的 Doxygen API 文档:https://libwebsockets.org/lws-api-doc-main/html/index.html