10/24/2011
Socket Visual Basic .Net, conexión mediante socket VB.Net y System.Net.Sockets
Explicamos cómo conectar
dos PCs a través de Internet usando Socket, realizamos un ejemplo de
chat entre un PC servidor y sus clientes usando Microsoft Visual Basic .Net (VB.Net) y el Namespace System.Net.Sockets. Mostramos también como comparativa cómo se realizaba una conexión por Socket usando el antiguo lenguaje de programación Visual Basic 6, mediante Winsock.
- Socket de Internet.
- Conexión por socket en Visual Basic 6.0 y anteriores.
- Conexión por socket en Visual Basic .Net de Visual Studio 2010.
- AjpdSoft Socket VB.Net en funcionamiento.
- Artículos relacionados.
- Créditos.
Socket de Internet
Con Socket se designa un concepto abstracto por el
cual dos programas situados en computadoras distintas (o en la misma)
pueden intercambiar cualquier flujo de datos, generalmente de manera
fiable y ordenada.
El término socket es también usado como el nombre de una interfaz de programación de aplicaciones (API) para el stack de protocolos de Internet TCP/IP, provista usualmente por el sistema operativo.
Los sockets de Internet constituyen el mecanismo para
la entrega de paquetes de datos provenientes de la tarjeta de red a los
procesos o hilos apropiados. Un socket queda definido por un par de
direcciones IP local y remota, un protocolo de transporte y un par de números de puerto local y remoto.
Para que dos programas puedan comunicarse entre sí es necesario que se cumplan ciertos requisitos:
- Que un programa sea capaz de localizar al otro.
- Que ambos programas sean capaces de intercambiarse cualquier secuencia de octetos, es decir, datos relevantes a su finalidad.
Para ello son necesarios los tres recursos que originan el concepto de socket:
- Un protocolo de comunicaciones, que permite el intercambio de octetos.
- Un par de direcciones del protocolo de red (dirección IP, si se utiliza el protocolo TCP/IP), que identifican la computadora de origen y la remota.
- Un par de números de puerto, que identifican a un programa dentro de cada computadora.
Los sockets permiten implementar una
arquitectura cliente-servidor. La comunicación debe ser iniciada por
uno de los programas que se denomina programa "cliente". El segundo
programa espera a que otro inicie la comunicación, por este motivo se
denomina programa "servidor".
Un socket es un proceso o hilo existente en
la máquina cliente y en la máquina servidora, que sirve en última
instancia para que el programa servidor y el cliente lean y escriban
la información. Esta información será la transmitida por las
diferentes capas de red.
Conexión por socket en Visual Basic 6.0 y anteriores
Para las versiones de Visual Basic 6 y anteriores, si
queríamos desarrollar una aplicación con conexión por socket debíamos
usar el componente WinSock. Dicho componente se agregaba a Visual Basic 6 desde el menú "Proyecto" - "Componentes":
En la pestaña "Controles" buscamos "Microsoft Winsock Control 6.0":
C:/Windows/system32/MSWINSCK.OCK
lo marcamos y pulsamos "Aceptar":
Nos agregará un nuevo elemento a la paleta de componentes:
Aplicación servidor para conexión por socket con Visual Basic 6
Mostramos a continuación un ejemplo de aplicación en
Visual Basic 6 para conexión con Socket mediante Winsock, por un lado la
aplicación servidor, que tendrá este aspecto:
Una vez agregado el componente Winsock al formulario
de nuestra aplicación servidor VB6 podremos programarlo, por ejemplo,
para establecer el modo escucha de la que sería la aplicacion servidor,
agregando un botón llamado "btEscuchar" con el siguiente código:
Private Sub btEscuchar_Click() on error goto cError 'Cerrar conexiones actuales Winsock1.Close 'Puerto por el que escucharemos Winsock1.LocalPort = txtPuerto.Text 'Activamos el modo escucha Winsock1.Listen 'desplegamos un mensaje en la ventana txtLog.Text = txtLog.Text & _ "Iniciado servidor, escuchando..." & vbCrLf btDesactivarEscucha.Enabled = True btEscuchar.Enabled = False txtMensaje.Enabled = True btEnviarMensaje.Enabled = True :cSalir exit sub :cError MsgBox "Error al activar servidor: " + err.number + vbcrlf + _ " Descripción del error: " + err.description End Sub
El evento "ConnectionRequest" del componente WinSock se ejecutará cada vez que un cliente intente establecer una conexión con el servidor, podremos colocar el siguiente código:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) 'Mostrar mensaje cuando un cliente se conecte txtLog.Text = txtLog.Text & _ "Petición de conexión cliente " & requestID & vbCrLf 'Cerrar el socket Winsock1.Close 'Aceptar la conexión Winsock1.Accept requestID 'desplegamos un mensaje en la ventana txtLog.Text = txtLog.Text & "Cliente conectado: " & _ requestID & vbCrLf End Sub
Para desactivar el modo escucha y cerrar todas las conexiones actuales en el servidor agregaremos el botón "btDesactivarEscucha" con el siguiente código:
Private Sub btDesactivarEscucha_Click() 'Cerrar conexión Socket Winsock1.Close End Sub
Cuando el usuario pulse en el botón "Desactivar escucha", se ejecutará el evento "Close" del WinSock, desde este evento podremos controlar cuando el servidor deja de escuchar clientes:
Private Sub Winsock1_Close() txtLog.Text = txtLog.Text & _ "Desactivado modo escucha, no se aceptarán conexiones" & vbCrLf btDesactivarEscucha.Enabled = False btEscuchar.Enabled = True txtMensaje.Enabled = False btEnviarMensaje.Enabled = False End Sub
Para agregar un botón al formulario del servidor que envíe un mensaje al cliente conectado (btEnviarMensaje) usaremos el siguiente código:
Private Sub btEnviarMensaje_Click() Winsock1.SendData txtMensaje.Text & vbCrLf End Sub
Para mostrar los mensajes enviados por los clientes
al servidor, usaremos el evento "DataArrival" del componente WinSock,
este evento se ejecuta cada vez que se reciben datos de algún cliente
conectado:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim datosRecibidos As String 'Obtener los datos enviados por el cliente Winsock1.GetData datosRecibidos txtMensajesClientes.Text = txtMensajesClientes.Text & _ "Mensaje: " & datosRecibidos End Sub
Si se produce algún error podemos "controlarlo" con
el evento "Error" del componente "WinSock", por ejemplo podríamos
mostrar el error cuando se produzca y cerrar las conexiones:
Private Sub Winsock1_Error( _ ByVal Number As Integer, Description As String, _ ByVal Scode As Long, ByVal Source As String, _ ByVal HelpFile As String, ByVal HelpContext As Long, _ CancelDisplay As Boolean) 'Si se produce un error cerramos la conexión Winsock1.Close 'Mostramos el error MsgBox "Error con WinSock: " & Number & ": " & _ Description, vbCritical End Sub
Aplicación cliente para conexión por socket con Visual Basic 6
Para el caso de la aplicación cliente con VB6 y Winsock tendrá este aspecto:
Para realizar una conexión del equipo cliente con el
equipo servidor especificado en txtServidor y el puerto especifidaco en
txtPuerto agregaremos el siguiente código para el botón"btConectar":
Private Sub btConectar_Click() 'Asignamos la IP o hostname a Winsock Winsock1.RemoteHost = txtServidor.Text 'Asignamos el puerto a Winsock Winsock1.RemotePort = txtPuerto.Text 'Desconectamos por si acaso estaba conectado ya Winsock1.Close 'Realizamos la conexión mediante Socket al servidor y puerto Winsock1.Connect End Sub
Si la conexión se ha establecido con el equipo servidor de socket, se ejecutará el evento "Connect" de Winsock, en dicho evento podremos añadir el siguiente código:
Private Sub Winsock1_Connect() 'desplegamos un mensaje en la ventana txtLog.Text = txtLog.Text & _ "Conexión establecida con servidor " & _ txtServidor.Text & ":" & txtPuerto.Text & vbCrLf End Sub
Otro evento que programaremos, cuando se pierde la conexión del cliente con el servidor, será el "Close" de Winsock, por ejemplo podremos añadir el siguiente código a este evento:
Private Sub Winsock1_Close() txtLog.Text = txtLog.Text & _ "Desconectado de servidor" & vbCrLf End Sub
En el botón "btDesconectar" colocaremos el siguiente código, con este botón el usuario podrá desconectarse del servidor cuando lo estime pertinente:
Private Sub btDesconectar_Click() 'Cerramos la conexión con el servidor Winsock1.Close End Sub
El botón para enviar un mensaje de texto al servidor "btEnviarMensaje" tendrá el siguiente código:
Private Sub btEnviar_Click() 'Enviar txtMensaje a servidor Winsock1.SendData txtMensaje.Text & vbCrLf End Sub
Si el servidor nos envía algún mensaje, lo podremos mostrar programando el evento DataArrival del componente Winsock, con el siguiente código VB6:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim datosRecibidos As String 'Se obtienen los datos enviados por el servidor Winsock1.GetData datosRecibidos txtMensajesServidor = txtMensajesServidor.Text & _ "Servidor: " & datosRecibidos End Sub
Si se produce algún error podemos "controlarlo" con
el evento "Error" del componente "WinSock", por ejemplo podríamos
mostrar el error cuando se produzca y cerrar las conexiones:
Private Sub Winsock1_Error( _ ByVal Number As Integer, Description As String, _ ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, _ CancelDisplay As Boolean) 'Si se produce un error cerramos la conexión Winsock1.Close 'Mostramos el error MsgBox "Error con WinSock: " & Number & ": " & _ Description, vbCritical End Sub
Con los ejemplos anteriores mostramos cómo se
programaba con Visual Basic 6 y anteriores una aplicación
cliente-servidor mediante conexión por Socket. Como se puede observar
este ejemplo, con algunos retoques, puede servir para desarrollar una
aplicación de Chat. Por supuesto este tipo de conexiones entre
aplicaciones, que puede ser usada en una red LAN
o incluso a través de internet abriendo los puertos correspondientes en
los routers o cortafuegos, permite ser usada para múltiples propósitos
como por ejemplo controlar una aplicación desde otra, incluso controlar
un PC desde otro.
Tal y como lo hemos programado sólo se aceptará una
conexión por cada servidor, para permitir múltiples conexiones habría
que usar una matriz de componentes Winsock e ir creando uno nuevo por
cada conexión que se establezca. No entraremos más en detalle sobre
socket con VB6 por estar este lenguaje de programación obsoleto. A
continuación pasaremos a explicar los socket con VB.Net.
Conexión por socket en Visual Basic .Net de Visual Studio 2010
A partir de Microsoft Visual Studio .Net, Microsoft incorporó un Namespace para trabajar con Socket: System.Net.Sockets,
será este Namespace el que usemos para realizar una aplicación de
ejemplo que utilice Socket para conectar dos PCs a través de Internet o
de la red LAN y enviar mensajes de texto (o incluso enviar ficheros) entre uno y otro.
Sin duda el namespace System.Net.Sockets es
mucho más "potente" que el antiguo Winsock, proporciona más funciones,
propiedades, eventos y métodos y más eficientes. Aunque echamos de menos
que todo esto no esté implementando en un componente, lo cual
facilitaría bastante las cosas, como ocurre con la antigua versión de
Borland Delphi 6, que incluía un componente para Socket con todas las
opciones para una sencilla programación. Por ejemplo la aplicación de AjpdSoft Chat, bastante profesional, ha sido desarrollada con Delphi 6 y estos componentes (ClientSocket y ServerSocket):
También AjpdSoft Aviso cambio IP pública usa socket para conexión entre el usuario y el servidor donde se guardan las IPs. O la aplicación AjpdSoft Transferencia de ficheros que envía ficheros entre PCs mediante socket.
Volviendo a Microsoft Visual Studio .Net,
utilizaremos Visual Basic .Net VB.Net para conectar dos equipos
mediante Socket. A continuación explicaremos cómo desarrollar la
aplicación servidor y la aplicación cliente. Veremos que es un poco
"arduo" debido a que no incorpora un componente para este menester.
Aplicación servidor para conexión por socket con Visual Basic .Net
En la aplicación servidor agregaremos los siguientes componentes:
Agregaremos una clase a nuestro proyecto
AjpdSoftSocketServidor, en esta clase que llamaremos
"ClaseServidorSocket" agregaremos el código necesario para interactuar
con el Namespace System.Net.Sockets:
Imports System.Threading Imports System.Net.Sockets Imports System.Text Public Class ClaseServidorSocket 'Esta estructura permite guardar la información sobre un cliente Private Structure datosClienteConectado Public socketConexion As Socket 'Socket para mantener la conexión con cliente Public Thread As Thread 'Hilo para mantener escucha con el cliente Public UltimosDatosRecibidos As String 'Últimos datos enviados por el cliente End Structure Private tcpLsn As TcpListener 'Para realizar la escuchas de conexiones de clientes Private Clientes As New Hashtable() 'Datos de los clientes conectados Private tcpThd As Thread Private IDClienteActual As Net.IPEndPoint 'Último cliente conectado Private m_PuertoDeEscucha As String Public Event NuevaConexion(ByVal IDTerminal As Net.IPEndPoint) Public Event DatosRecibidos(ByVal IDTerminal As Net.IPEndPoint) Public Event ConexionTerminada(ByVal IDTerminal As Net.IPEndPoint) 'Propiedad para establecer el puerto por el que se realizará la escucha Property Puerto() As Integer Get Puerto = m_PuertoDeEscucha End Get Set(ByVal Value As Integer) m_PuertoDeEscucha = Value End Set End Property 'Procedimiento para establecer el servidor en modo escucha Public Sub IniciarEscucha() tcpLsn = New TcpListener(Puerto) 'Iniciar escucha tcpLsn.Start() 'Crear hilo para dejar escuchando la conexión de clientes tcpThd = New Thread(AddressOf EsperarConexionCliente) tcpThd.Start() End Sub 'Procedimiento para detener la escucha del servidor Public Sub DetenerEscucha() CerrarTodosClientes() tcpThd.Abort() tcpLsn.Stop() End Sub Public Function ObtenerDatos(ByVal IDCliente As Net.IPEndPoint) As String Dim InfoClienteSolicitado As datosClienteConectado 'Obtengo la informacion del cliente solicitado InfoClienteSolicitado = Clientes(IDCliente) ObtenerDatos = InfoClienteSolicitado.UltimosDatosRecibidos End Function 'Cierra la conexión de un cliente conectado Public Sub cerrarConexionCliente(ByVal IDCliente As Net.IPEndPoint) Dim InfoClienteActual As datosClienteConectado 'Obtener información del cliente indicado InfoClienteActual = Clientes(IDCliente) 'Cerrar conexión con cliente InfoClienteActual.socketConexion.Close() End Sub 'Cerrar todas la conexión de todos los clientes conectados Public Sub CerrarTodosClientes() Dim InfoClienteActual As datosClienteConectado 'Cerrar conexión de todos los clientes For Each InfoClienteActual In Clientes.Values Call cerrarConexionCliente(InfoClienteActual.socketConexion.RemoteEndPoint) Next End Sub 'Enviar mensaje a cliente indicado Public Sub enviarMensajeCliente(ByVal IDCliente As Net.IPEndPoint, _ ByVal Datos As String) Dim Cliente As datosClienteConectado 'Obtener información del cliente al que se enviará el mensaje Cliente = Clientes(IDCliente) 'Enviar mensaje a cliente Cliente.socketConexion.Send(Encoding.ASCII.GetBytes(Datos)) End Sub 'Enviar mensaje a todos los clientes conectados al servidor Public Sub enviarMensajeTodosClientes(ByVal Datos As String) Dim Cliente As datosClienteConectado For Each Cliente In Clientes.Values enviarMensajeCliente(Cliente.socketConexion.RemoteEndPoint, Datos) Next End Sub 'Procedimiento que inicia la espera de la conexión de un cliente 'para ello inicia un hilo (thread) Private Sub EsperarConexionCliente() Dim datosClienteActual As datosClienteConectado While True 'Se guarda la información del cliente cuando se recibe la conexión 'Quedará esperando la conexión de un nuevo cliente datosClienteActual.socketConexion = tcpLsn.AcceptSocket() 'Con el IDClienteActual se identificará al cliente conectado IDClienteActual = datosClienteActual.socketConexion.RemoteEndPoint 'Crear un hilo para que quede escuchando los mensajes del cliente datosClienteActual.Thread = New Thread(AddressOf LeerSocket) 'Agregar la información del cliente conectado al array SyncLock Me Clientes.Add(IDClienteActual, datosClienteActual) End SyncLock 'Generar evento NuevaConexion RaiseEvent NuevaConexion(IDClienteActual) 'Iniciar el hilo que escuchará los mensajes del cliente datosClienteActual.Thread.Start() End While End Sub 'Procedimiento para leer datos enviados por el cliente Private Sub LeerSocket() Dim IDReal As Net.IPEndPoint 'ID del cliente que se va a escuchar Dim Recibir() As Byte 'Array donde se guardarán los datos que lleguen Dim InfoClienteActual As datosClienteConectado 'Datos del cliente conectado Dim Ret As Integer = 0 IDReal = IDClienteActual InfoClienteActual = Clientes(IDReal) While True If InfoClienteActual.socketConexion.Connected Then Recibir = New Byte(100) {} Try 'Esperar a que lleguen un mensaje desde el cliente Ret = InfoClienteActual.socketConexion.Receive(Recibir, Recibir.Length, SocketFlags.None) If Ret > 0 Then 'Guardar mensaje recibido InfoClienteActual.UltimosDatosRecibidos = Encoding.ASCII.GetString(Recibir) Clientes(IDReal) = InfoClienteActual 'Generar el evento DatosRecibidos 'para los datos recibidos RaiseEvent DatosRecibidos(IDReal) Else 'Generar el evento ConexionTerminada 'de finalización de la conexión RaiseEvent ConexionTerminada(IDReal) Exit While End If Catch e As Exception If Not InfoClienteActual.socketConexion.Connected Then 'Generar el evento ConexionTerminada 'de finalización de la conexión RaiseEvent ConexionTerminada(IDReal) Exit While End If End Try End If End While Call CerrarThread(IDReal) End Sub 'Procedimiento para cerrar el hilo (thread) Private Sub CerrarThread(ByVal IDCliente As Net.IPEndPoint) Dim InfoClienteActual As datosClienteConectado 'Finalizar el hilo (thread) iniciado ' encargado de escuchar al cliente InfoClienteActual = Clientes(IDCliente) Try InfoClienteActual.Thread.Abort() Catch e As Exception SyncLock Me 'Eliminar el cliente del array Clientes.Remove(IDCliente) End SyncLock End Try End Sub End Class
A continuación mostramos el código completo para el
formulario de la aplicación AjpdSoft Socket VB.Net Servidor, en el
código incluimos los eventos necesarios, el botón "Escuchar", el botón
"Detener escucha" y el botón "Enviar datos":
Public Class formSocketServidor Dim WithEvents socketServidor As New ClaseServidorSocket() 'Iniciar el servidor, establecer el modo escucha 'para recibir conexión de clientes Private Sub btEscuchar_Click(sender As System.Object, e As System.EventArgs) Handles btEscuchar.Click If txtPuerto.Text <> "" Then Try socketServidor.Puerto = txtPuerto.Text socketServidor.IniciarEscucha() btEscuchar.Enabled = False txtPuerto.Enabled = False txtMensaje.Enabled = True btEnviarMensaje.Enabled = True btDetenerEscucha.Enabled = True txtMensaje.Focus() Catch err As Exception MsgBox("Se ha producido un error al intentar " & _ "establecer escucha por el puerto " & _ txtPuerto.Text & vbCrLf & vbCrLf & err.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try Else MsgBox("Debe indicar el puerto por el que establecer la escucha.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly) txtPuerto.Focus() End If End Sub 'Evento que se ejecutará cuando un nuevo cliente se conecte Private Sub socketServidor_NuevaConexion(ByVal IDTerminal As _ System.Net.IPEndPoint) Handles socketServidor.NuevaConexion txtLog.Text = txtLog.Text & vbCrLf & "Conectado cliente: " & IDTerminal.Address.ToString & ", Puerto: " & IDTerminal.Port End Sub 'Evento que se ejecutará cuando finalice la conexión de un cliente Private Sub socketServidor_ConexionTerminada(ByVal IDTerminal As _ System.Net.IPEndPoint) Handles socketServidor.ConexionTerminada txtLog.Text = txtLog.Text & vbCrLf & "Desconectado cliente: " & IDTerminal.Address.ToString & ", Puerto: " & IDTerminal.Port btEscuchar.Enabled = True txtPuerto.Enabled = True End Sub 'Evento que se ejecutará cuando se reciban datos de los clientes conectados Private Sub socketServidor_DatosRecibidos(ByVal IDTerminal As _ System.Net.IPEndPoint) Handles socketServidor.DatosRecibidos 'Datos del cliente que se conecta txtLog.Text = txtLog.Text & vbCrLf & "Cliente: " & IDTerminal.Address.ToString & ", Puerto: " & IDTerminal.Port 'Mensaje recibido del cliente txtMensajeRecibido.Text = IDTerminal.Address.ToString & " " & Now & " " & txtMensajeRecibido.Text & " " & socketServidor.ObtenerDatos(IDTerminal) End Sub 'Enviar mensaje a todos los clientes conectados Private Sub btEnviarMensaje_Click(sender As System.Object, e As System.EventArgs) Handles btEnviarMensaje.Click socketServidor.enviarMensajeTodosClientes(txtMensaje.Text) End Sub 'Detener modo escucha, no se recibirán conexiones de clientes Private Sub btDetenerEscucha_Click(sender As System.Object, e As System.EventArgs) Handles btDetenerEscucha.Click btEscuchar.Enabled = True txtPuerto.Enabled = True txtMensaje.Enabled = False btEnviarMensaje.Enabled = False btDetenerEscucha.Enabled = False Try socketServidor.DetenerEscucha() Catch err As Exception MsgBox("Error al detener la escucha:" + vbCrLf + vbCrLf + err.Message, MsgBoxStyle.Information + MsgBoxStyle.OkOnly) End Try End Sub 'Finalizamos con End para cerrar el hilo (thread) abierto Private Sub formSocketServidor_FormClosed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs) _ Handles MyBase.FormClosed End End Sub End Class
Aplicación cliente para conexión por socket con Visual Basic .Net
En la aplicación cliente agregaremos los siguientes componentes:
Agregaremos una clase a nuestro proyecto
AjpdSoftSocketCliente, en esta clase que llamaremos "ClaseClienteSocket"
agregaremos el código necesario para interactuar con el Namespace
System.Net.Sockets:
A continuación mostramos el código completo para el formulario de la aplicación AjpdSoft Socket VB.Net Servidor, en el código incluimos los eventos necesarios, el botón "Escuchar", el botón "Detener escucha" y el botón "Enviar datos":Imports System.Net.Sockets Imports System.Threading Imports System.Text Imports System.IO Public Class ClaseClienteSocket Private mensajesEnviarRecibir As Stream 'Para enviar y recibir datos del servidor Private ipServidor As String 'Dirección IP Private puertoServidor As String 'Puerto de escucha Private clienteTCP As TcpClient Private hiloMensajeServidor As Thread 'Escuchar mensajes enviados desde el servidor Public Event ConexionTerminada() Public Event DatosRecibidos(ByVal datos As String) 'Dirección IP del servidor al que nos conectaremos Public Property IP() As String Get IP = ipServidor End Get Set(ByVal Value As String) ipServidor = Value End Set End Property 'Puerto por el que realizar la conexión al servidor Public Property Puerto() As Integer Get Puerto = puertoServidor End Get Set(ByVal Value As Integer) puertoServidor = Value End Set End Property 'Procedimiento para realizar la conexión con el servidor Public Sub Conectar() clienteTCP = New TcpClient() 'Conectar con el servidor clienteTCP.Connect(IP, Puerto) mensajesEnviarRecibir = clienteTCP.GetStream() 'Crear hilo para establecer escucha de posibles mensajes 'enviados por el servidor al cliente hiloMensajeServidor = New Thread(AddressOf LeerSocket) hiloMensajeServidor.Start() End Sub 'Procedimiento para cerrar la conexión con el servidor Public Sub Desconectar() 'desconectamos del servidor clienteTCP.Close() 'abortamos el hilo (thread) hiloMensajeServidor.Abort() End Sub 'Enviar mensaje al servidor Public Sub EnviarDatos(ByVal Datos As String) Dim BufferDeEscritura() As Byte BufferDeEscritura = Encoding.ASCII.GetBytes(Datos) If Not (mensajesEnviarRecibir Is Nothing) Then mensajesEnviarRecibir.Write(BufferDeEscritura, 0, BufferDeEscritura.Length) End If End Sub Private Sub LeerSocket() Dim BufferDeLectura() As Byte While True Try BufferDeLectura = New Byte(100) {} 'Esperar a que llegue algún mensaje mensajesEnviarRecibir.Read(BufferDeLectura, 0, BufferDeLectura.Length) 'Generar evento DatosRecibidos cuando se recibien datos desde el servidor RaiseEvent DatosRecibidos(Encoding.ASCII.GetString(BufferDeLectura)) Catch e As Exception Exit While End Try End While 'Finalizar conexión y generar evento ConexionTerminada RaiseEvent ConexionTerminada() End Sub End Class
Public Class formSocketCliente Dim WithEvents socketCliente As New ClaseClienteSocket Private Sub btEnviar_Click(sender As System.Object, e As System.EventArgs) Handles btEnviar.Click Try 'Enviar mensaje al servidor socketCliente.EnviarDatos(txtMensaje.Text) Catch err As Exception MsgBox("Error al enviar mensaje al servidor." & vbCrLf & vbCrLf & err.Message) End Try End Sub 'Evento que se ejecuta cuando se reciben datos Private Sub socketCliente_DatosRecibidos( _ ByVal datos As String) Handles socketCliente.DatosRecibidos bePanel2.Text = "Recibidos datos del servidor" txtMensajeRecibido.Text = Now + " Servidor: " & datos End Sub Private Sub socketCliente_ConexionTerminada() Handles _ socketCliente.ConexionTerminada bePanel2.Text = "Conexión finalizada" txtServidor.Enabled = True txtPuerto.Enabled = True btConectar.Enabled = True btDesconectar.Enabled = False btEnviar.Enabled = False txtListaMensajes.Enabled = False bePanel1.Text = "No conectado" txtServidor.Focus() End Sub Private Sub btConectar_Click(sender As System.Object, e As System.EventArgs) Handles btConectar.Click 'Conexión del cliente con el servidor (IP ó hostname y puerto) If txtServidor.Text = "" Or txtPuerto.Text = "" Then MsgBox("Debe indicar el servidor (IP o hostname) y " _ & "el puerto al que realizar la conexión.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly) txtServidor.Focus() Else Try socketCliente.IP = txtServidor.Text socketCliente.Puerto = CInt(txtPuerto.Text) socketCliente.Conectar() txtServidor.Enabled = False txtPuerto.Enabled = False btConectar.Enabled = False btEnviar.Enabled = True txtMensaje.Enabled = True btDesconectar.Enabled = True bePanel1.Text = "Conectado" bePanel1.Text = "Conexión establecida a " & _ txtServidor.Text & ":" & txtPuerto.Text Catch err As Exception bePanel1.Text = "No conectado" MsgBox("Error al conectar al servidor " & txtServidor.Text & vbCrLf & vbCrLf & err.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End If End Sub Private Sub formSocketCliente_FormClosed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed End End Sub Private Sub btDesconectar_Click(sender As System.Object, _ e As System.EventArgs) Handles btDesconectar.Click txtServidor.Enabled = True txtPuerto.Enabled = True btConectar.Enabled = True btEnviar.Enabled = False txtMensaje.Enabled = False btDesconectar.Enabled = False Try socketCliente.Desconectar() Catch err As Exception MsgBox("Error al desconectar del servidor " & txtServidor.Text & vbCrLf & vbCrLf & err.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End Sub End Class
AjpdSoft Socket VB.Net en funcionamiento
A continuación mostramos cómo funciona la aplicación a AjpdSoft Socket VB.Net,
por un lado iniciaremos la parte Servidor, introduciremos el puerto a
usar para las conexiones (debe estar libre), en nuestro caso usaremos el
1010 y pulsaremos "Escuchar":
La aplicación Servidor quedará en modo escucha,
esperando la conexión de los clientes, si el puerto está usado ya por
otra aplicación mostrará un error, si el puerto está libre activará el
botón "Enviar a todos":
Iniciaremos la aplicación Cliente, en esta aplicación
deberemos indicar la IP o nombre de red (hostname) del equipo que tiene
la aplicación Servidor, incluso podremos establecer la conexión a
través de Internet si hemos redireccionado correctamente el puerto usado
en el router o cortafuegos. En nuestro caso usaremos la IP 127.0.0.1
debido a que la aplicación Servidor y Cliente están en el mismo equipo.
Introduciremos el mismo puerto con el que hemos activado la escucha en
el Server, el 1010 y pulsaremos "Conectar":
Si todo es correcto y el Servidor recibe la conexión, la aplicación Servidor mostrará "Conectado cliente ...":
Para enviar un mensaje al Servidor lo escribiremos en "Mensaje" y pulsaremos "Enviar":
En el Servidor se habrá recibido el mensaje enviado
por el Cliente, si queremos enviar un mensaje del servidor a todos los
clientes conectados lo escribiremos y pulsaremos en "Enviar a todos":
Los clientes conectados recibirán el mensaje enviado desde el Servidor:
Artículos relacionados
- AjpdSoft Socket VB.Net.
- AjpdSoft Envío SMS.
- Definición Socket Enciclopedia AjpdSoft.
- Cómo enviar mensajes entre aplicaciones Delphi mediante el API de Windows.
- Enviar y recibir datos mediante el protocolo UDP con Borland Delphi 6.
- AjpdSoft Inventario PCs - Código fuente Delphi.
- Cómo conectar dos equipos en red por el puerto paralelo con Windows 98 y XP.
- Insertar evento de Google Calendar con Visual Basic .Net y Google Data API.
- Descarga gratuita código fuente VB.Net AjpdSoft Insertar Evento Google Calendar.
- Crear proceso en segundo plano con barra de progreso en Visual Basic .Net VB.Net.
- Instalar Visual Studio 2010 y desarrollar aplicación con acceso a PostgreSQL.
- El control de errores en Visual Basic .Net.
- Acceso a MySQL mediante Visual Basic .Net y ODBC.
- Acceso a Oracle mediante Microsoft Visual Basic, RDO y ODBC.
- Insertar y extraer documentos en una tabla Oracle con Visual Basic 6.
- Cambiar marcadores de Word por valores del formulario de una aplicación.
- Exportar ListView a fichero CSV VB.Net.
- Función para reemplazar una cadena de texto dentro de otra - Visual Basic.
- Funciones para leer y escribir en ficheros INI VB.Net.
- Enviar y recibir faxes desde un equipo con Windows XP y un módem.
- AjpdSoft Envío EMail SSL.
- AjpdSoft Conexión BD Visual Basic .Net.
- AjpdSoft Puerto Paralelo (código fuente en Delphi).
- Artículos, manuales y trucos del Proyecto AjpdSoft sobre Microsoft Visual Studio.
- Todos los programas con código fuente en Visual Basic.
- Foro del Proyecto AjpdSoft sobre Visual Basic, Visual Studio .Net, VB.Net.
- Realizar una conexión a Internet con la placa Arduino y un módulo GPRS GSM.
Créditos
Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.
10/23/2011
Cambiar la ubicación del perfil de Mozilla Thunderbird en Linux Ubuntu
Explicamos como cambiar de ubicación el perfil de Mozilla Thunderbird en el sistema operativo GNU Linux Ubuntu 11.04 Natty Narwhal, el equivalente al archivo de datos de Microsoft Outlook,
tanto si queremos guardar los datos en una ruta difrente o si queremos
cambiar la ubicación de éstos a otra ruta. Por ejemplo por si queremos
separar los datos del correo del disco duro donde se encuentra el correo
o por ponerlo en otra ruta para hacer una copia de seguridad.
- Cambiar de ubicación el perfil de Mozilla Thunderbird en Linux Ubuntu 11.04.
- Artículos relacionados.
- Créditos.
Cambiar de ubicación el perfil de Mozilla Thunderbird en Linux Ubuntu 11.04
1. Una vez iniciado Linux accederemos a la ventana de Terminal del sitema Linux Ubuntu, desde el menú "Aplicaciones" - "Accesorios" - "Terminal" e introduciremos el siguiente comando Linux:
thunderbird -ProfileManager
2. Nos mostrará la ventana de Thunderbird - Choose User Profile, pulsaremos en el botón "Create Profile" para crear otro perfil diferente:
3. Se iniciará el asistente para crear un nuevo perfil (Create Profile Wizard), pulsaremos "Next":
Con el texto: Thunderbird stores information about yout settings and preferences in your personal profile. If you are sharing this copy of Thunderbird with other users, you can use profiles to keep each user's information separate. To do this, each user should create his or her own profile. If you are the only person using this copy of Thunderbird, you must have at least one profile. If you would like, you can create multiple profiles for yourself to store different sets of settings and preferences. For example, you may want to have separate profiles for business and personal use.
4. Introduciremos en el campo "Enter new profile
name" el nombre que va a recibir nuestro nuevo perfil, por ejemplo
"kronxito". Como podemos observar la ruta por defecto donde se va a
guardar nuestro nuevo perfil es la siguiente:
/home/kronxito/.thunderbird/wqfwbkgb.kronxitoPor lo tanto, como nuestra intención es cambiar la ruta por defecto donde se guarda el perfil de Mozilla Thunderbird, y puesto que ya existe un perfil con este nombre, nos lo indica en "A profile with name already exists. Please choose another name", pulsaremos en el botón "Choose Folder" para cambiar la ubicación del perfil por defecto:
5. Seleccionaremos la ruta donde queremos guardar los
datos de nuestro perfil y pulsaremos "Abrir". En nuestro caso la ruta
del perfil es la siguiente:
/media/datos/MIo/correo/kronxitoy como se puede observar la carpeta contiene datos debido a que anteriormente se tenía configurado un perfil que ya contiene correos, contactos etc., pero al hacer una instalación limipia de Mozilla Thunderbird es necesario indicarle la ruta donde teníamos antes nuestro perfil para no perder los datos como son el correo, calendario, contactos, etc.:
6. Ahora podremos comprobar que la ruta del perfil ha cambiado a:
/media/datos/MIo/correo/kronxitopor lo tanto pulsaremos en "Finish":
7. Seleccionaremos "kronxito" que es el perfil que
hemos generado anteriormete y pulsaremos "Start Thunderbird" y veremos
como se inicia el gestor de correo electrónico Mozilla Thunderbird, si
teníamos un perfil anteriormente creado, como es nuestro caso, nos
aparecerán los correos, contactos, etc. que teníamos anteriormente:
Artículos relacionados
- Instalar Mozilla Thunderbird 5.0 en Unbuntu 11.04.
- AjpdSoft Verificar existencia email.
- AjpdSoft Envío EMail SSL código fuente VB.Net.
- AjpdSoft Acceso Outlook - Código Fuente Delphi.
- Cuentas de email gratuitas con mi dominio y Google Apps.
- Montar un servidor de correo electrónico mail en Linux Ubuntu.
- El spam, esa gran lacra de las comunicaciones actuales.
- Nemesys de Telefónica ¿qué es? Las listas negras, Spamhaus, cómo salir de ellas.
- Cómo crear un RAID lógico en Linux Ubuntu 8.04 Hardy Heron.
- Añadir una nueva unidad de disco (disco duro) a GNU Linux Ubuntu Server.
- Cómo arrancar un equipo con un pendrive y Linux Ubuntu 9.04 Live.
- Instalar Ubuntu 11.04 Natty Narwhal con el nuevo Unity sustituyendo a GNOME .
- Restaurar GRUB2 en Linux Ubuntu 11.04 Natty Narwhal después de instalar Windows.
- Comandos Linux y ejemplos de utilización, comandos básicos GNU Linux.
- Instalar Linux Ubuntu 9.10 virtualizado con Sun VirtualBox 3.0.12.
- Cómo instalar GNU Linux Debian 5.0.7 virtualizado en VMware Workstation.
- Virtualizar en GNU Linux, instalar VirtualBox en GNU Linux Ubuntu 10.10 64 bits.
- Cómo crear una imagen de un disco duro con Clonezilla de forma gratuita free.
- Crear CD con imagen ISO con CDBurnerXP.
- Cómo instalar GNU Linux Debian 5.0.7 virtualizado en VMware Workstation.
- Artículos, manuales y trucos sobre el sistema operativo GNU Linux.
- Instalación, configuración de Samba y Swat, compartir carpeta en Linux Ubuntu.
- Recuperar contraseña del usuario administrador en Microsoft Windows 7 y XP.
- Eliminar versiones kernel antiguas en Linux Debian y Ubuntu para liberar espacio.
- Validar una dirección de E-Mail - Delphi.
- Formulario para envío de datos por email - Delphi.
Créditos
Artículo realizado íntegramente por kronxito, miembro del Proyecto AjpdSoft.
10/22/2011
Cómo conectar un pendrive a Linux Ubuntu Server 11.04 manualmente
Cómo conectar un lápiz de memoria USB o pendrive a Linux Ubuntu Server 11.04 sin modo gráfico. Explicamos los pasos necesarios para poder usar un pendrive en un sistema operativo Linux
(válido para casi cualquier distribución) sin modo gráfico. Explicamos
también cómo desmontarlo cuando ya no sea necesario y cómo formatearlo.
- Montar un lápiz de memoria USB en Linux Ubuntu Server 11.04.
- Desmontar pendrive o lápiz de memoria USB en Linux Ubuntu.
- Formatear pendrive o lápiz de memoria USB en Linux Ubuntu Server.
- Artículos relacionados.
- Créditos.
Montar un lápiz de memoria USB en Linux Ubuntu Server 11.04
Os explicamos a continuación cómo montar un lápiz de memoria USB
(pendrive) en el sistema operativo Linux Ubuntu Server. Explicamos cómo
hacerlo de forma manual pues, normalmente, en distribuciones con modo
gráfico como Ubuntu, Kubuntu, Xubuntu, Suse, Fedora, Debian, Red Hat, Oracle Enterprise Linux, etc., al conectar un lápiz de memoria suele ser detectado y montado de forma automática.
Por lo tanto vamos a explicar cómo montar un pendrive de forma manual en Linux:
1. Ejecutar el siguiente comando Linux sin el pendrive conectado, este comando nos devolverá las particiones de las unidades de disco actuales:
sudo ls /dev/sd*En nuestro caso nos devolverá, sin el pendrive conectado:/dev/sda
/dev/sda1
/dev/sda2
/dev/sda5
2. También podremos comprobar los dispositivos USB actuales del sistema con el comando Linux:
lsusbEn nuestro caso, sin el pendrive conectado, nos devuelve:Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
3. Ahora conectaremos el pendrive o lápiz de memoria al puerto USB del equipo con Linux Ubuntu Server, es posible que en la ventana donde estemos conectados muestre los datos de la conexión del USB,
para cambiar a otra ventana de terminal y poder escribir comandos
pulsaremos las teclas Alt + F2, iniciaremos sesión y así podremos
ejecutar comandos y montar la unidad.
4. Tras conectar el pendrive al PC ejecutaremos ahora el comando Linux:
lsusbAhora nos devolverá una nueva línea, la referente al pendrive conectado:Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 1199:6890 Sierra Wireless, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
5. Ejecutaremos de nuevo el comando anterior para
mostrar las unidades y particiones, veremos que aparece una nueva
correspondiente al pendrive:
sudo ls /dev/sd*En nuestro caso nos devolverá, con el pendrive conectado:/dev/sda
/dev/sda1
/dev/sda2
/dev/sda5
/dev/sdb
/dev/sdb1Como vemos, aparece el nuevo dispositivo, por un lado /dev/sdb correspondiente a la nueva unidad pendrive conectada y por otro /dev/sdb1 correspondiente a la partición de esta nueva unidad, ésta será la que usemos para montar el pendrive.
6. Si queremos obtener más datos sobre el pendrive
conectado, por ejemplo el tamaño de la partición o el sistema de
ficheros que actualmente tenga podremos ejecutar el siguiente comando Linux:
sudo fdisk /dev/sdb -lDisco /dev/sdb: 1007 MB, 1007681536 bytes
9 cabezas, 8 sectores/pista, 27335 cilindros
Unidades = cilindros de 72 * 512 = 36864 bytes
Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
Identificador de disco: 0x00000000
Dispositivo Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1 4 27336 983937+ 6 FAT16
Si no aparece en ninguna de las consultas anteriores
(lsusb, fdisk, ls) será porque Linux no ha podido cargar los drivers del
pendrive conectado, por lo tanto en este caso deberemos descargar el
paquete con el driver o controlador del lápiz de memoria y ejecutar el
siguiente comando Linux para instalarlo:
sudo dpkg -i /home/ajpdsoft/fichero_driver_pendrive
7. Crearemos una carpeta en el sistema, que será el
punto de montaje, para crear la carpeta (normalmente dentro de "media")
ejecutaremos el comando Linux:
sudo mkdir /media/lapiz
8. Ahora montaremos la unidad de memoria USB
para poder utilizarla de forma normal: copiar, eliminar, modificar y
crear ficheros y carpetas. Para montarla ejecutaremos el siguiente comando Linux:
sudo mount -t vfat /dev/sdb1 /media/lapizDonde "/dev/sdb1" será la partición del pendrive y "/media/lapiz" será el punto de montaje.
9. Podremos comprobar que el pendrive se ha montado correctamente con el comando Linux:
df -h
Ya tendremos disponible la nueva unidad en
/media/lapiz para usarla normalmente para lo que queramos. Para acceder
al pendrive ejecutaremos:
cd /media/lapiz
Desmontar pendrive o lápiz de memoria USB en Linux Ubuntu
Para desmontar una unidad de disco, en nuestro caso una unidad correspondiente a un pendrive o lápiz de memoria USB ejecutaremos el siguiente comando Linux:
sudo umount /media/lapizDonde "/media/lapiz" es el punto de montaje que hemos establecido para el pendrive.
Formatear pendrive o lápiz de memoria USB en Linux Ubuntu Server
Antes de formatear un pendrive en Linux debemos asegurarnos de que no esté montado, como mostramos aquí, si lo está lo desmontaremos como indicamos aquí.
Para formatear un pendrive, en primer lugar
comprobaremos qué unidad tiene asignada, como hemos explicado aquí, a
continuación ejecutaremos el siguiente comando Linux:
sudo mkfs.vfat /dev/sdb1Donde "vfat" será el sistema de ficheros con el que formatearemos y "/dev/sdb1" será la partición del pendrive.
Artículos relacionados
- Cómo crear un RAID lógico en Linux Ubuntu 8.04 Hardy Heron.
- Añadir una nueva unidad de disco (disco duro) a GNU Linux Ubuntu Server.
- Cómo arrancar un equipo con un pendrive y Linux Ubuntu 9.04 Live.
- Recuperación profesional avanzada de ficheros eliminados con PhotoRec.
- Instalar Ubuntu 11.04 Natty Narwhal con el nuevo Unity sustituyendo a GNOME .
- Configurar GRUB en Linux Ubuntu 8.10 con varios sistemas operativos.
- Restaurar GRUB2 en Linux Ubuntu 11.04 Natty Narwhal después de instalar Windows.
- Comandos Linux y ejemplos de utilización, comandos básicos GNU Linux.
- Instalación de Linux Ubuntu 8.04 Alpha (Hardy Heron).
- Instalar Linux Ubuntu 8.10.
- Instalar Linux Ubuntu Desktop 9.04 en un equipo con Windows Server 2003.
- Instalar Linux Ubuntu 9.04 Beta virtualizado con VMware Server 2.0.
- Instalar Linux Ubuntu Server 8.04.1.
- Instalar Linux Ubuntu 9.10 virtualizado con Sun VirtualBox 3.0.12.
- Instalar y testear Windows Server 2008 Enterprise Release Candidate.
- Cómo instalar GNU Linux Debian 5.0.7 virtualizado en VMware Workstation.
- Virtualizar en GNU Linux, instalar VirtualBox en GNU Linux Ubuntu 10.10 64 bits.
- Cómo crear una imagen de un disco duro con Clonezilla de forma gratuita free.
- Crear CD con imagen ISO con CDBurnerXP.
- Algunas opciones interesantes de la BIOS.
- Artículos, trucos, manuales del Proyecto AjpdSoft sobre Copias de Seguridad.
- Cómo instalar GNU Linux Debian 5.0.7 virtualizado en VMware Workstation.
- Instalación de Microsoft Windows 7 Ultimate virtualizado en VMware Server 2.0.1.
- Artículos, manuales y trucos sobre el sistema operativo GNU Linux.
- Instalación, configuración de Samba y Swat, compartir carpeta en Linux Ubuntu.
- Recuperar contraseña del usuario administrador en Microsoft Windows 7 y XP.
- Eliminar versiones kernel antiguas en Linux Debian y Ubuntu para liberar espacio.
Créditos
Artículo realizado íntegramente por Alonsojpd, fundador del Proyecto AjpdSoft.
10/18/2011
Realizar una conexión a Internet con la placa Arduino y un módulo GPRS GSM
Explicamos cómo realizar
una conexión a Internet, a una página web por socket mediante Arduino
UNO y un módulo GPRS/GSM. Mostramos todos los requisitos hardware y
software para realizar este proyecto de prueba con Arduino. Indicamos
cómo conectar dos Arduinos para enviar la salida serie de uno de ellos
(el que lleva el módulo GPRS/GSM) a otro.
- Requisitos para realizar conexión a Internet desde Arduino con GPRS.
- Cómo conectar el módulo GPRS a la placa Arduino UNO.
- Consideraciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS.
- Programar Arduino UNO para realizar una conexión a Internet con el módulo GPRS.
- Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet.
- Artículos relacionados.
- Créditos.
Requisitos para realizar conexión a Internet desde Arduino con GPRS
En la siguiente sección del siguiente artículo
explicamos los requisitos hardware y software necesarios para realizar
el envío de SMS con Arduino y un módulo GPRS, dichos requisitos son los
mismos que para la conexión a Internet:
Básicamente necesitaremos un Módulo GPRS (en nuestro caso usamos un GPRS Sagem Quadband Module for Arduino), una Placa Arduino UNO
y los requisitos software explicados en este otro artículo, donde
también indicamos cómo conectar Arduino al PC paso a paso y cómo enviar
programas desde el IDE de Arduino a la memoria Flash de la placa:
Cómo conectar el módulo GPRS a la placa Arduino UNO
En la siguiente sección del siguiente artículo
explicamos paso a paso cómo conectar la antena externa al módulo GPRS y
cómo conectar el módulo GPRS a la placa Arduino UNO:
Consideraciones importantes a tener en cuenta antes de enviar el programa a Arduino para usar el módulo GPRS
Hay que tener en cuenta que el módulo GPRS tiene "dos posiciones" para la conexión con Arduino:
1. Por un lado hay que indicarle al módulo GPRS cuándo está conectado al PC por el puerto USB (serie emulado), esto se hace colocando dos jumpers que incorpora en la parte superior de la siguiente forma:
2. Para probar el programa de conexión a Internet o cualquier otra tarea que hayamos programado con Arduino y el módulo GPRS deberemos desconectarlo del USB del PC y alimentarlo externamente. Además, deberemos cambiar los jumpers mencionados anteriormente a esta nueva posición:Es muy importante tener esto en cuenta, cuando queramos enviar el programa a Arduino, los dos jumpers deben estar como se indica en la imagen anterior, si no es así el Upload (envío) del programa dará error.El error que nos mostrará el IDE de desarrollo de Arduino si no hemos colocado los jumpers correctamente será:avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Si no se hace esto, cuando desconectemos Arduino del PC y lo alimentemos externamente, el módulo GPRS no funcionará.
Programar Arduino UNO para realizar una conexión a Internet con el módulo GPRS
Para realizar una conexión a Internet con la placa
Arduino UNO, insertaremos una tarjeta SIM en el módulo GPRS con la
opción de datos activa, conectaremos el módulo GPRS a la placa Arduino,
colocaremos los jumpers del módulo en su posición para conexión con PC y
conectaremos Arduino UNO al PC por el puerto USB. Una vez realizados
todos estos pasos (explicados anteriormente), abriremos el IDE de
desarrollo de Arduino y escribiremos el siguiente programa:
/* * Conexion a Internet con modulo GPRS y Arduino */ int pinActivarGPRS = 2; // pin para activar el módulo GPRS //procedimiento para activar el módulo GPRS void activarModuloGPRS() { digitalWrite(pinActivarGPRS, HIGH); delay(2000); digitalWrite(pinActivarGPRS, LOW); } void setup() { pinMode(pinActivarGPRS, OUTPUT); Serial.begin(19200); //velocidad de conexión con módulo GPRS activarModuloGPRS(); //activar el módulo GPRS delay(20000); //esperamos 20 segundos a que se active el módulo GPRS Serial.println("AT&k3"); //activa el control de flujo RTS/CTS en el modem delay(1000); Serial.print("AT+KCNXCFG=0,"); //inicia la configuración para el GPRS Serial.print(34,BYTE); Serial.print("GPRS"); //tipo de conexión Serial.print(34,BYTE); Serial.print(","); Serial.print(34,BYTE); Serial.print("gprs-service.com"); //punto de acceso Serial.print(34,BYTE); Serial.print(","); Serial.print(34,BYTE); Serial.print(""); //usuario del operador Serial.print(34,BYTE); Serial.print(","); Serial.print(34,BYTE); Serial.print("1234"); //contraseña del operador, para Simyo "1234" Serial.print(34,BYTE); Serial.println(); delay(1000); //establecer configuraciones de tiempos de espera, reintentos de conexion y demas Serial.println("AT+KCNXTIMER=0,60,2,70"); delay(1000); Serial.println("AT+KCNXPROFILE=0"); delay(1000); Serial.println("AT+CGATT=1"); //para conectarnos a la red movil del operador delay(1000); Serial.print("AT+KTCPCFG=0,0,"); //para indicar el host o IP al que nos conectaremos Serial.print(34,BYTE); Serial.print("www.ajpdsoft.com"); Serial.print(34,BYTE); Serial.println(",80"); //puerto por el que se realizará la conexión delay(1000); Serial.println("AT+KTCPCNX=1"); //para iniciar un intercambio de datos TCP delay(7000); //para envio de datos a la conexion //el 18 indica la cantidad de datos que queremos enviar "GET / HTTP/1.0\r" Serial.println("AT+KTCPSND=1,18"); delay(2000); Serial.println("GET / HTTP/1.0"); Serial.print(10,BYTE); //salto de línea Serial.print(13,BYTE); //retorno de carro Serial.print("--EOF--Pattern--"); //fin de la cadena de envio de datos delay(2000); Serial.println("AT+KTCPRCV=1,807"); //activar recepcion de datos delay(1000); Serial.println("AT+KTCPCLOSE=1,1"); //cerrar la conexion delay(1000); } void loop() { }
Como siempre, verificaremos el código pulsando en el botón "Verify" del IDE de desarrollo de Arduino:
Y lo enviaremos a la placa Arduino pulsando en "Upload":
Enviar salida serie de un Arduino a otro para comprobar resultado de la conexión a Internet
En este proyecto, para poder comprobar la placa
Arduino con el módulo GPRS GSM realiza la conexión a Internet
correctamente, deberemos conectar una segunda placa Arduino al primero
como explicamos a continuación.
Por un lado conectaremos un cable del pin TX - 1 del
Arduino sin el módulo GPRS GSM al jumper USB del módulo GPRS GSM como se
muestra en la imagen y por otro lado conectaremos un segundo cable del
pin GND del Arduino sin el módulo GPRS al ping GND del Arduino con el
módulo:
1. Vista del Arduino con el módulo GPRS GSM:2. Vista del Arduino sin el módulo GPRS:3. Vista de los dos Arduinos conectados:
Una vez conectados los dos Arduinos, conectaremos el
segundo (el que no lleva el programa ni el módulo GPRS) al PC por el
puerto USB, iniciaremos el IDE de Arduino, seleccionaremos el puerto
desde el menú "Tools" - "Serial Port":
Pulsaremos en el botón "Serial Monitor" y en la
ventana que nos mostrará debemos seleccionar la misma velocidad que
hayamos indicando en el programa para la conexión serie, en nuestro caso
19200 baud (si no hacemos esto puede que veamos caracteres raros en la
pantalla):
Ahora alimentaremos eléctricamente el Arduino con el
módulo GPRS GSM, tras unos segundos, si la conexión de los dos Arduinos
mediante los dos cables es correcta, iremos viendo la salida serie del
primer Arduino en el PC y así podremos verificar y testear el resultado
de la conexión a Internet:
Artículos relacionados
- Primer proyecto hardware con Arduino, encender un LED.
- Enviar SMS y hacer llamadas desde placa Arduino con módulo GPRS.
- Obtener temperatura y humedad con Arduino.
- Obtener temperatura con sensor SEN118A2B de cabeza de acero y Arduino.
- Tipos de memoria en el microcontrolador de Arduino, Flash, SRAM y EEPROM.
- Sensor de temperatura con Visual Studio y Delphi.
- AjpdSoft Sensor de Movimiento con WebCam - Código fuente Delphi.
- Realizar un alimentador eléctrico para un Asus EEE PC.
- Acceso a aplicaciones y al equipo con huella dactilar.
- Cómo enviar SMS desde un PC usando un módem GSM con Visual Basic .Net.
- Uno de nuestros miembros arreglando un portátil.
- AjpdSoft Puerto Paralelo Código Fuente Delphi.
- AjpdSoft Cálculo parámetros módulos fotovoltaicos.
- AjpdSoft Cálculo de los parámetros de radiación.
- Enviar y recibir faxes desde un equipo con Windows XP y un módem.
- Cómo conectar dos equipos en red por el puerto paralelo con Windows 98 y XP.
- Los pitidos (beep codes) del PC, su significado en caso de error de hardware.
- Cómo actualizar el firmware del teléfono móvil Nokia N96.
- Cómo actualizar el firmware de algunos dispositivos: routers, BIOS, etc.
- AjpdSoft Sensor de Movimiento con WebCam.
- Reparar equipo portátil averiado: al mover el monitor se apaga.
- Instalar impresoras en Active Directory, auditar impresoras.
- Mi primera aplicación Android con Eclipse en Linux, instalar Eclipse Ubuntu.
- Instalar Microsoft Windows 7 Ultimate virtualizado en VMware Server 2.0.1.
- Trucos, código fuente C++.
- Definición USB Enciclopedia AjpdSoft.
Créditos
Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft, con la inestimable colaboración de Antonio RN de RS.
Suscribirse a:
Entradas (Atom)