Заголовки при работе из самописного ПО

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Заголовки при работе из самописного ПО

Сообщение zidky » 19 авг 2018, 14:50

Здравствуйте!

Долго не мог понять что проверка наличия сервера по ответу "200 OK" это имеется в виду примерно:

Код: Выделить всё

HTTP/1.1 200 OK
Server: nginx/1.2.1
Connection: keep-alive
Content-Type: text/html
Accept-Ranges: bytes
Cache-Control: private
Pragma: private
Content-Length: 0


Но вот как отправить ответную команду после обнаружения входа, но уже на коммутацию выхода "21:2" - так и не разобрался. Ведь MegaD сразу отключается от сервера после "200 OK" на событие с входа. Отправлять приходится обычным GET "IP/sec/?cmd=21:2".
Разъясните, пожалуйста.

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 19 авг 2018, 15:15

И что ожидает получить функция Wdog от сервера? Какие запросы от нее обрабатывать? Имя скрипта ей обязательно? Просто не использую я скрипты, только адрес сервера по TCP.

alexsis_76
Сообщения: 1036
Зарегистрирован: 26 авг 2011, 05:09
Откуда: Забайкальский край п Оловянная

Re: Заголовки при работе из самописного ПО

Сообщение alexsis_76 » 19 авг 2018, 15:45

Разъясните, пожалуйста.
http так и работает ,нет там постоянного соединения,получил код ответа и все,соединение закрывается,если вы хотите асинхронный обмен используйте тсп.
Имя скрипта необходимо на сервере,это тот кто будет обрабатывать запросы.

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 19 авг 2018, 20:28

Использовал tcp, но без ответа с заголовками HTTP мега не принимала ответ 200 по событию датчика и оставляла открытое соединение. А TCP с заголовками и есть HTTP по мнению Wireshark. То есть я использую сейчас TCP в асинхронном режиме без указания скрипта, просто по IP сервера и работает. Но для Wdog он нужен? Он его пингует или таки что-то шлет?

Но основное в том, что не могу понять как реализовать описанный в статье простой ответ сервера на реакцию с датчика (вроде мега его ждет?), если сессия закрывается после получения ответа 200. После уже мега не принимает просто "21:2" в ответ на датчик. А если не отправить весь заголовок из первого поста, то мега висит с открытым соединением и плодит их с каждым новым событием от датчика и ничего кроме заголовка с кодом 200 ее не заставляет отключиться или выполнить команду "21:2".

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 19 авг 2018, 21:56

zidky писал(а):
19 авг 2018, 14:50
Но вот как отправить ответную команду после обнаружения входа, но уже на коммутацию выхода "21:2" - так и не разобрался.

Код: Выделить всё

HTTP/1.1 200 OK
Server: nginx/1.2.1
Connection: keep-alive
Content-Type: text/html
Accept-Ranges: bytes
Cache-Control: private
Pragma: private
Content-Length: 4

21:2

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 19 авг 2018, 22:41

Andrey_B писал(а):
19 авг 2018, 21:56
Content-Length: 4

21:2
:o Хитро, дерзко, непредсказуемо и работает. Спасибо!

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 19 авг 2018, 22:51

А какие строчки заголовка нужно обязательно передавать? Я этот заголовок откуда-то перехватил между мегад, но он может быть избыточным. И по Wdog найдете минутку разъяснить чего он ждет от сервера?

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 19 авг 2018, 22:54

Просто, предсказуемо и очевидно. Весь Интернет в части Web'а работает именно так.
Вот почему и выбран был такой формат обмена информацией как базовый. Это главное, что умеет делать абсолютно любой HTTP-сервер: выдавать какой-то конкретный, а не пустой, как в вашем первом примере, ответ (веб страницу в общем случае) на GET/POST запрос клиента.
И такой подход в случае прямого взаимодействия одного клиента и одного сервера, кстати, быстрее и оптимальнее, чем MQTT.
По поводу остального отвечу позже.

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 20 авг 2018, 11:13

zidky писал(а):
19 авг 2018, 15:15
И что ожидает получить функция Wdog от сервера? Какие запросы от нее обрабатывать? Имя скрипта ей обязательно? Просто не использую я скрипты, только адрес сервера по TCP.
Функция Wdog для проверки доступности сервера запрашивает его MAC-адрес через протокол ARP.
Сервер считается доступным, если он вернул свой MAC-адрес. Сервер считается недоступным, если в течение определенного времени ответ не пришел.
Функция Wdog не проверяет доступность HTTP-сервера. Иными словами, эта функция сработает, когда сервер "завис" или вообще отсутствует в локальной сети.

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 20 авг 2018, 13:24

После сохранения настроек Wdog отрабатывает сразу термостат pt=12&v=6362 (завышено на 40 градусов почти). Показания 12 порта сразу после этого 24,31 градуса. Нажимаю на странице настроек после сохранить еще раз Wdog без команды (отключить) и Act от входа "12" термостата выключаются (нормализуются показания). Прошивка последняя. Термометр в гильзе по паразитке на расстоянии 50см.
Команду "17:1;p10;17:0" Wdog не сохраняет, обрезает до "17".
Я чего-то очевидного не замечаю?

Alex_Jet
Сообщения: 755
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Заголовки при работе из самописного ПО

Сообщение Alex_Jet » 20 авг 2018, 13:44

В поле Wdog предполагался ввод только номера порта, который должен был включаться на несколько секунд и затем выключаться.
Задумано было для сброса питания сервера/маршрутизатора и прочего.

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 20 авг 2018, 15:20

Верно, в поле Wdog предполагается ввод номера порта, но не того, который должен переключаться, а входа, для которого прописан сценарий.
Иными словами, будет выполнен сценарий (Act) того порта, который указан в поле Wdog.
Вообще довольно определенно об этом написано здесь.
Что касается термостатов, то мысль не уловил, но изменение конфигурации всегда ведет к рестарту контроллера.

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 20 авг 2018, 15:42

zidky писал(а):
19 авг 2018, 22:51
А какие строчки заголовка нужно обязательно передавать? Я этот заголовок откуда-то перехватил между мегад, но он может быть избыточным.
Я лично не придаю большого значения заголовкам, которые формирует HTTP-сервер.
nginx делает это по-своему, Apache2 по-своему. В теории, конечно, можно сэкономить несколько десятков байт и крохи микропроцессорного времени на оптимизацию заголовков, но делать это имеет смысл для какого-то уж очень интенсивного обмена информацией. По поводу обязательности. Вам лучше обратиться к RFC 2616 (Hypertext Transfer Protocol).
В частности в описании каждого заголовка есть пометка насчет этого в виде ключевого слова.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119
Например, Content-Length обязательный ("SHOULD"), а Accept-Range - нет ("MAY").

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 21 авг 2018, 00:57

zidky писал(а):
19 авг 2018, 15:15
Имя скрипта ей обязательно? Просто не использую я скрипты, только адрес сервера по TCP.
Имя скрипта для Wdog необязательно, проверил.

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 21 авг 2018, 10:43

Имя скрипта вообще необязательное поле.
Для работы функции Wdog оно не нужно, потому что запрос отправляется по протоколу ARP.
А обращение к HTTP-серверу в этом случае делается в "корень". Какой именно файл, скрипт будет обрабатывать запрос в Apache, например, определяется директивой DirectoryIndex.

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 25 авг 2018, 18:07

Иногда ответы о срабатывании входа (реле по команде сервера замыкает контакт датчика) получается пропуск события на сервер (нет cnt=405). Наблюдается при максимальной скорости (Down - отправляется следующий запрос). Все соединения после выполнения закрыты, значит мега получила ответы на все срабатывания датчиков. Это нормально или у меня где-то ошибка?
Выдержка из лога:
GET /?pt=9&m=1&cnt=406&mdid=0 HTTP/1.1
Host: 192.168.0.99
User-Agent: megad
Accept: text/html

GET /?pt=9&m=1&cnt=404&mdid=0 HTTP/1.1
Host: 192.168.0.99
User-Agent: megad
Accept: text/html

GET /?pt=9&cnt=403&mdid=0 HTTP/1.1
Host: 192.168.0.99
User-Agent: megad
Accept: text/html

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 25 авг 2018, 21:11

Очень трудно понять ваше описание. Максимальная скорость чего? Что такое Down? Какие соединения закрыты? Какие ответы "мега" получала и от кого?
Если сервер фиксирует не каждое нажатие кнопки/выключателя, то в подавляющем большинстве случаев виной тому является сам сервер.
Как правило это бывает, когда сервер удерживает TCP-соединение вместо того, чтобы ответить контроллеру.
Эту ситуацию легко воспроизвести с помощью простого PHP-скрипта: <?php sleep(100); ?> Будут пропуски, потому что сервер, получив информацию о событии от контроллера будет в течение 100 секунд просто молчать.
Зато вот с таким скриптом <?php flush(); sleep(100); ?> пропусков не будет, потому что функция flush() заставит сервер корректно завершить HTTP-сессию.
Лог веб-сервера в этом смысле абсолютно бесполезная штука. Чтобы понять, что происходит, необходимо делать дамп сетевого трафика с помощью tcpdump или Wireshark. Там будет видно, что, кому и как передает.

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 25 авг 2018, 21:22

Down = Done 8-)
Максимальная скорость - отправка следующего из накопившихся запросов к меге от приложения сразу после получения Done от предыдущего запроса.
Какие соединения закрыты - мега подключается к моему серверу по TCP и присылает отчет об изменении входа, после получения ответа "OK 200" она сама сразу закрывает соединение. Если какое-то сообщение от меги мой сервер не обработал, то оно остается открытым (до 500 мс, под таймаут не попадает), пока другие приходят и обрабатываются. Раз все закрыты, то мега все события об изменении входа передала мне.
За совет с Wireshark спасибо, заработался.

zidky
Сообщения: 36
Зарегистрирован: 19 авг 2018, 03:42

Re: Заголовки при работе из самописного ПО

Сообщение zidky » 25 авг 2018, 22:40

Захватил дамп
1.zip
Дамп Wireshark
(13.77 КБ) 2 скачивания
Видно что выполнены все 42 команды 21:2, но вот смена состояния входа 9 приходит всего 26 раз с пропусками по счетчику порта. Это не каждый раз так, бывает все точно проходит. В настройках порта 9 Raw отмечен - не влияет ощутимо. Отправка и прием данных не асинхронный. Это ведь означает что мега почему-то не отправляет смену состояния порта, или еще остается шанс что он просто не доходит (хотя ошибок не видно вроде)?

Andrey_B
Администратор
Сообщения: 3722
Зарегистрирован: 18 мар 2011, 12:06

Re: Заголовки при работе из самописного ПО

Сообщение Andrey_B » 26 авг 2018, 09:50

Очевидного ответа по вашей ситуации при беглом просмотре в дампе не вижу.
Попытался воспроизвести проблему у себя. Запустил скрипт, который отправляет 30 пакетов с командами в секунду и который никак не синхронизирован с получением сообщений от устройства.
На входе включил Raw и попытался нажимать кнопку так быстро, как только это возможно. Максимум 8-12 событий в секунду. Ни одно из событий не потерялось. Могу прислать свой дамп, но это вряд ли чем-то поможет
Однако в качестве сервера у меня Linux/Apache. Причем между устройством и сервером аж 3 коммутатора.

Ответить