Libwebsockets — это простая в использовании библиотека на чистом языке C, имеющая лицензию MIT, предоставляющая клиент и сервер для http/1 , http/2 , websockets , MQTT и других протоколов безопасным, легким, настраиваемым, масштабируемым и гибким способом. Его легко создавать и выполнять кросс-сборку с помощью cmake, и он подходит для задач от встроенной ОСРВ до массового обслуживания в облаке.
Он поддерживает множество облегченных вспомогательных реализаций для таких вещей, как JSON, CBOR, JOSE, COSE, а также поддерживает OpenSSL и MbedTLS v2 и v3 «из коробки» для всего. Когда дело доходит до совместного использования циклов событий, он очень общительный, поддерживает libuv, libevent, libev, sdevent, glib и uloop, а также пользовательские библиотеки событий.
Более 100 независимых минимальных примеров для различных сценариев, лицензия CC0 (общественное достояние) для вырезания и вставки позволяют быстро приступить к работе.
Существует множество README на самые разные темы.
Мы проводим огромное количество CI-тестирований за одну отправку, на данный момент 582 сборки на 30 платформах. Вы можете увидеть стойку lws CI и прочитать о том, как Sai на базе lws используется для координации всех испытаний.
Хотите управлять своим дисплеем EPD или TFT/OLED с помощью HTML + CSS? Есть только ESP32?
Хотите удаленные файлы JPEG, PNG, HTML, композицию RGBA, гамму, диффузию ошибок, если это необходимо?
Рендеринг в реальном времени в строковый буфер, потому что у вас недостаточно памяти для фреймбуфера?
Взгляните сюда...
Благодаря Фелипе Гасперу, теперь на Metacpan доступна привязка Perl для lws. Здесь используется недавняя поддержка общего цикла событий в lws, чтобы lws был гостем в существующем цикле событий Perl.
Поддержка Secure Streams в lws была введена пару лет назад. Это интерфейс более высокого уровня для lws wsi
-level API, который упрощает подключение за счет разделения политики подключения, такой как информация о протоколе и конечной точке, в отдельный файл политики JSON и просто выполнения кода. с полезной нагрузкой; как можно больше деталей проводного протокола скрыты или перемещены в политику, поэтому пользовательский код практически идентичен, даже если проводной протокол изменяется.
Пользовательский код просто просит создать SS по «имени типа потока», он создается в соответствии с деталями (протокол, конечная точка и т. д.) под тем же именем в политике.
Ключевые записи политики, такие как конечная точка, могут содержать замены строк ${metadata-name}
для обработки адаптации во время выполнения через метаданные. Поддерживаются h1, h2, ws и mqtt.
Являясь слоем поверх API wsi
, SS обеспечивает более высокий уровень доступа к существующим возможностям уровня WSI; оба типа API будут поддерживаться. Безопасные потоки живут дольше, чем одиночный wsi, поэтому SS может самостоятельно координировать повторные попытки. Пользовательский код на основе SS обычно значительно меньше и более удобен в обслуживании, чем уровень wsi.
В основной ветке я переместил старые примеры в ./minimal-examples-lowlevel
и начинаю переносить оттуда больше случаев в примеры на основе SS.
Особенность | «низкоуровневый» способ | Способ безопасного потока |
---|---|---|
Создать контекст | код | такой же |
Поддержка циклов, планировщик | по умолчанию, библиотеки событий | такой же |
Поддерживает режим связи | Клиент, Сервер, Необработанный | такой же |
Поддерживает протоколы | h1, h2, ws, mqtt (клиент) | такой же |
Поддержка TLS | mbedtls (включая v3), openssl (включая v3), wolfssl, Boringssl, libressl | такой же |
Сериализуемый, проксируемый, мультиплексируемый, переносимый | Нет | Да |
Автоматически выделяемый пользовательский объект для каждого соединения | pss указан в lws_protocols | Указано в информационной структуре ss |
Пользовательский API подключения | lws_protocols cbs для конкретного протокола (> 100) | SS API (только rx, tx, обратные вызовы состояния) |
Отправка адаптации | lws_callback_on_writeable() + ЗАПИСЬ | lws_ss_request_write() + tx() cb |
Отправка буфера | Частичная обработка по выбору пользователя + malloc | при условии SS, без частичных |
Создание виртуальных хостов | код | Политика JSON |
TLS-проверка | пакет сертификатов или код | Политика JSON или пакет сертификатов |
Повторная попытка подключения/откат | код | Политика JSON , Авто |
забивание гвоздями | код | Политика JSON , Авто |
Сведения о конечной точке и протоколе | распространять по коду | Политика JSON |
Выбор протокола, совместное использование конвейера/потока | код | Политика JSON |
выбор подпротокола ws | код | Политика JSON |
ws двоичный/текстовый | код | Политика JSON |
Метаданные, специфичные для протокола | API-интерфейсы, специфичные для протокола, в коде (например, lws_hdr) | Политика JSON , общие API метаданных в коде |
Правила действия соединения | структура | Политика JSON , Авто |
Трансляция в виде длинного опроса | код | Политика JSON |
Авторизация | код | Политика JSON + автоматическая ротация, если поддерживается поставщиком, иначе код |
API Secure Streams также сериализуемы : один и тот же клиентский код может выполнять соединение непосредственно в том же процессе, что и вы ожидаете, или пересылать действия, метаданные и полезные данные на прокси-сервер SS, который владеет политикой через соединение через домен Unix или TCP-сокет. выполняться централизованно. Это позволяет, например, использовать потоки h2 от разных процессов через одно соединение.
Сериализованный SS также может передаваться через общие транспорты, такие как UART. Приведен пример реализации примера Binance на RPi Pico с транспортом UART к прокси-серверу SS транспорта UART, где сам пико не имеет сетевого стека, tls, сжатия или стека wss. , но может отправлять и получать сообщения в конечную точку и обратно, как если бы это было так.
Необязательный lws_trasport_mux
используется для промежуточного взаимодействия между транспортом UART и уровнем SSPC, позволяя одному каналу переносить множество отдельных соединений SS.
Пользовательский код SS идентичен, однако он транспортируется, мультиплексируется и выполняется.
Посмотреть список изменений
Первоначальный коммит для lws был сделан 11 лет назад, 28 октября 2021 года, это была большая работа. Всего существует 4,3К патчей, совокупно около 800KLOC (это не размер в репозитории, а количество строк исходного кода, которые были изменены патчами за годы).
К счастью, оказалось, что за прошедшие годы примерно 15% этой суммы внесли 404 участника: это не так уж и плохо. Большое спасибо всем, кто предоставил патчи.
Сегодня по крайней мере десятки миллионов устройств и функций продуктов полагаются на lws для обеспечения связи, в том числе несколько устройств от FAANG; Google теперь включает lws в исходный код Android.
Это библиотека C libwebsockets для облегченных клиентов и серверов веб-сокетов. Для поддержки посетите
https://libwebsockets.org
и рассмотрите возможность присоединения к списку рассылки проекта по адресу
https://libwebsockets.org/mailman/listinfo/libwebsockets
Вы можете получить последнюю версию библиотеки из git:
Документация по API Doxygen для разработки: https://libwebsockets.org/lws-api-doc-main/html/index.html.