Visual Basic - Guía del Estudiante Cap. 20 APLICACIONES CLIENTE SERVIDOR COMUNICACIÓN PUERTO SERIE: EL CONTROL MSCOMM (Capítulo inacabado. ¿Algún estudiante quiere colaborar a su terminación?) Hasta ahora hemos visto aplicaciones que pueden utilizarse por sí solas. Pueden acceder a bases de datos que estén en el mismo ordenador que la aplicación o en otro, unido mediante una red de área local. La conexión a las bases de datos a las que accede se realiza, bien indicándole la dirección y carpeta (\\MiServidor\BasesdeDatos\MiBase.Mdb) o bien “mapeando” esa dirección (crear una unidad de disco que contienen esa dirección). De esta forma podemos acceder a una base de datos instalada en un equipo remoto y la aplicación debe funcionar perfectamente, aunque al abrir o leer la base de datos origine un tráfico elevado por la red de área local. Con esta configuración podemos tener problemas de lentitud, sobre todo si la red es lenta y si hay muchos usuarios trabajando con esa aplicación en distintos ordenadores, accediendo todos ellos a través de la red a un servidor que contienen la base de datos. Esta lentitud se incrementaría en una gran escala si la red a utilizar fuese Internet mediante una conexión lenta. Pero lo que más se notaría sería la ocupación de los recursos de la red durante las consultas a esa base de datos. Dependiendo de cómo se crease el recordset, podría darse el caso de transmitir por la red todos los datos de la base de datos para que nuestra aplicación utilice únicamente los datos correspondientes a un registro. Pensando en una aplicación bancaria, por ejemplo la petición de saldo de una cuenta desde un cajero automático, los únicos datos relevantes de esa operación serán el número de cuenta corriente, un código para indicar que lo que se desea es el saldo, y como datos de retorno, el número de esa cuenta, el saldo actual disponible y quizás un número de comprobación (Checksum) para comprobar que no ha existido error en la comunicación. De nada nos serviría en el cajero conocer el estado de cantidades retenidas, operaciones pendientes, etc. Si en ese ejemplo del cajero creásemos un objeto Database, un recordset, leyésemos todos los datos del recordset y luego diésemos la orden de cerrarlo, estaríamos enviando información innecesaria a través de la red, con el coste de tiempo y ocupación que ello representa. Casi llegamos a demostrar con esta introducción que sería más conveniente hacer una aplicación que tuviese dos partes: una, residente en el puesto de operación, (que llamaremos aplicación cliente) que fuese capaz de enviar datos solicitando información a otra aplicación, instalada en el servidor donde está la base de datos. Esta segunda aplicación, que llamaremos aplicación servidor, abrirá la base, creará los recordsets necesarios, filtrará la información, realizará con ella operaciones matemáticas, y una vez concluido todo el proceso, enviará a la aplicación cliente los datos estrictamente necesarios. Obviamente se necesita que ambas aplicaciones sean capaces de entenderse entre sí, es decir, que tengan un protocolo de comunicación entre ellas previamente definido. Esto es lo que se denomina una aplicación cliente – servidor. La aplicación cliente – servidor más popular es el navegador de Internet. Esta aplicación está formada por una aplicación cliente (Navegador IEXplore, NetScape, etc) y una aplicación servidor (Internet Information Server IIS, Apache, etc). El protocolo para que se comuniquen entre ellas es el protocolo Http o el Ftp. Estos protocolos al ser públicos, permiten a cualquier empresa hacer su propia aplicación cliente o servidor. No es nuestro deseo llegar a tanto. El navegador de Internet es una aplicación cliente–servidor que sobrepasa cualquier proyecto que podamos imaginar para realizarlo por medio de programación en VB. Cualquier navegador de Internet comercial lleva asociadas una serie de funciones, muchas de ellas transparentes para el usuario, que sería imposible crear una aplicación de este calibre, sobre todo como ejemplo de un curso de VB. Pensemos en una
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 1
aplicación más sencilla, que nos permita conocer como funcionan las aplicaciones cliente – servidor, y sirva además para algo útil. Esa aplicación no puede ser otra que una guía telefónica, (versión novísima del Listatel) cuya base de datos está en un servidor conectado a Internet, al que se podrá acceder desde un número ilimitado de puestos cliente. En la base de datos del servidor, en un conjunto de tablas, figurarán los nombres, números de teléfono, despacho, etc. de una serie de personas, y el organigrama de esas personas dentro de la organización. Estas tablas serán estáticas, es decir, tendrán datos que solamente se actualizarán cuando exista un cambio en esas personas, pero no variarán durante la ejecución del programa. En otra tabla, esta dinámica, tendremos el registro de los usuarios que están conectados en ese momento al servicio. Así podremos saber si un usuario está presente y de esta forma conocer un dato importante para otro servicio que va a tener este programa: su dirección IP actual. Sabiendo que está conectado y con su dirección IP podremos enviarle mensajes directamente. Creo que ya vemos que se trata de una agenda telefónica que lleva incorporado un servicio de mensajería. El servicio de mensajería enviará mensajes con texto plano o RTF y puede llevar ficheros anexados. A esta agenda, y a su protocolo de comunicación le vamos a denominar SML. No se preocupe de no conocer las siglas. Al protocolo SMTP tampoco lo conocían en el momento de su creación. Una aplicación cliente puede comportarse como aplicación servidor de otra aplicación, incluso de sí misma. Este es el caso de la aplicación cliente del SML. Cuando vamos a pedir la información de un abonado telefónico al servidor, el cliente se comporta como tal. Sin embargo cuando otro usuario de SML nos envía un mensaje, es nuestra aplicación la que realiza las funciones de servidor. Verá esto con mucha más claridad cuando comencemos el ejemplo. Toda aplicación cliente - servidor debe tener un sistema de comunicación entre la aplicación cliente y la aplicación servidor. Parece que la comunicación que ha de tener es a través de una red IP (Red de Area Local, Red Privada Virtual, Internet) pero puede ser cualquier otro sistema de comunicación entre ordenadores. Sin ir más lejos, a través del puerto de comunicación serie COM-1 ó COM-2. A efectos de los programas de la aplicación cliente o servidor solamente variará en la forma en la que reciban y transmitan los datos. En nuestro ejemplo vamos a utilizar la comunicación a través de una red IP, usando el control Winsock ya estudiado. Tanto la aplicación cliente como la aplicación servidor deberán tener un Winsock. Como en nuestro caso, según explicamos más atrás, la aplicación cliente se convierte en aplicación servidor para recibir mensajes, ésta deberá tener dos Winsocks, uno para la función cliente, y otro para la función servidor. Cuando se diseña una aplicación cliente – servidor hay que comenzar pensando en las funciones que va a realizar y sobre esas funciones comenzar a escribir el protocolo de comunicación. No es fácil tener terminado el protocolo de comunicación antes de escribir la primera línea de código del programa. Según se van concretando cada una de las acciones que debe realizar vemos que es necesario introducir nuevos códigos de operación en nuestro protocolo. No se preocupe que eso no es improvisar. Pero sí es muy importante tener las cosas claras desde el principio y saber que es lo que va a hacer nuestra aplicación para de esta forma poder saber dar respuesta correcta a cada uno de los dos programas. Y para tener las cosas claras, el autor recomienda que el protocolo de comunicación se establezca antes de comenzar a escribir el código en tanto se pueda. Y que se escriba en un documento en el propio ordenador o mejor aún, en una base de datos u hoja de cálculo, que nos permita ordenar las órdenes y avisos de nuestra aplicación para evitar de esta forma cualquier repetición involuntaria. Es muy importante a la hora de pensar el protocolo de comunicación que este no pueda inducir a error al programa. Si el programa tiene como función la transmisión de mensajes (Tal como es nuestro caso) los mensajes no pueden estar limitados ni en su longitud ni en su contenido por el formato del protocolo de comunicaciones. Se entiende mejor esto analizando el protocolo del SML (fruto únicamente de la imaginación del autor y no sujeto a normas ni recomendaciones internacionales de ningún tipo)
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 2
Protocolo de comunicación de la aplicación SML. (Vea el ANEXO 1 Protocolo de comunicación SML) La comunicación entre ambas aplicaciones se establece mediante palabras en ASCI que indican una operación. A estas palabras las denominamos Acrónimos. Las operaciones pueden ser órdenes o avisos. Son órdenes aquellas comunicaciones del cliente que desencadenan una operación en el servidor. Son avisos aquellas respuestas del servidor para enviarle datos o comunicar algo al cliente. Cada orden o aviso, puede llevar uno o varios parámetros. Los parámetros contienen la información necesaria para que la operación que se va a realizar por esa orden o aviso pueda llevarse a cabo. En esta aplicación SML los acrónimos todos son de 3 caracteres, utilizando los signos < > como delimitadores del acrónimo. Si el acrónimo lleva parámetros, la separación entre los tres caracteres y el parámetro o parámetros es la barra / Volvamos a lo comentado anteriormente respecto a la limitación del contenido de un mensaje. Si el mensaje contiene un carácter <, > ó / puede que el programa se confunda y piense que ese carácter forma parte de un acrónimo. Para evitar cualquier confusión, si uno de estos caracteres forma parte de un texto, se le antepondrá el signo &. De esta forma la recepción de la pareja de caracteres &<, &> ó &/ significa que no son parte de un acrónimo sino texto. Observe ahora que ese mismo problema lo vamos a tener con el carácter &. Si queremos enviar ese carácter, sin que haya posibilidad de error pensando que se trata del carácter & antepuesto a cualquiera de los signos anteriores, deberemos poner delante de él también el signo &. Así, && significa que se está transmitiendo el signo &. Es obvio pensar que esas tres combinaciones no pueden formar parte de ningún acrónimo. Pero como los acrónimos los definimos nosotros, basta con hacer que ninguno contenga esas secuencias de caracteres. Preocúpese de estos detalles que son los realmente importantes. Verá cuando se ponga a escribir código que siempre ha de faltar algo en el protocolo de comunicación. No se preocupe por tener que ir rectificándolo. Eso sí, mantenga siempre actualizado el documento o base de datos con el protocolo, explicando debidamente cada una de sus partes, los parámetros que lleva y la función que realiza. Es documento indispensable a la hora de distribuir la aplicación. A modo de recordatorio, los protocolos de comunicación de las aplicaciones cliente – servidor para Internet se encuentran en las RFCs, (Request For Coments) son públicas, y han tardado en desarrollarse varios años a base de continuas aportaciones y correcciones por parte de sus creadores de todo el mundo mundial. Basta con que teclee RFC en un buen buscador y le llevará a muchas páginas donde puede ver todas las recomendaciones para todos los servicios de Internet. El protocolo de comunicación debe hacerse preferentemente en ASCII puro y caracteres que tengan representación física. Esto nos permite depurar el programa analizando la comunicación mediante un programa externo y debidamente probado. Utilizar caracteres sin representación ASCII lo único que puede hacerle es complicarle la vida a Ud. y a quien analice su aplicación. Cuando se envíe una cifra, hágalo en decimal o en hexadecimal. Evite en lo posible enviar cifras sustituyendo su valor por su carácter equivalente. La mayoría de los caracteres no los va a poder representar y tendrá serios problemas para depurar su programa. Esto es especialmente importante con el cheksum de un mensaje, por ejemplo. Le recomiendo que use preferentemente numeración Hexadecimal. Un buen programador nunca oculta el protocolo de comunicación. Esto permite que otros mejoren su aplicación. Sólo los programadores mediocres temen que se les plagie. Y por supuesto, nadie debería aceptar una aplicación cliente – servidor si el programador no suministra ese protocolo.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 3
Aspectos que debe tener siempre en cuenta cuando diseñe una aplicación cliente – servidor. Si como es normal, utiliza una red IP para la transmisión de información entre ambas aplicaciones, deberá poner un Winsock en la aplicación cliente, que deberá conocer la dirección IP o el DNS de la aplicación servidor, y el puerto en el que está escuchando. En el servidor deberá poner un Winsock que estará siempre a la escucha en el puerto determinado para la aplicación, y atenderá a todas las llamadas que reciba creando una instancia de ese Winsock. Creará una instancia para cada comunicación entrante desde los clientes. La comunicación en el servidor se mantendrá abierta hasta que el cliente la cierre. Solamente en circunstancias excepcionales, cerrará la comunicación el servidor. Por ejemplo, en aquellos casos en los que pase un tiempo predeterminado sin recibir ni enviar ningún dato al cliente. Para eso se utilizará una tecnología muy sencilla, denominada Watch Dog consistente en un contador que se pone a cero cada vez que se recibe o se envían datos al cliente. Ese contador incrementa su cuenta en una unidad cada cierto tiempo. Si llega a un número predeterminado, prueba evidente de que ha pasado un tiempo sin que reciba ni envíe información, cierra la conexión del Winsock asociado. De cualquier forma hay que tener cuidado y pensar muy bien lo que se hace antes de cerrar la comunicación desde el servidor. El programa cliente debe conocer el número IP o dirección DNS del servidor. Pero el servidor no tiene porque conocer la dirección ni DNS del cliente, ya que debe ser el cliente el que inicie siempre la comunicación. Al cliente nunca se le debe forzar el puerto en el que emite (Propiedad LocalPort del Winsock). El servidor contestará siempre al cliente usando la conexión abierta por éste, es decir, usando la instancia de su Winsock correspondiente a la conexión realizada para ese cliente) Normalmente el servidor no podrá comunicar directamente con el cliente, ya que el cliente no está a la escucha. Solamente en algunas aplicaciones se le dota al cliente de otro Winsock para que sea este segundo Winsock quien esté a la escucha de una posible llamada del servidor. Esto se emplea para dar una batida por todos los clientes (Hacer Pooling) y ver los clientes que están conectados en este momento. Solamente lo he visto en algunas aplicaciones de seguridad. Generalmente este pooling se sustituye por llamadas periódicas desde cada cliente para indicarle al servidor que están activos. La comunicación entre cliente y servidor debe ser siempre TCP. El uso de UDP simplifica mucho las comunicaciones, pero no sirve para salir a Internet, donde las tramas UDP son generalmente eliminadas por los servidores. Vale más trabajar un poco más el código y trabajar con comunicaciones seguras aunque sea en una red de área local que garantice la llegada de UDP. Los paquetes broadcast deben evitarse también. Solamente deben usarse en configuraciones donde no se conocen las direcciones de los servidores. Esto ocurre cuando la red tiene asignación dinámica de direcciones. (Puede ocurrirle si usa una red VSAT) En cualquier caso, los paquetes broadcast deben evitarse en lo posible. Los servidores de Internet los eliminan automáticamente. Posiblemente haya más recomendaciones relativas a la comunicación. Veamos ahora otras recomendaciones acerca del código y de la funcionalidad. Dado que la aplicación cliente y la aplicación servidor son completamente independientes, es muy fácil realizar modificaciones en una de ellas, sobre todo en el servidor, sin que el cliente se entere. Basta para ello mantener invariable el protocolo de comunicación. Pero puede llegar el caso en el que al servidor se le hayan introducido mejoras que puede aportar al cliente si este es capaz de reconocer un nuevo protocolo. Estamos en el caso de un servidor que debe atender a dos versiones distintas de cliente. Si el cliente tiene la versión mejorada, usará con él un protocolo de comunicación que permita las nuevas prestaciones. Si el cliente tiene la versión más antigua, deberá seguir usando con él el protocolo anterior.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 4
Esto nos lleva a que el cliente siempre debe indicar al servidor su versión. Esto no ocupa unos recursos excesivos y puede ser muy útil cuando prevemos introducir una modificación. Esta práctica puede incluso servir para conocer aquellos clientes a los que hay que realizar el cambio de versión y enviarles una nueva. En el ejemplo de este curso, el cliente comunica al servidor su versión en el acto de conectarse mediante el acrónimo
. El servidor también debería enviar su versión al cliente. No está previsto en la aplicación SML pero confieso que no sobraría que al identificarse el cliente y devolverle el servidor la conformidad del registro, le devolviese también la versión del servidor. ¿Se da cuenta que según se avanza en la definición del protocolo aparecen nuevas necesidades? La aplicación cliente debe mostrar de forma clara al usuario el estado de conexión o desconexión con el servidor. Y a ser posible, que indique la causa de la no conexión (Fallo en la RAL, fallo en el servidor) Esta información se obtienen de forma muy sencilla analizando los errores generados en el Winsock a la hora de realizar la conexión. Cuando utilice el puerto COM para la comunicación, bien sea directamente o a través de módem, debe indicar claramente al usuario el estado de esa conexión, analizando la señal DSR (esta señal está activa cuando el módem está conectado, y en caso de comunicación directa, cuando se use, el Host debe poner a 1 esta señal para poder trabajar). Recuerde que la comunicación por el puerto COM es asíncrona respecto a la ejecución del programa. En el ejemplo de aplicación cliente – servidor se han ensayado también los controles avanzados de Visual Basic (Capitulo 16). La aplicación tal como se dijo es una guía telefónica, que presenta en un TreeView el organigrama del Organismo o empresa a la que pertenece la guía. Esto facilita la búsqueda de una persona, haciéndolo por departamento. La guía permite también buscar por nombre, primer apellido, segundo apellido o combinación de ambos. Una vez encontrada la persona, se cubren todos los datos de la misma, para presentarlos en la solapa de la guía propiamente dicha, y el dato de su alias (dato que define de forma única a cada usuario) aparece en la dirección de correo para poder enviarle un mensaje. Para hacer una práctica con el puerto de comunicaciones COM-1 ó COM-2 utilizaremos un módem, conectado al PC a través de uno de estos puertos, para marcar el número telefónico. Todas las operaciones de búsqueda de datos las haremos mediante consultas a la base de datos que está en el servidor. Las consultas se realizarán siguiendo el protocolo de comunicaciones. El organigrama se guardará en el cliente, en una base de datos, para evitar en lo posible el envío desde el servidor. La razón para esto es que el organigrama puede ser muy extenso, y no va a variar muy a menudo. Como esta información habría que enviarla nada más conectarse el cliente, y como puede ser bastante amplia, esto podría originar un tráfico intenso por la red, que es justamente lo que queríamos evitar. Solamente se va a enviar cuando haya cambiado. ¿Cómo sabe el cliente que ha cambiado?. ¿Cómo sabe el servidor que el cliente tiene ya la información actualizada? La idea más sencilla para conocerlo es que el cliente envíe cada vez que se registra (al comienzo de la conexión) el nombre de la revisión del organigrama que tienen. El nombre puede ser cualquiera. Lo que hace el servidor por defecto para poner el nombre a la revisión es combinar una cadena de texto con el nombre de la organización seguido de la fecha (día/mes/año) en la que se realiza la revisión. De esta forma es imposible que haya dos fichero con el mismo nombre. Al recibir ese nombre el servidor, si es igual al de la última revisión, le devuelve un OK. Si no es igual, le devuelve una instrucción para que el cliente solicite al servidor que le envíe la nueva revisión. El cliente la solicita y el servidor se la envía. Y al recibirla, el cliente reemplaza el contenido de la base de datos por los nuevos valores recibidos. Y razonando los procedimientos de esta misma forma, vamos completando el mecanismo de comunicación entre cliente y servidor, y paralelamente creando el protocolo de comunicación. Por eso es muy probable que el protocolo de comunicación no esté acabado hasta que esté acabada la aplicación. Al día de hoy (30 de Octubre de 2002) no está terminada la aplicación. Posiblemente no lo esté nunca porque sea una aplicación en continua ampliación. Esto es lo bonito de los programas ejemplo de los cursos de visual basic.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 5
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 6
ANEXO 1 SERVIDOR DE BASES DE DATOS Y MENSAJERIA LISTATEL (SML) PROTOCOLO DE COMUNICACIÓN CLIENTE – SERVIDOR La comunicación entre cliente y servidor se realizará mediante el protocolo descrito más adelante, a través de cualquier medio de comunicación. Generalmente será comunicación a través de red IP, pero esto no debe impedir que los clientes se puedan conectar al servidor a través de otros medios de comunicación, como puede ser un módem telefónico o un enlace vía satélite. En cualquier caso, el contenido de las órdenes y comandos de este protocolo será siempre en ASCII, con caracteres alfanuméricos que permitan ver perfectamente el tráfico entre ambos interlocutores. El hecho de utilizar solamente caracteres legibles asegura igualmente la comunicación a través de cualquier medio de telecomunicación, incluyendo dispositivos de cifrado on-line colocados entre cliente y servidor. La comunicación puede iniciarse tanto en el servidor como en cualquiera de los clientes. Una comunicación puede estar compuesta de: Ordenes Respuestas Confirmaciones Avisos Ordenes: Son aquellas partes de la comunicación que inician una operación en el equipo colateral. Respuestas. Son siempre respuesta a una orden, y contendrán el resultado de la operación generada por la orden, o en su defecto, la notificación de que esa orden no ha sido ejecutada o que dio resultado nulo. Confirmaciones: Son el reconocimiento de recepción de una comunicación. Pueden emplearse tanto para responder a un aviso como para confirmar que una orden se ha recibido, y que está siendo tratada. También pueden existir confirmaciones para avisar que una orden o una respuesta no ha llegado en un tiempo determinado. Avisos: Son aquellas comunicaciones que no ejecutan ninguna acción en el colateral, pero informan de algo. Por ejemplo, servidor fuera de servicio temporalmente, servidor restablecido. Pueden ser individuales, en cuyo caso generarán normalmente una confirmación, o broadcast, en cuyo caso no generarán confirmación. Formato de las tramas de comunicaciones. La trama de una comunicación estará compuesta de unos acrónimos que indicarán la orden, respuesta, confirmación o aviso que envían, dirección IP, nombre de la máquina o nombre del servidor que envía, dirección IP, nombre de la máquina o nombre del servidor destino, datos, cheksum de la trama y acrónimo de fin de trama. Cada uno de estos componentes irá metido entra los símbolos < > y su longitud puede ser variable. Cuando se envíe información, esta se colocará detrás del acrónimo que la define, separada por la barra /. Ejemplos: <SAT> Servidor Atención. Inicia una sesión de un cliente con el servidor. Dirección IP del equipo origen Dirección IP del equipo destino
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 7
Si hubiese que emplear los símbolos /, &, < o > como símbolos de la información, deberá anteponerse a cada uno de ellos el símbolo &. Por ejemplo: 25> El cheksum será el resultado de realizar la función XOR sobre todos los caracteres de los componentes de la trama, exceptuando los correspondientes precisamente a este cheksum y al fin de trama. El cheksum se indicará en decimal, con el acrónimo CHK. Por ejemplo, El acrónimo de fin de trama será <EOT> El orden de los componentes de una trama no debe ser estricto, si bien debe ir en primer lugar el acrónimo que inicie la sesión de comunicaciones, en penúltimo lugar el cheksum, y en último lugar el <EOT> Una trama puede contener varias ordenes siempre y cuando estas sean congruentes.
Cuadro con los acrónimos usados en las tramas de comunicación. <SAT>
LSB
Remote Host Conectado. Lo devuelve el servidor o un cliente cuando otro equipo se conecta a él. Servidor ATención. Inicia una sesión de comunicación desde el cliente al servidor. Cliente Atención. Inicia una sesión de comunicación desde una máquina (Servidor o cliente) a una máquina cliente. Login Cliente. Indica que el cliente desea hacer Login en ese servidor. Pasa como parámetros el alias y el password (en claro o cifrado) del cliente. LogOut de cliente. Ese cliente quiere hacer LogOut de ese servidor. Pasa como parámetros el alias y el password (en claro o cifrado) del cliente. Alias de cliente. Llevará como dato el alias de ese cliente. Alias de servidor. Llevará como dato el alias de ese servidor. Password del cliente. Lleva como parámetro el password (en claro o encriptado) del cliente IP de la máquina origen. Llevará como dato el número IP de la máquina origen de la trama. IP de la máquina destino. Llevará como dato el número IP de la máquina destino. Nombre máquina origen. Llevará como dato el nombre de la máquina dentro de la red. Nombre máquina destino. Llevará como dato el nombre de la máquina dentro de la red. Nombre Servidor origen. Llevará como dato el nombre del servidor origen. Este nombre de servidor será el nombre de un programa servidor, no el nombre de la máquina donde se alberga el programa servidor. Nombre servidor destino. Igual que el anterior. Consulta a una base de datos. Llevará como datos la consulta completa en SQL Consulta ya preprogramada en el servidor. Lleva como parámetro el nombre de esa consulta, y los datos que necesite esa consulta para su ejecución. Resultado de la consulta a la base de datos. Llevará como datos el resultado de esa consulta. Si el resultado genera varios registros, cada uno de ellos irá entre brackets ( [ ] ) Consulta de los datos del correo de un usuario. Envía como parámetro el Alias del usuario del que se quieren conocer los datos. Devuelve los datos con el acrónimo
Visual Basic Guía del Estudiante
Cap. 20
Pág. 8
<ECO>
Consulta los datos del correo de un usuario pasándole en este caso como parámetro la dirección de correo SML. Devuelve los datos con el acrónimo Consulta los datos del correo de un usuario pasándole la dirección de correo SMTP. Devuelve los datos con el acrónimo Orden de envío del mismo dato en la respuesta a esa orden. Se envía, por ejemplo, en una consulta a la base de datos, para que el cliente ubique la respuesta a esa consulta en un sitio determinado. Se emplea para devolver el mismo dato recibido con <ECO> Inicia o finaliza una operación de cifrado de datos. Lleva como parámetro INI para iniciar y FIN para terminar. En el caso de iniciar, lleva uno o dos parámetros más, el número de clave o el nombre de un usuario con clave asociada. Puede llevar dos nombres de usuario en caso que se cifre doblemente con la clave privada del remitente y la clave publica del destino, en cuyo caso se envían como dos parámetros Si el inicio no llevase parámetros de clave, el servidor entenderá que se cifra con la clave asignada en el servidor al usuario que envía
...
Datos iniciales. Son datos que se envían entre aplicaciones para su inicialización. Van del 0 al 9 . Pueden usarse en ambos sentidos. Preferentemente, DI5 como contestación a DI0, DI6 como contestación a DI1, etc.
Mensaje dirigido a todos los clientes Mensaje dirigido a todos los servidores Mensaje dirigido a todos los equipos (Clientes y servidores) Versión del programa cliente. Se envía al registrarse. Solicita la versión de software del servidor. Devuelve la versión del software del servidor. Busca IP. Se usa para comprobar que un cliente está disponible actualmente en la red. No lleva parámetros. Es la respuesta del cliente a la llamada Lleva como parámetro la dirección SML o el nombre del usuario de ese cliente. Usuario Cliente Conectado. Se devuelve cuando un cliente recibe una solicitud de conexión. Es equivalente al RHC del servidor. Información del mensaje. Número de mensaje. Es una cadena de caracteres generada por el origen, para definir el mensaje enviado. Consiste en una cadena de 4 caracteres programable por el usuario, seguida de un número que indica el año, mes, día, hora, minuto y segundo del envío, todos ellos de dos dígitos. (abcdyymmddhhnnss) Origen del mensaje (From) Lleva como parámetro la dirección SML del origen. Dirección IP desde la que se envía el mensaje. Es similar a pero solamente se utiliza al enviar un correo. Información del mensaje. Indica dirección de correo a la que se está enviando el mensaje. Lleva como parámetro la dirección SML o SMTP del destino. Información del mensaje. Indica el Asunto (Subjet) del mensaje. Lleva como parámetro el contenido del asunto. Información del mensaje. Indica el nombre del fichero Anexado enviado en el mensaje. Puede haber varios anexos dentro de un mismo mensaje, en este caso se enviarán varios grupos . Lleva como parámetro el nombre del fichero en el origen y el tamaño (en bytes) del fichero. Cheksum del fichero anexado. Lleva como parámetro 8 bytes con el cheksum en Hexadecimal. (El cheksum son 32 bits –4 bytes- expresados en hexadecimal. Si no envía cheksum, estos 8 bytes se sustituyen por la cadena YYYYZZZZ. Comienza la transmisión del anexo. No lleva parámetros. El primer carácter del anexo debe transmitirse inmediatamente después de este acrónimo.
<MN_>
<SJ_>
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 9
<EX_> <MSG>
<SAR>
<SAL>
Termina la transmisión del anexo. Este acrónimo debe enviarse inmediatamente después del ultimo carácter del anexo. Cuerpo del mensaje enviado como texto. Lleva como parámetro el texto del mensaje. cheksum del mensaje. Se envía cuando se solicita acuse de recepción o de lectura, para comprobar la exactitud de la transmisión. Se usa también para devolver el cheksum del mensaje al origen en la confirmación de recibo o lectura. Lleva como parámetro los dos bytes del checsum codificados en hexadecimal (4 caracteres). Información del mensaje. Indica que el contenido del mensaje está en formato RTF. Puede no llevar ningún parámetro, en cuyo caso indica que todo el cuerpo del mensaje está en formato RTF, o llevar le parámetro INI para indicar que comienza el formato RTF y FIN para indicar que termina. Afecta solamente al cuerpo del mensaje enviado con <MSG> Solicitado acuse de recibo. Puede llevar como parámetro una dirección de correo SML o SMTP que será en este caso a quien enviará acuse de recibo del mensaje. Si no lleva ningún parámetro enviará el acuse de recibo al origen del mensaje. El acuse de recibo implica solamente que se ha recibido el mensaje correctamente en el destino, pero no indica que se haya leído. Solicitado Aviso de Lectura. Puede llevar como parámetro una dirección SML o SMTP que será en este caso a quien se envíe el aviso de lectura del mensaje. Si no lleva parámetro se le enviará al origen del mensaje. Este aviso de lectura indica solamente que se ha abierto el mensaje, pero no puede asegurar que el usuario destino lo haya leído. Fin del mensaje. Indica que se ha transmitido todo el mensaje con todos los anexos. En caso de una transmisión de mensajes múltiples, lleva como parámetro el número del mensaje que termina. En caso de mensaje único no lleva ningún parámetro o puede llevar el número del mensaje.
Una máquina puede identificarse bien por su dirección IP o por su nombre dentro de una red. Puede también identificarse por ambos, en aquellas situaciones en las que la máquina receptora del mensaje deba retransmitirlo a otra máquina. Este es el caso, por ejemplo, de una red conectada a través de una conexión ADSL. El módem ADSL tiene asignado un número IP verdadero, y en esa red existen varias máquinas que cada una de ellas tendrá un nombre distinto, y un número IP distinto, (número IP que para estas máquinas será ya de la numeración interna) Al poder identificar una máquina por su IP y nombre, basta con poner como IP de destino el numero IP real del módem ADSL, y como nombre, el nombre de la máquina dentro de la red privada. Por ejemplo: Este mensaje devuelve el resultado de una consulta a la máquina Administracion_1 que está en la red de área local cuyo acceso desde Internet se realiza por un módem ADSL cuyo número IP es el 217.126.179.96. Lógicamente, la máquina real que recibe esta comunicación no es la máquina Administracion_1, sino otra máquina colocada en la misma red de área local, sobre la cual se ha hecho NAT desde Internet para el puerto que use este sistema, y esta máquina, una vez recibido el mensaje, lo reenvía a la máquina Administracion_1 que será quien lo trate. Si la comunicación no llevase más que el número IP, se entiende que el destino es la máquina que tiene ese número IP. ORDENES PREPROGRAMADAS Las órdenes preprogramadas son aquellas que el servidor ya tienen programadas en su código. Deben ir necesariamente tras el acrónimo ya que en caso contrario no serán tratadas.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 10
LSB
Pide / devuelve el organigrama. No lleva más parámetros Pide devuelve el nombre t Teléfono 1 de los abonados de un departamento. Se le pasa como parámetro el ID de ese departamento (Campo Ag_Departamento_ID) Pide / devuelve todos los datos de un abonado. Lleva como parámetro el ID de ese abonado. Pide / devuelve todos los datos de los abonados de un departamento. Se le pasa como parámetro el ID del departamento. Pide todos los datos de los abonados de un despacho. Se le pasa como parámetro el número de despacho. Los datos se devuelven con el acrónimo Pide todos los datos de los abonados que tienen un determinado nombre (Búsqueda aproximada por ambos lados) Se pasa como parámetro el nombre por el que se quiere buscar, o las letras del nombre por el que se va a realizar búsqueda aproximada. Devuelve los datos con el acrónimo Pide todos datos de los abonados con un determinado primer apellido (Búsqueda aproximada por la derecha) Se pasa como parámetro el apellido a buscar, o la cadena de caracteres por la que hará la búsqueda. Devuelve los datos con el acrónimo Pide todos los datos de los abonados con un determinado segundo apellido. (Búsqueda aproximada por la derecha) Se pasa como parámetro el apellido a buscar, o la cadena de caracteres por la que hará la búsqueda. Devuelve los datos con el acrónimo Pide todos los datos de los abonados con el mismo primer apellido (Búsqueda aproximada por la derecha) y segundo apellido (Búsqueda aproximada por la derecha). Se pasan como parámetros los apellidos a buscar, o las cadenas de caracteres por las que hará la búsqueda. Devuelve los datos con el acrónimo Pide todos los datos de los abonados con el mismo nombre (Búsqueda aproximada por los dos lados) y el mismo primer apellido (Búsqueda aproximada por la derecha) Se pasa como parámetro el nombre y apellido a buscar, o las cadenas de caracteres por la que hará la búsqueda. Devuelve los datos con el acrónimo Igual que el anterior, con nombre y segundo apellido.
Visual Basic Guía del Estudiante
Cap. 20
Pág. 11
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 12
EL CONTROL PERSONALIZADO MICROSOFT COMM Este control permite la comunicación de una aplicación VB con el puerto serie. Parece en principio que los puertos serie del PC se usan para muy pocas cosas. Prácticamente para conectarnos a Internet a través de un módem telefónico. Existen muchísimas aplicaciones industriales para las cuales son fundamentales los puertos COM. Las redes de área local parece que han dejado obsoletos a los puertos COM1 y COM2. No es así. Deje volar su imaginación. Vuelva a la página 4 del capítulo 2, y observe el panel de control de una radio realizado en Visual Basic. La unión entre el PC y la radio, separados muchos kilómetros, se realizó mediante el puerto COM, conectado a una línea telefónica mediante un módem. El puerto COM es el gran olvido de los informáticos… El control MSComm no está normalmente en la caja de herramientas, por lo que será necesario introducirlo mediante Proyecto | Componentes. En el formulario solamente se le ve en tiempo de diseño. El icono que lo representa en la caja de herramientas coincide con el que presenta en el formulario:
Al tratarse de un control personalizado, presenta dos formas de ver las propiedades. Si hacemos click con el botón derecho del ratón sobre el control y vamos a propiedades, nos presenta tres cuadros de configuración de los típicos de los controles personalizados. Si seleccionamos el control MSComm y pulsamos F4 , aparecerá la caja de propiedades típica de los controles VB.
PRPIEDADES Existen propiedades que pueden establecerse en tiempo de diseño o en tiempo de ejecución, y otras que solamente se pueden ejecutar o consultar en solamente en tiempo de ejecución. Se detallan a continuación las primeras. Las segundas se enumerarán tras estas, aunque se nombran algunas de estas últimas al explicar cada una de las propiedades del primer tipo. CommPort Indica el número del puerto serie usado. Admite los valores de 1 a 255. Cambiando esa propiedad podemos cambiar el puerto de comunicación que vamos a usar (Un PC tiene normalmente 2 puertos serie : El Com1 y el Com2. Puede tener sin grandes problemas Hardware hasta 4 (Com3 y Com4) Si le damos a ese valor un número de puerto inexistente, dará error. Settings Sintaxis
Velocidad, Paridad, Bits de información, Bits parada
Indica la velocidad, paridad, número de bits y bits de stop (parada) que se van a usar en la comunicación. Los valores posibles para velocidad son : Indica la velocidad en baudios. 50
100
110
300 600
1200
2400
4800
9600
14400
19200 y
28800
Los valores posibles para paridad son :
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 13
N - No envía bit de paridad ni hace comprobación de paridad en la recepción. O - Envía y comprueba paridad, con el criterio de paridad IMPAR E - Envía y comprueba paridad, con criterio de paridad PAR Los valores para el parámetro Bits de Información pueden ser : 7 - Se envían / reciben 7 bits por trama de información. 8 - Se envían / reciben 8 bits por trama de información 5 - Se envían / reciben 5 bits por trama de información. Este valor de 5 bits es el típico del sistema Baudot para transmisión telegráfica (Teletipos) que se ha conservado en las comunicaciones informáticas por pura tradición. Si se eligen 5 bits, los bits de parada se ponen automáticamente a 1,5 (Típico también del sistema Baudot.) Los valores para el parámetro Bits de parada pueden ser : 1 - Se envía un bit de parada 2 - Se envían 2 bits de parada (No es posible programar 1,5 bits de parada. Sólo lo hace cuando se bits de información y lo hace automáticamente).
programan
5
Handshaking Especifica el método de control sobre el flujo de información. En una comunicación serie se necesita conocer si el puerto puede enviar información (necesita saber si el módem está preparado para recibirla) y necesita indicarle al módem que él está preparado para recibir información. A este proceso se le denomina Handshaking. (Handshaking = Control de Flujo) (Como sabrá por sus conocimientos de inglés, Handshaking significa apretón de manos, ponerse de acuerdo. Y ponerse de acuerdo entre dos terminales que van a comunicarse es establecer las condiciones de control que uno va a tener sobre otro.) El Control de Flujo puede hacerse de dos formas : Una mediante las señales auxiliares del puerto (RTS, CTS, DSR, DTR), que son cables adicionales que tendrán una tensión positiva respecto a los 0V del equipo si esa señal está activada, o una tensión negativa si no lo está. Este tipo de control del flujo de información es el típico para comunicarse el ordenador con un módem. Existe otra forma de controlar el flujo de información : mediante señales especiales que se envían por los dos cables que transportan la información. Mediante estas dos señales podemos controlar que el ordenador envíe información o deje de enviarla. De igual forma, podemos indicarle al módem que envíe o no envíe. Estas señales especiales se denominan X-ON y XOFF. La propiedad Handshaking controla la forma de realizar este proceso. Puede tomar los siguientes valores : 0 - No existe Control de Flujo 1 - Control de Flujo mediante XON - XOFF 2 - Control de Flujo mediante Request To Send (RTS) y Clear To Send (CTS) 3 - Control de Flujo mediante XON - XOFF y RTS - CTS Los tres tipos de Control de Flujo tiene cada uno su aplicación. InBufferSize Mediante esta propiedad establecemos el tamaño del Buffer (almacén de datos) de entrada. Este Buffer sirve para poder recibir datos sin que tenga que intervenir la aplicación continuamente para controlar el puerto de entrada.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 14
Puede conocerse el número de caracteres presentes en el Buffer de entrada consultando el valor de la propiedad InBufferCount. OutBufferSize Mediante esta propiedad controlamos el tamaño del Buffer de salida. El tamaño de los Buffers dependerá de la aplicación y de la velocidad de comunicación. Si la aplicación tiene muchas cosas que hacer, aparte de controlar el puerto de comunicaciones, se deberá poner un Buffer grande. Tanto mas grande cuanta mayor sea la velocidad de transferencia de datos. Puede conocerse el número de caracteres presentes en el Buffer de salida (los que aún están por transmitir), consultando el valor de la propiedad OutBufferCount. RThreshold, SThreshold Estas dos propiedades especifican el número de caracteres que deben estar presentes en los Buffers de Recepción y Transmisión respectivamente, para que se produzca el evento OnComm relativo a recepción y transmisión de caracteres. (Eventos EvReceive y EvSend) Si el valor de una de estas propiedades está a 0, no se produce el evento OnComm correspondiente. El valor que se debe dar a estas dos propiedades depende de la aplicación y del tiempo que queramos que la aplicación está atendiendo al puerto de comunicaciones. Concretamente para la propiedad RThreshold debemos pensar muy bien el valor que se le pone. Si ponemos un valor corto (1 es el mínimo), cada vez que reciba un carácter se producirá el evento OnComm. (Vea la descripción de eventos mas adelante). Al producirse este evento, ejecutará el procedimiento asociado a él, lo que hará perder tiempo a la aplicación, impidiéndole realizar otras funciones. Si se pone un valor muy alto, el puerto no avisará que tiene caracteres recibidos hasta que reciba un número igual al programado en esta propiedad, por lo que no podremos procesar los datos recibidos hasta que el buffer tenga ese número de caracteres en su interior. En número adecuado dependerá del tipo de aplicación que vayamos a realizar. En cualquier caso, este número será inferior al número programado para la longitud del buffer, (InBufferSize) InputLen Por defecto, cuando se lee el Buffer de recepción, se leen todos los caracteres, quedando el Buffer vacío. Si se le asigna a esta propiedad un valor distinto de 0, cada vez que leamos el Buffer de recepción leerá un número de caracteres igual a esa cantidad, permaneciendo los caracteres restantes en el Buffer a la espera de una nueva lectura. Asignándole el valor 0 (Valor por defecto), el buffer se lee completo. ParityReplace Si la comunicación se realiza con bit de paridad (Par o Impar), en recepción se comprueba byte a byte la recepción de la paridad correcta. Si se recibe un Byte que no tiene paridad correcta, lo mas probable es que ese Byte (carácter) se haya recibido defectuoso. Esta propiedad nos permite sustituir un carácter que ha llegado con bit de paridad incorrecto por otro carácter. ( ? predeterminado). Se puede sustituir por una cadena de caracteres (Error, por ejemplo).
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 15
NullDiscard Cuando se recibe el carácter nulo (00000000) puede ser que no sirva para nada a efectos de nuestra aplicación, o que este carácter sea un dato mas. Esta propiedad acepta los valores True / False. Si es True se desprecia el carácter Nulo. Si es False, se toma como un carácter mas. CTSTimeout Es el tiempo (en milisegundos) que permanece esperando la señal CTS (Señal CTS Dispuesto para enviar), señal de entrada al ordenador que debe estar presente antes de que el puerto comience a enviar información. El tiempo se mide desde que se pone activa la señal de salida RTS (Petición de envío). Si se supera este tiempo entre el instante de activación de la señal RTS y la recepción de la señal CTS, se produce el evento CTSTO. Poniendo 0 en esta propiedad, se deshabilita, y en estas condiciones no se producirá nunca el evento CTSTO. CDTimeout Es el tiempo máximo de espera (en milisegundos) desde que se activa la señal DTR hasta que se recibe la señal CD (Carrier Detect - Detección de portadora). Este tiempo solamente tendrá importancia en ciertas aplicaciones donde se espere recibir CD continuamente. No tendrá sentido cuando la aplicación se queda en espera a recibir una comunicación, pero sin saber cuando la tiene que recibir. Si transcurre el tiempo programado en esta propiedad, ocurrirá el evento CDTO. Poniendo el valor 0 se deshabilita esta propiedad y no se producirá nunca el evento CDTO. DSRTimeout Similar a la anterior, pero en vez de esperar la señal CD se espera la señal DSR. Esta propiedad sí tiene sentido, ya que si, por ejemplo, estamos conectados con un módem, y nuestra aplicación se pone a la espera de recibir alguna llamada, activa la salida DTR, y espera recibir inmediatamente la respuesta de que el módem está dispuesto, mediante la línea DSR. Si transcurre el tiempo programado sin recibir la señal DSR se producirá el evento DSRTO . Poniéndola a 0, se deshabilita esta propiedad y nunca ocurrirá el evento DSRTO. RTSEnable Activa (Pone a 1) la señal RTS (Request To Send - Petición de envío) Esta señal debe ponerse a 1 para indicar al módem (o al equipo que va a recibir nuestra comunicación) que deseamos enviar datos. Debe estar activada durante toda la transmisión de datos. Cuando se pone la propiedad Handshaking a 2 (control con RTS / CTS) ó 3 (Control con RTS / CTS y con X-ON / X-OFF) no debemos preocuparnos de poner a 1 la señal RTS, pues lo hace automáticamente el puerto de comunicaciones. Esta propiedad está ahí para aplicaciones donde no se emplee ese tipo de Handshaking y necesitemos activar algo antes de transmitir. (Caso por ejemplo de transmisión de datos por radio, donde podemos usar esta señal de salida para activar el PTT (Push To Talk - Pulse para hablar) y poner el transmisor en marcha) DTREnable Activa (Pone a 1) la salida DTR (Data Terminal Ready - Terminal de Datos Listo). Esta señal se emplea para decirle al módem que el terminal (Ordenador) está preparado para recibir datos. Se hace la misma observación que para la propiedad anterior respecto a los valores de la propiedad Handshaking
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 16
Interval Indica el tiempo (en milisegundos) del intervalo entre una y otra comprobación del estado de recepción del puerto. El valor mínimo es de 55 ms. El análisis del puerto de comunicación no tiene nada que ver con la generación del evento OnComm. Este evento se producirá cuando se cumplan las condiciones para ello, independientemente del tiempo programado en esta propiedad. La comprobación del puerto cada intervalo de tiempo marcado por esta propiedad solamente afecta a averiguar el estado de las líneas auxiliares CD, DSR y CTS, y para saber el número de caracteres existentes en los Buffers de transmisión y recepción. Las siguientes propiedades no difieren en nada respecto a otros controles : Left, Name, Index, Top, Tag Propiedades propias del tiempo de ejecución PortOpen Abre el puerto de comunicación. Puede tener los valores True (Para abrirlo) y False (Para cerrarlo) Si tenemos un MSComm con Nombre (Name) MSComm1, para abrirlo ejecutaremos la siguiente sentencia : MSComm1.PortOpen = True Para cerrarlo, ejecutaremos : MSComm1.PortOpen = False InBufferCount. Nos permite averiguar cuantos caracteres tenemos en el Buffer de entrada. Con el mismo MSComm anterior, comprobaremos el número de caracteres sin leer con la sentencia : caracteressinleer = MSComm1.InBufferCount OutBufferCount Nos permite conocer cuantos caracteres quedan por transmitir en el Buffer de salida. Emplearemos la sentencia : caracteressinenviar = MSComm1.OutBufferCount
Output Envía caracteres al Buffer de salida. Debe existir un signo igual ( = ) entre Output y lo que se envía al Buffer. Para enviar la frase Curso de Visual Basic ejecutaremos la sentencia : MSComm1.Output = “Curso de Visual Basic” Si deseamos enviar el contenido de una variable MSComm1.Output = variable
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 17
Input Lee el Buffer de recepción. El número de caracteres leídos dependerá del valor de la propiedad InputLen. Cuando la propiedad InputLen tiene el valor 0, el Buffer se lee completo. Si InputLen tiene un valor distinto de 0, se leerá un número de caracteres igual al valor de esta propiedad. CommEvent Devuelve el evento mas reciente que ha ocurrido para generar el evento general OnComm (Vea mas adelante). Esta propiedad no está disponible en tiempo de diseño y es de sólo lectura en tiempo de ejecución. Sintaxis
NombredelMSComm.CommEvent
Break Devuelve un valor (True / False) que indica que se ha recibido la señal Break. variable = MSComm1.Break CDHolding Devuelve el estado de la línea de control CD (Detección de Portadora) Si es True, esa entrada está activada, si es False, la entrada está desactivada. variable = MSComm1.CDHolding CTSHolding Devuelve el estado de la línea de control CTS (Dispuesto para enviar) Si es True, esa entrada está activada, si es False, la entrada está desactivada. variable = MSComm1.CTSHolding DSRHolding Devuelve el estado de la línea de control DSR (Data Set Ready ) Si es True, esa entrada está activada, si es False, la entrada está desactivada. variable = MSComm1.DSRHolding
EVENTOS DEL MSComm El MSComm tiene varios eventos, pero un solo Procedimiento : el Procedimiento OnComm. Este procedimiento se ejecuta cada vez que se produce alguno de los eventos del MSComm. Esto quiere decir que para escribir el código apropiado en el procedimiento del MSComm será necesario analizar qué evento se ha producido y colocar, mediante una sentencia If .. Then el código apropiado para cada uno de los eventos que se produzcan. Para averiguar qué evento se ha producido puede hacerse consultando el valor de la propiedad CommEvent. (Se toma como nombre del MsComm el de MsComm1) If
MsComm1.CommEvent = ComEvRing Then
'Se ha consultado si el evento particular que ha producido el evento general OnComm 'ha sido el ComEvRing (Se está recibiendo la llamada del teléfono). En esta sentencia
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 18
‘If Then deberemos colocar el código necesario para que la aplicación se prepare para ‘recibir una comunicación a través del módem. End If Los eventos del Comm pueden identificarse por una constante o un número. La constante, como todas las de Visual Basic, tiene una expresión bastante difícil. Se pone entre paréntesis el número que identifica a ese evento. Este número debe declararse como Integer. Se ejecutará el Procedimiento OnComm cuando ocurra alguno de los siguientes eventos : ComEvCD
(5)
Cambio en la línea CD. Para conocer el estado actual de esa línea (Activado/Desactivado) deberemos invocar la propiedad CDHolding
ComEvCTS
(3)
Cambio en la línea CTS. Igual que la anterior, este evento solamente nos indica que ha existido un cambio. Para averiguar el estado en que se encuentra esta línea, debemos invocar la propiedad CTSHolding
ComEvDSR
(4)
Cambio en la línea DSR. Igual que las anteriores. Debemos invocar la propiedad DSRHolding para averiguar su estado actual.
ComEvRing
(6)
Cambio en la línea de detección de llamada (Ring). Este evento se produce cuando hay un cambio en la línea Ring (Detección de llamada en el módem) No existe una propiedad para averiguar el estado de la línea Ring pues no es necesario. Lo importante de esta línea es que está cambiando, es decir, el teléfono está sonando y poco importa que analicemos si la línea Ring está a 1 o a 0, pues toda llamada telefónica es intermitente. Dependiendo de la UART de su PC, puede que este evento no lo soporte.
ComEvReceive( 2 )
Cuando se recibe un número igual o mayor de caracteres que el indicado en la Propiedad RThreshold
ComEvSend
(1)
Cuando quedan en el búfer de transmisión menos caracteres que los indicados en la Propiedad SThreshold
ComEvEOF
(7)
Recibido un carácter de fin de archivo (carácter ASCII 26) .
comEventBreak (1001)
Se ha recibido una señal de interrupción. (Break)
ComEventCDTO (1007) Tiempo de espera de Detección de portadora. La línea Detección de portadora (CD) estuvo baja durante el periodo de tiempo especificado en la Propiedad CDTimeout, mientras se intentaba transmitir un carácter. ComEventCTSTO
1002 Tiempo de espera de Preparado para enviar. La línea Preparado para enviar (CTS) estuvo baja durante el periodo de tiempo especificado en la propiedad CTSTimeout mientras se intentaba transmitir un carácter.
ComEventDSRTO
1003 Tiempo de espera de Equipo de datos preparado. La línea Equipo de datos preparado (DSR) estuvo baja durante el periodo de tiempo especificado en la Propiedad DSRTimeout mientras se intentaba transmitir un carácter.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 19
ComEventOverrun
1006 Se sobrepasó la capacidad del Buffer de entrada sin haber leído todos los caracteres. Los caracteres no leídos se han perdido. Debemos aprovechar este evento para solicitar al colateral una repetición de los datos perdidos.
ComEventRxOver
1008 Desbordamiento del búfer de recepción. No hay espacio para más datos en el búfer de recepción.
ComEventRxParity
1009 Error de paridad. El hardware ha detectado un error de paridad.
ComEventTxFull
1010 Búfer de transmisión lleno. El búfer de transmisión estaba lleno cuando se ha intentado agregar un carácter a la cola de transmisión. Este error es fácil de evitar, analizando el valor de la propiedad OutBufferCount antes de enviar mas datos al buffer de salida.
ComEventDCB
1011 Error inesperado al recuperar el Bloque de control de dispositivos (DCB) para el puerto.
ComEventFrame
1004
LSB
Error de trama. El hardware ha detectado un error de trama.
Visual Basic Guía del Estudiante
Cap. 20
Pág. 20
NOTA ADICIONAL
El puerto de comunicaciones.
El puerto de comunicaciones de un PC está formado por varias entradas / salidas. El soporte físico es un conector tipo Sub-D de 9 ó 25 contactos, macho en ambas versiones. Se necesita por tanto un cable con conector Sub-D hembra de 9 o 25 pines para acceder a él. La distribución de las señales en cada uno de sus pines es la siguiente : GND
(Potencial de 0 V.).
TxD
Transmisión de datos. Es una salida del ordenador. Por ella salen los datos en serie.
RxD
Recepción de datos. Es una entrada del ordenador. Por ella entran los datos en serie.
RTS
Request To Send. Petición de envío. Es una salida del ordenador. El ordenador pone a 1 esta señal cuando quiere enviar datos.
CTS
Clear To Send. Dispuesto para enviar. Es una entrada del ordenador. Si está a 1 significa que el ordenador puede enviar datos pues el módem (o el dispositivo que vaya a recibirlos) está preparado para hacerlo.
DSR
Data Set Ready. Dispositivo de datos preparado. Es una entrada del ordenador. Le indica que el módem está encendido y listo para funcionar.
DCD o CD Carrier Detect. Detección de portadora. Es una entrada del ordenador. Le indica al ordenador que el módem está detectado señal de audio (tonos) válida. DTR
Data Terminal Ready. Terminal de datos listo. Es una salida del ordenador. Indica que está listo para trabajar. Suele emplearse para indicar al módem que el ordenador está dispuesto para recibir información.
Otra señal (disponible sólo en los ordenadores que tengan conector de 25 pines, y no en todos) es la señal RING (timbre del teléfono) Es una entrada del ordenador. Le indica que está sonando el timbre de la línea telefónica del módem. Disposición de los pines en el ordenador Dependiendo de si tiene conector de 9 pines o de 25, la distribución de estas señales físicamente en el conector es : Conector de 9 pines Pin 3 2 7 8 6 5 1 4
Conector de 25 pines Señal TxD RxD RTS CTS DSR GND CD DTR RING Tierra de protección
Pin 2 3 4 5 6 7 8 20 22 1
(La señal RING no está disponible en el conector de 9 pines. La detección del Ring del teléfono se realiza directamente por la línea RxD. El módem envía la palabra RING cuando suena el timbre del teléfono. La tierra de protección tampoco se usa en este conector.
LSB
Visual Basic Guía del Estudiante
Cap. 20
Pág. 21