Сбой рукопожатия lighttpd/mod_websocket mqtt (без субпрототипа)

Я настроил lighttpd с mod_websocket, как описано в записи блога Дома Брэмли (за исключением того, что я использую BeagleBone Black с Debian Wheezy вместо rPi).

https://www.ibm.com/developerworks/community/blogs/B-Fool/entry/setting_up_an_mqtt_websocket_gateway_for_raspberry_pi?lang=en

[Во время сборки lighttpd/mod_websocket меня спросили, не хочу ли я пропатчить сервер, и я ответил утвердительно.]

У меня есть брокер mosquito MQTT, работающий на том же хосте и публикующий сообщения на разные темы.

Когда я пытаюсь подключиться к брокеру с помощью клиента браузера через веб-сокет, я вижу, что все работает нормально с точки зрения обновления http до веб-сокета и пересылки запроса на подключение к mosquitto. Mosquitto получает запрос на подключение и принимает его. Однако ответ, возвращаемый браузеру, не включает заголовок Sec-Websocket-Protocol, повторяющий спецификатор субпрототипа mqttv3.1, который был в исходном запросе на обновление. Клиент правильно отклоняет этот ответ, и соединение закрывается.

Ошибка javascript из mqttws31.js:912: «Отправлен непустой заголовок Sec-Websocket-Protocol, но ответ не получен». С Wireshark я вижу, что это правда; ответ 101 Switching Protocols содержит заголовки Upgrade, Connection и Sec-Websocket-Accept, но больше ничего.

Мой конфигурационный файл mod_websocket определяет хост, порт, тип и подпрототип так же, как и в примере Дома, и я вижу из различных операторов отладки, что запрос правильно доходит до Mosquitto.

Может ли кто-нибудь предложить, как включить заголовок Websocket-Protocol в ответ? Это должно сработать, Дом написал в блоге сообщение о том, как он это сделал!


person Doug    schedule 08.02.2014    source источник
comment
Если у вас слишком много проблем с mod_websocket, вы всегда можете просто сделать свои собственные веб-сокеты на узле, php или любом другом языке, который вы используете. github.com/esromneb/phpwebsocket   -  person benathon    schedule 08.02.2014


Ответы (2)


Я думаю, что последние версии mod_websocket сломали / удалили поддержку подпротокола, но не могу подтвердить это прямо сейчас. Вы можете попробовать более раннюю версию или использовать выделенный веб-сокет для TCP-шлюза, например WSS.

https://github.com/stylpen/WSS/

person ralight    schedule 08.02.2014
comment
WSS является хорошей рекомендацией. Используйте ветку tls, которая недавно была изменена для поддержки подпротоколов. - person jpmens; 08.02.2014
comment
Эта проблема может представлять особый интерес. - person jpmens; 08.02.2014
comment
@ralight: Вы правы насчет удаления субпрототипа. Заключение темы по этому поводу (github.com/nori0428/mod_websocket/issues/28) в mod_websocket версии 2.9 больше не было подпрототипа дескриптора. И нет необходимости обрабатывать подпрототип для режима TCP. Я не знаю, почему нет необходимости в согласовании протокола, мне это кажется довольно фундаментальным! Да, полезная темка. Вместо этого я рассмотрю использование WSS. Разве не кажется, что lighttpd/web_socket уступает MQTT другим, не поддерживая подпрототип? - person Doug; 08.02.2014
comment
Кажется действительно глупым решением убрать поддержку, но что я знаю! Это, конечно, не только вызывает проблемы для MQTT. - person ralight; 09.02.2014
comment
Я открыл вопрос на web_socket, выпуск 33, возможно, мы увидим некоторую справочную информацию От этого. - person Doug; 09.02.2014
comment
mod_websocket, а не web_socket. :-) - person Doug; 09.02.2014
comment
Я установил пакет libboost-all-dev (и его 80 зависимостей), клонировал и собрал websocketpp 0.2.x и WSS tls, написал небольшой скрипт для болтовни (потому что мой gps выбрал этот момент, чтобы умереть), запустил все и вуаля! оно работает! Мне удалось подключиться из Safari к WSS с помощью страницы клиента MQTT и подписаться на живую MQTT. обновления темы от моего болтуна, пересылаемые брокером Mosquitto через WSS и веб-сокет. Спасибо за помощь. - person Doug; 09.02.2014

Автор mod_websocket (Norio Kobota) быстро и эффективно решил эту проблему для меня, сделав обновление для mod_websocket. Исправление в настоящее время находится в ветке разработки и доступно на github. Наше обсуждение является частью ветки для mod_websocket issue 28.

Вкратце, вариант использования, который у меня есть (предварительно написанная клиентская библиотека и существующая серверная часть TCP), гораздо менее гибок, чем комбинация клиента и сервера, которую можно свернуть самостоятельно, в отношении согласования протокола во время подключения. Однако в моем случае мне не нужна какая-либо гибкость или согласование с бэкендом, поэтому mod_websocket может просто повторить предоставленную ему конфигурацию, не углубляясь в детали подпротокола.

Обновленный mod_websocket повторяет запись подпрототипа из своего файла конфигурации во время рукопожатия веб-сокета, что соответствует клиентской библиотеке MQTT.

Итак, теперь у меня есть два решения для адаптеров между клиентами веб-сокетов и бэкэндами TCP! Спасибо всем за вашу помощь.

Дуг Джонсон

person Doug    schedule 13.02.2014