Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Servidor Web + Comunicaciones (https://www.clubdelphi.com/foros/showthread.php?t=39221)

phrodo 13-01-2007 15:15:46

Servidor Web + Comunicaciones
 
Hola amigos....

Os cuento la aplicación que quiero hacer-modificar para ver si me podeis ayudar que estoy un poco pez en desarrollo para internet.

Tengo una aplicación hecha con delphi6 que se encarga de automatizar un complejo turístico (comunicado via puerto serie con un plc de control). Me he encontrado con el problema que esta aplicación, aun operando por red perfectamente, desean hacerlo por internet.

He estado viendo por ahi y no se exactamente que herramientas utilizar, aunque me gustaria seguir con delphi. He pensado en poner un servidor que aloje la página web y siga comunicando via puerto serie (no se si esto será posible) con el autómata de control. El programa en el servidor se encargaría de las comunicaciones locales y los clientes simplemente interactuarían con el servidor para el intercambio de información.

Basicamente unas preguntas:

1.¿Se puede hacer así directamente?¿Si es asi... con que herramienta?PHP, ASP.... recordad que tiene que ser una herramienta que permita comunicaciones serie en la máquina servidor.

o bien...

2. Mantener en el servidor el programa win32 (que se encargue de las comunicaciones serie) y diseñar una interfaz web en el mismo servidor que sirva de acceso a los clientes y yo, internamente, comunicar ambos programas (el que se encargue de las comunicaciones y el servidor web) para intercambiar información (en los 2 sentidos - peticiones del usuario y resultados al usuario-)

Espero haberme explicado bien... acepto cualquier sugerencia o algo que se os ocurra, ya que voy un poco perdido. Si algo no ha quedado claro decidmelo y lo intentaria explicar mejor.

Agradezco por anticipado cualquier tipo de ayuda o comentario

un saludo,

lag_0 14-01-2007 07:58:33

Buenas..
A ver, yo también requerí varias veces de utilización de web/win y definitivamente lo mejor es mantener el servidor HTTP en el programa delphi y te diré por que:
-No sabes ni php ni ASP por lo que mencionas así que tendrias que aprender.
-Tienes que preucuparte de mantener un servidor HTTP además de tu programa.

Al modo más guarro y rapido lo más simple es que te bajes el DreamWeaver, crees las páginas y despues las metas en un memo... y desde delphi cada vez que te hagan un GET al servidor HTTP pues grabas una version de ese memo en un fichero temporal con la info. a mostrar en los sitios de la web correctos y envias esa página... es muy guarro pero simple y nunca te fallará ni dará problemas de seguridad :D

Ahora si quieres manejar usuarios sesiones y todo el royo.. aprende PHP y montas un apache... el problema es que necesitaras que delphi mantenga una base de datos actualizada con la información que necesites mostrar... puedes usar MYSQL o simplemente archivos de texto o archivos php que contengan la informción en variables de php y con un simple include las mostraras... si maneras hay mil... es pensar y se te ocurrirán infinitas...
De momento:

http://www.php.net/manual/es

phrodo 02-06-2007 14:44:36

Muchas gracias por tus consejos lag_0....

Bueno, tras mucho tiempo he retomado el tema, he leido el foro viendo las diferentes opciones, y , tras no convencerme delphi4php por la poca documentación que habia (de momento), he decidido tirar por el siguiente camino:

Me he bajado el intraweb y estoy diseñando las páginas que serán mostradas al cliente.

Por si no habia quedado claro en mi primer post, la aplicación que tengo en marcha se encarga de domotizar una vivienda. Tengo en el servidor un programa Win32 hecho en delphi 6 en el que el usuario enciende y apaga luces de su vivienda. Como el usuario deseaba hacerlo remotamente, le di la posibilidad de entrar con el Escritorio Remoto.

Eso es lo que habia hasta el momento, pero me parece una solución poco elegante. Entre otras cosas porque sólo permite un usuario simultáneamente.

La solución que he pensado idónea es mantener un programa en el servidor que se encargue de las comunicaciones (win32) y diseñar páginas web que se encarguen de la interfaz con el cliente, tal y como me comentaba el compañero lag_0.

El programa win32 y el web deben de estar permanentemente intercambiando datos en ambas direcciones.

- El win32 tiene que decirle en tiempo real al web en que estado se encuentra el interruptor de la luz (encendido o apagado) para segun el estado, mostrar una imagen u otra (jpg de interruptor encendido u apagado) y que el usuario vea el estado real.

- El web tiene que decirle al win32 cuando el usaurio hace una pulsación en un botón determinado, que el interruptor debe cambiar de estado, si está encendido se apaga, y viceversa.

El problema es que he leido como comunicar ambos "programas". El win32 y el html y no me aclaro mucho con los post y get, y os pido a quien me pueda echar una mano, una pequeña ayudita.

De momento, en la parte del programa win32 he escrito el siguiente código, ayudado leyendo varios hilos, entre otros el de automatización web de al gonzalez:

Código Delphi [-]
procedure TfrmPrincipal.Button1Click(Sender: TObject);
var
  params: TStrings;
  respuesta: string;
  estrim: TMemoryStream;
begin
  params := TStringList.Create;
  estrim := TMemoryStream.Create;
  try
    params.Add('estado1=encendido');
    IdHttp.Post('http://localhost/pruebas/index.html', params, estrim);
    estrim.WriteBuffer(#0' ', 1);
    estrim.Position := 0;
    Memo1.Lines.LoadFromStream(estrim);
  finally
    params.Free;
    estrim.free;
  end;
end;

Se que ahora en el código html deberia leer esa variable "estado1" y segun la variable mostrar una imagen (pulsador encendido) u otra (pulsador apagado)

No obstante, no termino de encontrar ningún ejemplo donde se pueda hacer eso...

Ruego a alguien que me eche una manita. ¿me recomendais que la parte del interfaz la haga en php? Estoy leyendo el manual que tan amablemente me enlazaba el compañero, y espero encontrar solución, pero he preferido postearlo aqui por si alguien estaba en un caso similar.

Muchas gracias a todos.

un saludo,

zafmanjp 04-06-2007 18:35:19

Intraweb
 
NO te compliques. Investiga y hazlo con Intraweb verás que es mas facil.

courtois 04-06-2007 22:27:01

Si lo que quieres es hacer una interface via web, ciertamente intraweb podria ser una buena opción ya que no vas a cambiar mucho el codigo de control que ya te fuinciona, unicamente modificaras la interface, otra opcion seria hacerlo en asp.net pero tendras que cambiar no solo la interface sino el codigo que usas para controlar. Ahora si el problema unicamente es controlarlo desde internet, sin importar la inteface, pues no le muevas nada a tu programa, y simplemente configurate una maquina como un servidor de terminal, ya sea terminal server o vnc server y accedes desde internet y controlas todo como siempre.

phrodo 05-06-2007 10:35:10

Gracias a todos por contestar.

En terminal server ya lo tengo, es mi solución actual... el problema es que solo permite un usuario simultáneo, ya que mi programa utiliza un puerto serie para comunicarse, y éste no permite que se abran varias instancias del programa con el puerto serie "ocupado" en ambas.

La solución que encontré fue crear una tabla de usuarios, en los que los clientes se conectaban, y si habia un usuario conectado, lo desconectaba, previo aviso, y conectaba al nuevo usuario.

No quedó mal, pero es "poco elegante".

Lo intentaré con intraweb de momento y ya os cuento como quedo. De todas formas si alguien tiene otras opciones válidas estaria encantado de leeros :)

un saludo,

phrodo 05-06-2007 10:38:38

una duda que me asalta.

¿Con intraweb puedo controlar el puerto serie (comunicaciones) o bien deberia mantener mi instancia de la aplicación original y realizar otra aplicación intraweb y comunicar ambas?

Iré haciendo pruebas de todo ello.

un saludo,

courtois 05-06-2007 23:49:51

tu conexion la haras de la misma forma en que lo hiciste, IntraWeb solo te provee la interface web, de cualquier manera, la conexion del puerto serie tendras que modificarla para que soporte la concurrencia, respecto a lo de terminal server, seguramente configuraste el escritorio remoto de XP, por eso es que no te permite usuarios simultaneos, el terminal server de windows 2003 si te soporta usuarios simultaneos y muchas mas opciones de configuración del entorno, pero de todas formas no te salvas de modificar la conexion al puerto serie para que te soporte concurrencia

phrodo 06-06-2007 10:27:12

Cita:

Empezado por courtois
tu conexion la haras de la misma forma en que lo hiciste, IntraWeb solo te provee la interface web, de cualquier manera, la conexion del puerto serie tendras que modificarla para que soporte la concurrencia, respecto a lo de terminal server, seguramente configuraste el escritorio remoto de XP, por eso es que no te permite usuarios simultaneos, el terminal server de windows 2003 si te soporta usuarios simultaneos y muchas mas opciones de configuración del entorno, pero de todas formas no te salvas de modificar la conexion al puerto serie para que te soporte concurrencia

Perdon... no me expliqué bien... el escritorio remoto lo utilizo en los clientes... en el servidor tengo configurado el terminal server y si que me soporta varios usuarios simultáneos, pero como bien dices el puerto serie solo soporta uno, con lo que pierdo funcionalidad.

Tal como lo tengo ahora pasando el proyecto a Intraweb, he conseguido realizar las comunicaciones serie en el propio ejecutable que se encarga de hacer de servidor web. Ahora, poco a poco, iré pasando las variables de estado que esta comunicación realizará para mostrarla en tiempo real a los clientes.

Seguiré posteando mis (lentos) avances en este hilo por si le pueden servir en el futuro a alguien en un caso similar.

Gracias por vuestra ayuda. Sois geniales.

un saludo,

phrodo 06-06-2007 10:31:31

Se me ha olvidado postear 2 problemas que estoy teniendo:

El puerto de comunicaciones web, lo abro en el firewall de windows xp Sp2 pero pese a ello no me permite el acceso desde otro ordenador de la misma área local. Eso se une a que pese a indicarle un puerto al servidor que configura Intraweb, sigue poniendome un puerto aleatorio en cada ejecución.

Tampoco estoy pudiendo declarar variables globales que estén disponibles para todos los clientes web que se conecten.

Seguiré indagando ;)

un saludo,

phrodo 07-07-2007 12:29:40

Bueno... voy posteando mis avances y mis dudas con Intraweb.

He conseguido la creacion de variables globales, y ya consigo que el puerto de conexión no sea aleatorio.

Tambien he conseguido ya que los clientes interactuen perfectamente con la aplicación que hace de servidor web. (Comandos de ejecución al dispositivo serie)

El problema que estoy teniendo es el siguiente. En mi aplicación necesito un refresco de pantalla para cambiar los valores de una imagen (luz encendida, luz apagada). Cuando un usuario pulsa a un botón debe visualizarse una imagen en todos los clientes como que la luz está encendida.

Para ello utilizo un temporizador que ejecuto cada cierto tiempo en cada página. Mi problema: Que el parpadeo de pantalla es evidente y a veces no es necesario (cuando nadie ha tocado nada) pero el temporizador no se deja activar o desactivar cuando me da la gana. Si no lo activo en el create de la página, ya no se ejecuta.

La solución que he pensado es que el servidor se encargue de controlar si hay cambios que visualizar en la página (esto ya lo he conseguido :o ). Si esto es así, que lance un procedimiento de refresco de pantalla (esto no lo he conseguido :( ) No he conseguido que desde el módulo "servercontroller" pueda acceder a los formularios de cada cliente y así hacer un refresco general en el PC de cada cliente.

No se si lo que he propuesto se puede hacer... pero creo que debe ser muy usual para otros casos en los que por ejemplo, haya cambios en una base de datos y se refresque la pantalla del cliente cuando otro conectado haga un cambio en esa tabla visualizada (por ejemplo) mi caso es muy similar, pero no tengo ni idea de como hacerlo. Si se pudiera hacer con tablas, tambien me serviria, puesto que no tendria más que mantener una tabla con los estados actuales de todos las luces de la instalación.

En fin, que me he enrollado y os he dormido a todos. Si podeis darme una ayudita mínima os estaria eternamente agradecido. Yo solo puedo hacer que ir posteando mis avances para que les pueda servir a otro compañero en una situación similar a la mia

un saludo y muchisimas gracias


La franja horaria es GMT +2. Ahora son las 04:46:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi