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