• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь WebSockets

ave

New member
Проблема с подключением этой библиотеки: GitHub - Links2004/arduinoWebSockets: arduinoWebSockets

В менеджере библиотек пишет установлена, а в скетче она неактивна и не компилируется.
Програму перезагружал. Что дальше делать не понятно. Может, кто-то знает в чем проблема...
Нужна помощь...

 

ave

New member
Теперь компилируется, но в скетче include не оранжевый а черный. Я так понял там оно все равно каким цветом.
И работает как-то странно, через раз. Здесь есть кто-то кто с WebSockets работал? Есть какие-то простые примеры? Может с другими библиотеками. На форуме практически нет информации по этой технологии.

Тестовая страница:
websocket.org Echo Test - Powered by Kaazing

 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Не пользовался websocket на esp и не буду. Из принципа. Вы в курсе как он работает? Не на esp а вообще? Надо сделать так чтобы сервер мог послать сообщение клиенту когда хочется серверу. Как это реализовано? При подключении клиент посылает пустышку серверу. Сервер создает сессию и держит ее пока не понадобится что то передать клиенту. Когда сервер припечет что то послать клиенту он отправляет как бы ответ на пустышку и закрывает сессию и тутже получает новую пустышку. То есть в памяти сервера всегда находятся сессии от ВСЕХ подключившихся клиентов, даже тех которые не спросясь уже давно отвалились. Теперь вспомним сколько памяти у esp. Думаю теперь понятно почему на этом форуме websocket не в моде :)
 

pvvx

Активный участник сообщества
Не пользовался websocket на esp и не буду. Из принципа. Вы в курсе как он работает? Не на esp а вообще? Надо сделать так чтобы сервер мог послать сообщение клиенту когда хочется серверу. Как это реализовано? При подключении клиент посылает пустышку серверу. Сервер создает сессию и держит ее пока не понадобится что то передать клиенту. Когда сервер припечет что то послать клиенту он отправляет как бы ответ на пустышку и закрывает сессию и тутже получает новую пустышку. То есть в памяти сервера всегда находятся сессии от ВСЕХ подключившихся клиентов, даже тех которые не спросясь уже давно отвалились. Теперь вспомним сколько памяти у esp.
Нормально websocket работает. Только через него гонятся данные на всякие графики, не через тормозные Ajax или Json. websocket примерно в 100 раз быстрее на одно соединение и трансфер у него к 1 Мегабайту в сек. А для запроса и передачи Ajax или Json данных на пару переменных ходит целое соединение и разъединение. Т.е. целая сессия. И интерактивные страницы ужасно работают через Ajax или Json - пару штук изменений полей данных за секунду это предел у Arduino по Ajax или Json.
Измерение напряжения питания и тока с датчика типа INA219 на с web-сервера ESP нормально смотрится бегущим графиком в 500 точек в секунду через websocket... Примеры правда давал не на Arduino, но кто мешает это сделать и на Arduino?
 
  • Like
Реакции: ave

ave

New member
Не пользовался websocket на esp и не буду. Из принципа. Вы в курсе как он работает? Не на esp а вообще? Надо сделать так чтобы сервер мог послать сообщение клиенту когда хочется серверу. Как это реализовано? При подключении клиент посылает пустышку серверу. Сервер создает сессию и держит ее пока не понадобится что то передать клиенту. Когда сервер припечет что то послать клиенту он отправляет как бы ответ на пустышку и закрывает сессию и тутже получает новую пустышку. То есть в памяти сервера всегда находятся сессии от ВСЕХ подключившихся клиентов, даже тех которые не спросясь уже давно отвалились. Теперь вспомним сколько памяти у esp. Думаю теперь понятно почему на этом форуме websocket не в моде :)
Юрий Ботов, я думаю вы не правы. По-моему websocket по-другому работает. При подключении клиента сервер создает сокет и держит его сколько нужно. Сокет - это всего несколько байт токен-идентификатора подключенного клиента. При отправке сервером сообщения клиенту сессия не закрывается и ответ не обязателен. Сессия (сокет) закрывается в основном по команде от клиента. Хотя можно написать процедуру закрытия сервером всех сокетов, например, раз в сутки, а клиенты при закрытых сокетах могут заново переконектится уже с новыми сокетами. И память не будет засоряться. Конечно, esp не для 100 000 клиентов, но, думаю до 100 клиентов esp потянет. Хотя могу и ошибаться, память еще не считал. И правильней, наверное, делать сервер на Raspberry Pi, а на esp только клиенты.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Конечно, esp не для 100 000 клиентов, но, думаю до 100 клиентов esp потянет. Хотя могу и ошибаться, память еще не считал.
До пары десятков при малом использовании памяти другими задачами. Websocket - по ресурсам это открытое TCP соединение + несколько других переменных (ключ и т.д.). Т.е. не так много по памяти, но памяти у EPS8266 очень мало.
Ресурс при этом жрет открытый и активный в данный момент Websocket, совершенно равный любому простому соединению, хоть UDP. И нет смысла использования вечно открытого Websocket-а. Его открывают на время, когда требуются пропуск данных через него.
Для сети и прочего всё это без разницы. Ограничения только в памяти ESP8266 и реализации LwIP и аппаратной части WiFi на нем. LwIP в ESP держит всего 4..6 активных соединений, WiFi (по ресурсам) - 4. Всё что выше вызывает замедление и увеличеное использование ресурсов...

@Юрий Ботов - простейший HTTP сокет требует и занимает больше ресурсов, чем WebSocket. Размер дополнительных заголовков и пакетов в сети у HTTP сокета на каждую переменную или запрос у больше чем у WebSocket-а во много раз. Т.е. в среднем, при сравнении HTTP keep-alive и WebSoscket разница в ресурсах по всем устройствам, включая сетевые свичи - десятикратная.
Не использование WebSocket вами говорит только о том, что у в ваших устройствах нет передаваемых данных более 1 переменной в минуту.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
@pvvx - боюсь нам обоим надо перечитать спецификации websocket :) , освежить так сказать... Мне отчего то помнится что websocket это ВИРТУАЛЬНАЯ надстройка над HTTP соединением при которой HTTP сеанс не рубится после каждого запрос-ответ а остается ПОСТОЯННО открытым. Поэтому вэб-сокет НЕ МОЖЕТ занимать меньше ресурсов чем HTTP сокет, потому что он сам HTTP сокет плюс еще немножко. Websocket я использую но на основной работе (там сервера побольше), а вот на esp использовать не хочу.
 

pvvx

Активный участник сообщества
@pvvx - боюсь нам обоим надо перечитать спецификации websocket :) , освежить так сказать... Мне отчего то помнится что websocket это ВИРТУАЛЬНАЯ надстройка над HTTP соединением при которой HTTP сеанс не рубится после каждого запрос-ответ а остается ПОСТОЯННО открытым. Поэтому вэб-сокет НЕ МОЖЕТ занимать меньше ресурсов чем HTTP сокет, потому что он сам HTTP сокет плюс еще немножко. Websocket я использую но на основной работе (там сервера побольше), а вот на esp использовать не хочу.
Это антирекламное мнение из вики по websocket. :)
Websocket существует и отдельно от HTTP. Сервер может не иметь полного HTTP, а иметь несколько портов с websocket.
Так-же HTTP keep-alive - это вечное соединение, пока не подана команда закрытия.
В HTTP для передачи параметров в одном соединении у нас есть возможность использовать формат мультидата. Он имеет страшно большие размеры заголовков и много кода по их парсингу.
Посчитайте что требуется для запроса по Ajax или Json 100 переменных в сек и сравните это с Websocket. Даже не надо сравнивать с форматом передачи бинарных данных у Websocket :) Затем откройте Wireshark и оцените трафик... Тут даже комментировать будет нечего.

Реальное сравнение Websocket с Ajax или Json на ESP гласит о том, что Websocket позволяет обслужить на ESP8266 около тысячи запросов строковых переменных в секунду, а Ajax или Json - до 10. Т.е. стократная разница.

Для примера опроса датчика INA219 пришлось даже вставлять задержку :)
esp8266web/i219ws.htm at master · pvvx/esp8266web · GitHub
Не успевает датчик подготовить новые данные в регистрах :)
 
Последнее редактирование:

ave

New member
Юрий Ботов, то, что вы описали относится к технологии Ajax.

pvvx, из вашего примера "~inc:grfx1.inc~" - эта команда include файла на каком языке?
Реальное сравнение Websocket с Ajax или Json
WebSoscket и Ajax - это технологии, а Json или XML - это форматы данных. Кажется, так правильнее.

Меня вот еще одно интересует. Есть еще одно ограничение - по каналам или частотам или количеству физических подключений, не знаю как выразиться. Вопрос - сколько клиентов могут подключиться к одной точке доступа одновременно? Плюс помехи от соседей, количество занятых каналов. Тоисть реально ли на esp строить аналог Z-Wave сети для одной квартиры или дома? Или не стоит над этим заморачиваться?

Для примера видео про устройства Z-Wave. Мотать в конец на настройки.
Посмотрев, сколько там устройств и какие сложные настройки, мне плохо стало.

 
Последнее редактирование:

pvvx

Активный участник сообщества
pvvx, из вашего примера "~inc:grfx1.inc~" - эта команда include файла на каком языке?
На моем. Это для парсера - вставка другого файла...

WebSoscket и Ajax - это технологии, а Json или XML - это форматы данных. Кажется, так правильнее.
А пофиг :) Байты есть байты. Один бит другой в фрейме - другая система? :)
Меня вот еще одно интересует. Есть еще одно ограничение - по каналам или частотам или количеству физических подключений, не знаю как выразиться. Вопрос - сколько клиентов могут подключиться к одной точке доступа одновременно? Плюс помехи от соседей, количество занятых каналов. Тоисть реально ли на esp строить аналог Z-Wave сети для одной квартиры или дома? Или не стоит над этим заморачиваться?
Сложно сразу вразумительно ответить - может позже накалякаю что :)
 
  • Like
Реакции: ave
Сверху Снизу