Нужен совет по реализации

Пономарёв
Дата: 06.06.2011 14:25:36
На данный момент существует то, что выделено на рисунке жирным:
Картинка с другого сайта.

Краткое описание:
Есть напольные объекты, информацию с которых собирают Кассеты СКН. Сервер СКН получает информацию с кассет через интерфейс RS232 по протоколу Modbus. Сервер работает по подписке. АРМ СКН подключается к серверу через сокет, передает номера кассет, которые его интересуют, сервер подписывает его на обновление информации с кассет.

Требуется реализовать веб-интерфейс к этому делу — только для просмотра.
Желательно не устанавливать посторонний софт, типа Апача, и не настраивать IIS.

Представляется следующее:
Веб-сервер нужен минималистичный — GET, HEAD, POST.
Обработчик — это урезанный аналог АРМ СКН с функционалом подписки и пересылки информации, т.е. при запросе клиента веб-сервер передает Обработчику номера кассет, обработчик аналогично АРМу подписывается на обновления, и, в случае получения информации с Сервера СКН, передает данные веб-серверу, а тот уже в свою очередь пушит их клиенту (т.н. технология COMET).

Совет нужен в плане, как все это реализовать. Indy или что-то другое для веб-сервера? Как веб-сервер может запустить exe-шник? Ведь, насколько я знаю, это совсем не дело веб-сервера, он просто обрабатывает запрос В общем, тут для меня как-то все мутно… Может есть какие-то решения подобного плана или просто советы в каком направлении смотреть. А может и структура «Веб-сервер–Обработчик» не подходит для таких целей…
_Groxot_
Дата: 06.06.2011 14:27:42
Пономарёв,

Я мучал SOAP для подобного.
Пономарёв
Дата: 06.06.2011 14:29:49
_Groxot_,
Можно подробнее?
_Groxot_
Дата: 06.06.2011 14:32:18
Пономарёв,

Соап это просто =)
_Groxot_
Дата: 06.06.2011 14:34:39
_Groxot_,

Если я правильно понял, то нужно клиетнам слушать сервис??
Так не получиться с SOAP. Если только клиенты будут постоянно спрашивать как дела?
Извиняюсь за то что не вчитывался.
Пономарёв
Дата: 06.06.2011 15:05:56
_Groxot_,
Вот и я сейчас статью прочитал и понял, что не подходит.

В моем случае желательно следующее: Клиент шлет запрос веб-серверу, в ответ получает некую View, далее сервер сам посылает данные только тогда, когда они изменяются (а это может быть несколько раз в секунду, а потом на час затишье); Клиент эти данные получает и в соответствие с ними изменят View. На клиенте это делает JavaScript.
_Groxot_
Дата: 06.06.2011 15:35:47
Пономарёв,

А как сервис будет знать всех своих клиентов???
Вот это оч интересная проблема!
a_titeev
Дата: 06.06.2011 16:08:44
Пономарёв,

раз уж ты нарисовал над стрелочками "http", то видимо представляешь под веб-интерфейсом возможность обратиться к некоему веб-приложению на веб-сервере браузером... сервер здесь ничего сам в данном случае не пошлет никогда... все что умеет браузер в данном случае - это сформировать и отправить запрос на сервер - пусть запросы и разных видов могут быть... все что умеет сервер - обработать запрос и вернуть ответ в виде какого-то сообщения или контента...

ни в коем случае не рекомендовал бы пробовать самостоятельную реализацию сервера, допустимо только в случае того, что знаешь какой конкретно клиент будет использоваться, и то намучаешься... реализация GET, HEAD, POST - дело в общем-то нетрудное, если готовое использовать, но ведь тебе наверное "нормальный" веб-интерфейс нужен... если уж так хочется delphi для всего этого использовать, то напиши isapi под IIS - собственно это и будет твоим "обработчиком", если хочешь так назвать... хотя я сам и не сторонник под сеть на delphi писать, но отговаривать не буду - пробуй...

дальше зависит от того насколько динамичны данные и требуется ли динамика на клиенте... то есть, могут быть либо статичные страницы (типа - запросили, сформировался отчет), либо можно javascript-клиента зафигачить, который через XMLHttpRequest (читай - Ajax) будет запрашивать тупо по таймеру в цикле запрашивать нужные данные и обновлять например какие-нибудь гриды в html-е или графики рисовать, т.е. сделать механизм "подписки", но по запросу...

а вот дается мне что "winsock" на картинке можно обойти - "Сервер СКН" наверняка данные куда нибудь "складирует" - оттуда сразу их бери...
a_titeev
Дата: 06.06.2011 16:29:20
как вариант - отмести иллюзии насчет поддержки разных платформ (а то там КПК нарисовал, а может это и смартфон с каким-нибудь симбианом)... тогда можно activeX сделать, а взаимодействие с сервером как угодно, хоть dataSnap заюзать, если lvl позволяет... это будет много проще, быстрее и эффективнее (с точки зрения разработки) - имхо...
Пономарёв
Дата: 07.06.2011 06:41:49
_Groxot_
А как сервис будет знать всех своих клиентов?

Примерно так:
1. На веб-сервере лежит несколько панно (строго описывающие, какие данные с каких кассет как отображать);
2. Клиент в браузере спрашивает, например, Панно2;
3. Веб-сервер отдает клиенту Панно2 — это статическое view без наложения информации об объектах — а обработчику отдает список кассет для опроса (этот список можно извлечь из панно, либо заранее сделать отдельным файлом рядышком);
4. Обработчик посылает список кассет Серверу СКН, который уже известным способом регистрирует этот список у себя, присваивает клиенту uid и начинает опрашивать требуемые кассеты;
5. Сервер СКН отправляет Обработчику uid и состояние всех кассет на момент первого запроса в виде набора байт;
6. Обработчик преобразует этот набор в json и отправляет на веб-серверу, а он — клиенту, где javascript парсит json и в соответствии с данными обновляет состояние объектов на view;
7. Далее браузер работает через ajax, посылая веб-серверу лишь uid (подключение открывается);
8. Веб-сервер передает uid обработчику, тот — Серверу СКН.
9. Сервер СКН по uid смотрит состояние кассет и, если оно изменилось, отдает обработчику лишь те данные, которые изменились;
10 Обработчик — веб-серверу, веб-сервер — клиенту (подключение закрывается);
11. Браузер формирует новый ajax-запрос (новое подключение)
12. И так далее…

При закрытии браузера посылается команда disconnect(uid), которая дает понять Серверу СКН, что подписку можно удалить.

Фишка в том, что между пунктами 7 и 10 может пройти доля секунды, а может часа два. Поэтому делать ajax-ом постоянный опрос (polling) как минимум накладно, особенно если рассматривать в перспективе, когда клиентов может стать много.

Я же хочу реализовать СОМЕТ, т.е. передачу информации по инициативе сервера.

Вот картинка одной из реализаций: