Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Net
Explicamos paso a paso cmo desarrollar una aplicacin informtica para enviar un SMS (mensaje de texto por mvil) usando como lenguaje de programacin Microsoft Visual Bascic .Net 2010, el componente SerialPort y un mdem GSM conectado al PC mediante puerto serie (COM). Mostramos cmo enviar comandos AT (Hayes) y cmo obtener la respuesta del mdem.
Conjunto de comandos Hayes, Comandos AT. Requisitos para dotar a nuestras aplicaciones de la opcin de envo de SMS desde el PC con mdem GSM. Mtodos para obtener los resultados devueltos por el puerto serie. o Mtodo simple. o Mtodo Complejo. Desarrollar aplicacin en Visual Basic .Net para envo de SMS mediante puerto serie y mdem GSM. La aplicacin AjpdSoft Envo de SMS por GSM en funcionamiento. Uso de envo de SMS por mdem GSM desde PC. Artculos relacionados. Crditos.
comunicacin pueda comunicarse con el mdem. El lenguaje ms extendido de comandos para mdems es el de los comandos Hayes o AT. Los comandos Hayes se dividen en dos grandes tipos: 1. De ejecucin de acciones inmediatas: ATD marcacin, ATA contestacin, ATH desconexin, ... 2. De configuracin de algn parmetro del mdem: ATV define cmo responde el mdem tras la ejecucin de un parmetro, ATE selecciona el eco local, ... Como ya hemos comentado, la mayora de los comandos Hayes empieza con la secuencia AT, con la excepcin del comando A/ que repite el ltimo comando introducido y tambin la secuencia triple del carcter de escape. El resto de los comandos van a continuacin de la secuencia AT, con las letras del alfabeto. Adems, muchos de ellos necesitan a continuacin un valor numrico, que en el caso de que no se introduzca se tomar como que dicho valor es cero. Por ejemplo, la funcin ECO permite que el mdem enve a la terminal el mismo carcter que recibe de ella. De esta forma el operador de la terminal puede visualizar en pantalla lo que le est enviando al mdem. La secuencia ATE1 activa esta funcin y la ATE0 ATE (al no escribir el valor numrico el mdem lo toma como que es cero) la desactiva. A media que se fueron requiriendo ms funciones en los mdems se fueron agregando nuevos comandos AT. A estos comandos se los llama extendidos y tienen la forma AT&X donde & indica que el comando X es extendido. As mismo cada fabricante introdujo otros comandos que no fueron estndares y cumplan funciones especficas para sus dispositivos. Por lo tanto no todos los mdems responden a estos comandos. En resumen, a los comandos Hayes se los puede dividir en 4 grupos: 1. Bsicos (AT...): estos comandos fueron los que inicialmente se definieron y cumplen funciones elementales. 2. De registro (ATSi=, ATSi?): modifican los valores de los registros internos del mdem solicitan sus valores. 3. Extendidos (AT&...): comandos adicionales que se agregaron posteriormente a las definiciones de los comandos bsicos. Generalmente cumplen funciones un poco ms complejas que los bsicos. 4. Propietarios (AT/...): definidos por el fabricante del dispositivo. Ante cualquier comando AT enviado al mdem, ste responde con el resultado de la operacin: OK, ERROR, CONNECT, etc. El operador de la terminal puede elegir que el resultado, en vez de aparecer en forma alfabtica, aparezca de forma numrica donde cada nmero corresponde a una respuesta en particular. Por ejemplo OK tiene por valor cero. El comando para elegir la forma de la respuesta es ATV donde ATV1 activa la respuesta alfabtica y ATV0 la numrica. Esta ltima forma es til cuando es un programa y no un usuario el que est comunicndose con el mdem y necesita de un valor numrico para comparar y tomar una accin determinada segn el resultado. Algunos comandos Hayes AT y su significado, normalmente usados en mdem GSM con tarjeta SIM para envo y recepcin de SMS: AT: devuelve "OK" si se ha encontrado un mdem en el puerto establecido.
AT+CREG?: devuelve un valor que indica si el mdem GSM tiene activa la red de telefona. Si tiene red devolver 0,1. AT+CSQ: devuelve un valor que indica la intensidad de la seal en el dispositivo GSM, el mximo es 31,99. AT+CGSN: devuelve el ID del dispositivo (IMEI). AT+CMGF=1: activa el mdem para modo de SMS de formato texto. AT+CMGS="numero_telefono": establece el nmero de telfono al que se enviar el SMS. AT+CPIN=PIN: establece el PIN para la tarjeta SIM conectada al mdem GSM. AT+COPS=?: muestra las redes disponibles para la tarjeta SIM del mdem GSM. AT+CGMI: devuelve el fabricante del mdem GSM o telfono mvil. AT+CGMM: devuelve el modelo del mdem GSM o telfono mvil. AT+CGMR: devuelve la versin de la revisin del dispositivo. AT+CPAS: devuelve el estado del mdem, las posibilidades son: o 0 Ready. o 1 Unavailable. o 2 Status unknown. o 3 Ringing. o 4 Call in progress. o 5 Asleep. AT+CPBR=1,10: devuelve las diez primeras entradas del la agenda de contactos de la tarjeta SIM (devuelve el nmero de telfono y el nombre del contacto).
para que el telfono utilice un solo tipo de tarjeta SIM, o slo una tarjeta SIM emitida por la compaa donde se compr el telfono, esta prctica se conoce como bloqueo de sim, y es ilegal en algunos pases.
Verificar si el usuario al que se enva el mensaje est operativo o no, mediante consulta al VLR de destino; si est operativo, el mensaje se enva, y si no se almacena temporalmente en el SMSC. Verificar peridicamente el estado de los usuarios que tienen mensajes pendientes.
Cuando un usuario de la red genera un mensaje corto (MO-SM) se producen los siguientes acontecimientos: El HLR donde est registrado el usuario decide si puede o no enviar mensajes, si todo es correcto. El MSC al que est conectado el usuario recibe el mensaje, enva la informacin necesaria al VLR para su posterior tarificacin y despus lo remite al SMSC de origen. El SMSC de origen enva el mensaje al SMSC de destino. Una vez all, se convierte en MT-SM y se procesa como veremos a continuacin. El SMSC de destino informa del estado del mensaje y devuelve un informe de recepcin al MSC y al usuario. En la pantalla del usuario se advierte: mensaje enviado. Si el usuario lo ha solicitado, recibir posteriormente un mensaje de estado confirmndole si el usuario de destino ha recibido el mensaje o no, y un mensaje de error en caso de que caduque.
Una vez hay un mensaje preparado para su envo en el SMSC de destino, originado por un usuario o por cualquier otra circunstancia, se le denomina MT-SM y el proceso de entrega es el siguiente: El SMSC que ha recibido el mensaje lo almacena en su base de datos y solicita al VLR del usuario la informacin de localizacin; Si el usuario destino est disponible, el SMSC enva al MSC el mensaje, indicando en qu parte del BSS debe ser entregado; si no lo est, se almacena en el SMSC durante su periodo de vigencia. Si el usuario destino est disponible, el MSC enva un aviso al VLR al que est conectado el usuario destino (que puede ser o no de su operador) para indicarle que va a entregarse un mensaje. El VLR avisa al terminal del usuario y verifica si est conectado a la red (en zona de cobertura). El VLR responde al MSC con el estado del usuario y, si est operativo, con la informacin de localizacin (parte del BSS en que se encuentra conectado). El MSC enva el mensaje al usuario. El MSC informa al SMSC de que el mensaje se ha entregado y puede ser borrado de su base de datos. Opcionalmente, el SMSC de destino responde a quien origin el mensaje (normalmente, el SMSC origen) con un aviso de entrega del mensaje.
Requisitos para dotar a nuestras aplicaciones de la opcin de envo de SMS desde el PC con mdem GSM
Vamos a explicar lo que se necesita, los requisitos para aadir la opcin de envo de SMS en nuestras aplicaciones, para notificacin a determinados usuarios mediante un SMS cuando sucede algn evento. Por ejemplo, si estamos desarrollando una aplicacin para control de la flota de camiones de una empresa
de Transportes (viajes, portes, reportes, etc.), mediante esta utilidad podramos aadir la opcin de envo deSMS a un camionero desde nuestra aplicacin con los datos del porte que ha de realizar. Por supuesto, existen multitud de utilidades para esta caracterstica de envo de SMS. Los requisitos son: Equipo informtico con puerto serie, en caso de no tenerlo se podr usar un adaptador de USB a Serie, pero es recomendable un equipo con puerto serie (COM) pues los adaptadores pueden no funcionar adecuadamente. Sistema operativo: usaremos un equipo informtico con sistema operativo Micrsoft Windows 7, aunque este mtodo es vlido para cualquier sistema operativo de Microsoft. Mdem GSM, en nuestro caso usaremos un CellRoute GSM de Telecom FM. Estos dispositivos van conectados al PC mediante el puerto serie (tambin los hay con conexin al puerto USB). Tarjeta SIM de mvil con lnea activa y servicio de envo de SMS activo, esta tarjeta ir introducida en el mdem GSM. IDE de desarrollo: en nuestro caso usaremos Microsoft Visual Basic .net del paquete Microsoft Visual Studio .Net 2010.
Mtodo Complejo A menudo estamos interactuando con dispositivos que pueden no requerir una trasmisin de datos en ambos sentidos o que pueden genera informacin de una manera espontnea. Es entonces donde entra en juego el evento DataReceived, el cual se dispara en el mismo momento en que se detecta la llegada de datos al puerto previamente abierto. Este evento se dispara en un hilo o Thread separado;
se pueden manipular los datos en ese hilo de modo separado, como por ejemplo enviarlos a una base de datos. Pero muchas veces se necesita pasar esta informacin al hilo principal para desplegar estos datos en algn objeto del formulario; en este caso necesitaremos utilizar un delegado para invocar un mtodo dentro del hilo principal que contiene la Interfaz de Usuario: Delegate Sub WriteDataDelegate(ByVal str As String)
Private Sub serialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _ Handles serialPort.DataReceived Dim strData As String = serialPort.ReadExisting Dim WriteInvoke As New _ WriteDataDelegate(AddressOf Me.WriteData) Me.Invoke(WriteInvoke, strData) End Sub
Si observamos el cdigo, encontraremos que al dispararse el evento DataReceived lo primero que hacemos es obtener los datos provenientes del disposivo conectado al puerto ya abierto, en este ejemplo se utiliza ReadExisting. Una vez obtenidos los datos provenientes del puerto, procedemos a instanciar el procedimiento WriteData a travs del delegado WriteDataDelegate. Finalmente invocamos el procedimiento previamente instanciado pasando los datos capturados desde el puerto serie. Dentro del procedimiento WriteData colocamos el siguiente cdigo: Private Sub WriteData(ByVal str As String) txtConsole.AppendText(str) End Sub
La razn de que el evento se dispare en hilo separado ofrece sus ventajas y desventajas de acuerdo a la cantidad de informacin a recibir y del procesamiento de esta informacin. Debido a que el Framework utiliza ciertos recursos del sistema para manejar los hilos, sera conveniente no utilizar el evento DataReceived a menos que la situacin lo requiera. Sin embargo, este mismo evento nos da una ventaja enorme cuando, por ejemplo, se recibe una cadena de texto que debe ser analizada, procesada y finalmente almacenada en una base de datos, porque todo este proceso es realizado en hilos separados de la interfaz de usuario. Hay que mencionar que si usamos el evento DataReceived de un componente SerialPort agregado a un formulario de nuestra aplicacin, como en el ejemplo de ms abajo, no ser necesario usar un delegado para acceder a los componentes del formulario.
Desarrollar aplicacin en Visual Basic .Net para envo de SMS mediante puerto serie y mdem GSM
Una vez adquirida la correspondiente licencia e instalado Microsoft Visual Bascic .net (o bien si usamos la versin Trial limitada en el tiempo) abriremos Visual Basic .Net, pulsaremos en el men "Archivo" - "Nuevo Proyecto", seleccionaremos en "Plantillas instaladas" la opcin "Visual Basic" - "Windows", en la parte derecha seleccionaremos "Aplicacin de Windows Forms". En "Nombre" estableceremos el nombre del proyecto, por ejemplo "AjpdSoftEnvioSMS". En el desplegable de la versin de .NET Framework seleccionaremos ".NET Framework 4" (aunque los componentes que usaremos pueden funcionar con versiones inferiores):
En el formulario (ventana) principal de nuestra aplicacin AjpdSoft Envo SMS colocaremos los siguientes componentes, indicamos los ms importantes: System.Windows.Forms.ComboBox: varios desplegables para seleccionar el puerto serie del equipo y otros datos de configuracin. System.Windows.Forms.TextBox: varios cuadros de texto para solicitar el PIN, para introducir comandos AT personalizados, para introducir el nmero de telfono y para introducir el texto del mensaje SMS que se enviar. System.Windows.Forms.Button: varios botones para obtener los puertos serie del equipo, para conectar con el mdem GSM conectado al puerto serie, para establecer el PIN de la tarjeta SIM, para enviar un comando AT personalizado, para enviar un SMS mediante el mdem GSM y el puerto serie. System.Windows.Forms.StatusStrip: barra de estado de la aplicacin donde mostraremos la informacin ms importante (intensidad de la seal del mdem GSM, ID del dispositivo, estado de la red mvil, estado del mdem GSM, etc. System.IO.Ports.SerialPort: componente ms importante que usaremos para conectar nuestro equipo informtico (PC) con el mdem GSM mediante el puerto serie. Este componente ser el encargado de establecer la conexin con el mdem, de enviar los comandos AT necesarios y de obtener el resultado de la ejecucin de cada comando AT.
En las siguientes imagenes mostramos cmo ubicar los componentes anteriores en la ventana principal de nuestra aplicacin para envo de SMS mediante mdem GSM:
En la ventana principal, aadimos un TabControl con tres pestaas, para los componentes de "Envo de SMS", de "Envo de comando AT personalizado" y de "Configuracin del puerto serie y el mdem GSM":
En la pestaa "Enviar comando AT" colocaremos el TextBox para introducir el comando AT personalizado y un Button para enviar el comando:
En la pestaa "Configuracin puerto y mdem GSM" introduciremos los componentes necesarios para personalizar los parmetros de conexin (bits por segundo, paridad, control de flujo, bits de datos, bits de parada, buffer de lectura, buffer de escritura, tiempo de espera, puerto serie, PIN):
10
Indicamos a continuacin el cdigo fuente Visual Basic .Net ms importante de la aplicacin: El botn que obtendr los puertos serie del equipo (btObtenerPuertos):
Private Sub btObtenerPuertos_Click(sender As System.Object, e As System.EventArgs) Handles btObtenerPuertos.Click Dim puertosSerie As List(Of String) Dim i As Integer txtPuerto.Items.Clear() puertosSerie = obtenerPuertosSeriePC() For i = 0 To puertosSerie.Count - 1 txtPuerto.Items.Add(puertosSerie(i).ToString) Next If txtPuerto.Items.Count >= 1 Then txtPuerto.Text = txtPuerto.Items(0) Else txtPuerto.Text = "" End If If puertosSerie.Count = 0 Then MsgBox("No se han detectado puertos serie en su equipo, " + "asegrese de que estn correctamente configurados.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly) End If End Sub
El cdigo de la funcin obtenerPuertosSeriePC usada por el botn anterior ser: 'Obtener los puertos Serie (COM) disponibles en el PC Function obtenerPuertosSeriePC() As List(Of String) Dim puertosSerie As List(Of String)
11
puertosSerie = New List(Of String) Try puertosSerie = New List(Of String) For Each puertosSerieObtenidos As String In My.Computer.Ports.SerialPortNames puertosSerie.Add(puertosSerieObtenidos) Next obtenerPuertosSeriePC = puertosSerie Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) obtenerPuertosSeriePC = puertosSerie End Try End Function
Para establecer los valores de conexin al puerto serie por defecto (btDefecto): Private Sub btDefecto_Click(sender As System.Object, e As System.EventArgs) Handles btDefecto.Click lsBitPorSegundo.Text = "9600" lsBitDatos.Text = "8" lsParidad.Text = "Ninguno" lsBitsParada.Text = "1" lsControlFlujo.Text = "Ninguno" txtTamanoBufferLectura.Text = "1024" txtTamanoBufferEscritura.Text = "1024" txtTiempoEspera.Text = "500" End Sub
Para conectar con el puerto serie y obtener los datos bsicos del mdem GSM y la tarjeta SIM (cobertura intensidad de la seal, ID de dispositivo (IMEI), disponibilidad de mdem en puerto indicado, disponibilidad de red mvil para enviar SMS en tarjeta SIM de mdem GSM) (btConectar): Private Sub btConectar_Click(sender As System.Object, e As System.EventArgs) Handles btConectar.Click Dim posBusqueda As Integer Dim resultadoDevuelto As String Try If btConectar.Text = "Conectar" Then If txtPuerto.Text = "" Or txtTamanoBufferEscritura.Text = "" Or txtTamanoBufferLectura.Text = "" Or txtTiempoEspera.Text = "" Or lsBitDatos.Text = "" Or lsBitPorSegundo.Text = "" Or lsBitsParada.Text = "" Or lsControlFlujo.Text = "" Or lsParidad.Text = "" Then MsgBox("Antes de conectar con el puerto serie " & "debe introducir los datos " & "de conexin con el mdem GSM y la tarjeta
SIM.",
12
MsgBoxStyle.Information + MsgBoxStyle.OkOnly) Else abrirPuertoSerie(txtPuerto.Text) 'Comprobar si hay un mdem GSM conectado al puerto serie compPuertoSerie.Write("AT" & Chr(13)) 'Esperamos un segundo para dar tiempo a 'las comunicaciones serie System.Threading.Thread.Sleep(1000) 'Si el comando AT devuelve OK es que hay mdem GSM If compPuertoSerie.ReadExisting().IndexOf("OK") Then bePModem.Text = "Mdem GSM activo" bePModem.ForeColor = Color.Green Else bePModem.Text = "Mdem GSM no encontrado" bePModem.ForeColor = Color.Red End If 'Limpiamos el bugger de datos de entrada 'devueltos por el mdem GSM compPuertoSerie.DiscardInBuffer() 'Comprobar si el mdem mdem GSM est conectado a una red GSM compPuertoSerie.Write("AT+CREG?" & Chr(13)) System.Threading.Thread.Sleep(1000) 'Si el comando AT+CREG? devuelve 0,1 es que hay red mvil If compPuertoSerie.ReadExisting().IndexOf("0,1") Then bePRedMovil.Text = "Red mvil disponible" bePRedMovil.ForeColor = Color.Green Else bePRedMovil.Text = "No hay red mvil" bePRedMovil.ForeColor = Color.Red End If compPuertoSerie.DiscardInBuffer() 'Obtener la intensidad de la seal (cobertura) del mdem GSM 'mximo: 31.99 compPuertoSerie.Write("AT+CSQ" & Chr(13)) System.Threading.Thread.Sleep(1000) resultadoDevuelto = compPuertoSerie.ReadExisting() posBusqueda = resultadoDevuelto.IndexOf("+CSQ: ") If posBusqueda >= 0 Then bpSenal.Minimum = 0 bpSenal.Maximum = 39 bpSenal.Value = obtenerCobertura(resultadoDevuelto) Else bpSenal.Minimum = 0 bpSenal.Value = 0 bpSenal.Minimum = 39 End If compPuertoSerie.DiscardInBuffer() 'Obtener ID del dispositivo GSM (IMEI)
13
compPuertoSerie.Write("AT+CGSN" & Chr(13)) System.Threading.Thread.Sleep(1000) resultadoDevuelto = compPuertoSerie.ReadExisting() posBusqueda = resultadoDevuelto.IndexOf("CGSN") If posBusqueda >= 0 Then resultadoDevuelto = quitarSaltosLinea(resultadoDevuelto, " ") bePID.Text = "IMEI: " & Replace(Mid(resultadoDevuelto, posBusqueda + Len("CGSN") + 1, Len(resultadoDevuelto)), "OK", "") End If btConectar.Text = "Desconectar" End If Else If compPuertoSerie.IsOpen Then compPuertoSerie.Close() End If btConectar.Text = "Conectar" End If Catch ex As Exception MsgBox("Error al abrir el puerto serial: " & ex.Message, MsgBoxStyle.Critical) End Try End Sub
A continuacin listamos el cdigo fuente de las funciones usadas en el botn anterior: Funcin abrirPuertoSerie: 'Abre el puerto serie pasado como parmetro Sub abrirPuertoSerie(ByVal puerto As String) Try With compPuertoSerie If .IsOpen Then .Close() End If .PortName = puerto .BaudRate = CInt(lsBitPorSegundo.Text) .DataBits = CInt(lsBitDatos.Text) Select Case lsBitsParada.Text Case "1" .StopBits = IO.Ports.StopBits.One Case "1.5" .StopBits = IO.Ports.StopBits.OnePointFive Case "2" .StopBits = IO.Ports.StopBits.Two Case "Ninguno" .StopBits = IO.Ports.StopBits.None End Select Select Case lsParidad.Text Case "Par" .Parity = IO.Ports.Parity.Even Case "Impar"
14
.Parity = IO.Ports.Parity.Odd Case "Ninguno" .Parity = IO.Ports.Parity.None Case "Marca" .Parity = IO.Ports.Parity.Mark Case "Espacio" .Parity = IO.Ports.Parity.Space End Select Select Case lsControlFlujo.Text Case "Hardware" .Handshake = IO.Ports.Handshake.RequestToSend Case "Xon / Xoff" .Handshake = IO.Ports.Handshake.XOnXOff Case "Ninguno" .Handshake = IO.Ports.Handshake.None Case "Hardware y Xon/Xoff" .Handshake = IO.Ports.Handshake.RequestToSendXOnXOff End Select .DtrEnable = False .ReadBufferSize = CInt(txtTamanoBufferLectura.Text) .WriteBufferSize = CInt(txtTamanoBufferEscritura.Text) .WriteTimeout = CInt(txtTiempoEspera.Text) .RtsEnable = True .Encoding = System.Text.Encoding.Default .Open() End With Catch ex As Exception MsgBox("Error al abrir el puerto serie: " & ex.Message, MsgBoxStyle.Critical) End Try End Sub Funcin quitarSaltosLinea: 'Funcin para quitar los saltos de lnea de un texto Private Function quitarSaltosLinea(ByVal texto As String, caracterReemplazar As String) As String quitarSaltosLinea = Replace(Replace(texto, Chr(10), caracterReemplazar), Chr(13), caracterReemplazar) End Function Funcin obtenerCobertura: Private Function obtenerCobertura( ByVal texto As String) As Double Dim pos As Integer Dim textoTemp As String texto = quitarSaltosLinea(texto, " ") pos = texto.IndexOf("CSQ:") + Len("CSQ:") + 1 textoTemp = Mid(texto, pos, Len(texto)) textoTemp = Trim(Replace(textoTemp, "OK", "")) obtenerCobertura = CDbl(textoTemp)
15
End Function Establecer el PIN de la tarjeta SIM del mdem GSM (btPIN):
Private Sub btPIN_Click(sender As System.Object, e As System.EventArgs) Handles btPIN.Click Try 'Enviar PIN a tarjeta SIM del dispositivo mdem GSM compPuertoSerie.Write("AT+CPIN=" & txtPIN.Text & Chr(13)) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End Sub Enviar comando AT personalizado (btEnviarATPrueba): Private Sub btEnviarATPrueba_Click(sender As System.Object, e As System.EventArgs) _ Handles btEnviarATPrueba.Click Try compPuertoSerie.Write(txtComandoAT.Text & Chr(13)) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End Sub
El botn ms importante, para enviar el SMS (btEnviarSMS): Private Sub btEnviarSMS_Click(sender As System.Object, e As System.EventArgs) Handles btEnviarSMS.Click If Not compPuertoSerie.IsOpen Then tabPes.SelectedTab = tabConfiguracionModem MsgBox("Antes de enviar el SMS debe introducir los datos "
& "de conexin con el mdem GSM y la tarjeta SIM y " & "conectar con el puerto serie.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly) Else If txtNumeroTelefono.Text = "" Or txtSMS.Text = "" Then MsgBox("Debe introducir el nmero de telfono al " & "que se enviar el SMS y el texto del SMS.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly) Else Try 'Activar modo SMS en dispositivo GSM compPuertoSerie.Write("AT+CMGF=1" & Chr(13)) System.Threading.Thread.Sleep(1000) 'Establecer nmero de telfono de destino del SMS compPuertoSerie.Write("AT+CMGS=" & Chr(34) & (txtNumeroTelefono.Text) & Chr(34) & Chr(13))
16
System.Threading.Thread.Sleep(1000) 'Enviar texto SMS a dispositivo GSM compPuertoSerie.Write(txtSMS.Text & Chr(26)) Application.DoEvents() System.Threading.Thread.Sleep(1000) MsgBox("El SMS ha sido enviado al nmero " & txtNumeroTelefono.Text & ".", MsgBoxStyle.Information + MsgBoxStyle.OkOnly) Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End If End If End Sub
Para mostrar el resultado de cada comando AT, usamos el evento DataReceived del SerialPort (compPuertoSerie):
'NOTA: este evento del SerialPort se ejecuta en un Thread 'diferente al de la aplicacin, por lo que los datos devueltos 'por el puerto serie no tienen por qu ser instantneos, puede que tengan retraso Private Sub compPuertoSerie_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) _ Handles compPuertoSerie.DataReceived Dim resultadoModemGSM As String Try 'Obtener el resultado devuelto por el puerto serie resultadoModemGSM = compPuertoSerie.ReadExisting.Trim().ToString If txtResultado.Text <> "" Then txtResultado.Text = txtResultado.Text + vbCrLf + resultadoModemGSM Else txtResultado.Text = resultadoModemGSM End If 'Mostrar ltima lnea del TextBox txtResultado.Select(txtResultado.Text.Length, 0) txtResultado.ScrollToCaret() Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End Sub En el evento Load del formulario principal colocamos el siguiente cdigo para desactivar la deteccin a llamadas en subprocesos equivocados: Private Sub formEnvioSMS_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'Desactivar deteccin a llamadas en subprocesos equivocados CheckForIllegalCrossThreadCalls = False
17
End Sub La descarga con la aplicacin completa AjpdSoft Envo SMS y el cdigo fuente en Visual Basic .Net 2010: AjpdSoft Envo SMS
A continuacin pulsaremos en el botn "Obtener" para listar los puertos serie del equipo:
18
Seleccionaremos el puerto serie donde tengamos conectado el mdem GSM (por ejemplo COM7) y pulsaremos "Conectar" para establecer la comunicacin con el mdem GSM y la tarjeta SIM conectada:
Si todo es correcto, AjpdSoft Envo SMS obtendr los datos bsicos: comprobar si hay un mdem GSM conectado al puerto serie, comprobar si hay red mvil disponible, obtendr el IMEI del mdem GSM y obtendr la intensidad de la seal (cobertura). Mostrar estos datos en la parte inferior:
Si nuestra tarjeta SIM est protegida con un PIN de seguridad deberemos establecerlo para poder usarla. Para indicar el PIN lo introduciremos en "PIN" y pulsaremos el botn "Establecer PIN". Si el PIN es correcto mostrar "OK" en la ventana de resultado de los comandos AT:
19
Desde la pestaa "Enviar comando AT" podremos enviar cualquier comando AT que queramos al mdem, a nos devolver el resultado (si lo hay) en el cuadro "Resultado". Para enviar el comando AT lo introduciremos en "Comando AT", por ejemplo para obtener la primera entrada de la agenda de la tarjeta SIM introduciremos el comando AT: AT+CPBR=1,1 pulsando en el botn "Enviar comando AT" nos devolver el resultado:
Para enviar un SMS a un mvil pulsaremos en la pestaa "Envo de SMS", introduciremos el nmero de telfono de destino del SMS en "N telfomo" y el texto del mensaje SMS que queramos enviar en "Mensaje". Pulsaremos el botn "Enviar SMS":
20
Si el envo se realiza (no implica que llegue el SMS necesariamente al destinatario) mostrar el mensaje:
En el cuadro de resultado mostrar el resultado devuelto por el mdem mediante el puerto serie de los comandos AT ejecutados para enviar el SMS:
el mvil del destinatario, casi instantneamente (depender de los operadores y la saturacin de la red) llegar el SMS enviado desde el PC:
En
21
Y podremos consultar el mensaje enviado desde el PC con un mdem GSM y AjpdSoft Envo SMS:
22
nuestras aplicaciones de la posibilidad de avisar mediante SMS en determinadas circunstancias. Desde el Proyecto AjpdSoft hemos pretendido mostrar todas las posibilidades del manejo de un mdem GSM para envo de mensajes cortos SMS a mviles. Puesto que tenis el cdigo fuente gratuito y completo de la aplicacin podris modificarlo y usarlo para implementar esta opcin en vuestras aplicaciones: AjpdSoft Envo SMS
Fuente:
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=562#.UCkahWE0O1g
Descargar e instalar Microsoft Visual Studio 2010. Realizar aplicacin Visual Basic de Visual Studio 2010 con acceso a base de datos PostgreSQL. o Instalar driver ODBC de PostgreSQL en Microsoft Windows 7. o Desarrollar aplicacin con Visual Basic .Net de Visual Studio 2010 con acceso a PostgreSQL usando el asistente para agregar nuevo origen de datos. o Desarrollar aplicacin con Visual Basic .Net de Visual Studio 2010 con acceso a PostgreSQL sin usar componentes visuales. Artculos relacionados. Crditos.
Abriremos un navegador web como Mozilla Firefox y accederemos a la URL: http://www.microsoft.com/downloads/es-es/details.aspx?FamilyID=06A32B1C-80E941DF-BA0C-79D56CB823F7 (la URL puede variar en funcin de la versin) Descargaremos los cuatro ficheros de Visual Studio 2010 Utilmate (versin de evaluacin):
24
Se iniciar la descompresin de los ficheros descargados en el fichero .iso con la instalacin de Microsoft Visual Studio 2010:
Una vez descomprimidos los ficheros, quedar el fichero VS2010UltimTrialESN.iso de 2,5GB, este fichero podremos pasarlo a un DVD como indicamos aqu: Crear CD con imagen ISO y CDBurnerXP Tras crear el DVD (o descomprimir el fichero ISO), ejecutaremos el fichero "setup.exe":
25
Se iniciar el asistente para la instalacin d Microsoft Visual Studio 2010 (versin de evaluacin). Pulsaremos en "Instalar Microsoft Visual Studio 2010":
En el primer paso de la instalacin de Microsoft Visual Studio 2010 Ultimante, desmarcaremos "S, enviar a Microsoft Corporation informacin sobre la instalacin" (si no queremos enviar esta informacin) y pulsaremos "Siguiente":
26
Leeremos los trminos de licencia del software de Microsoft Visual Studio 2010 Ultimate (edicin de prueba). Si estamos de acuerdo marcaremos "He ledo los trminos de la licencia y los acepto". Pulsaremos "Siguiente" para continuar:
A continuacin marcaremos "Personalizar" para seleccionar los lenguajes de programacin y las herramientas que se quieran instalar. En "Ruta de instalacin del producto" indicaremos la unidad y carpeta de destino de la instalacin:
Microsoft Office Developer Tools. Dotfuscator Software Services. Microsoft SQL Server 2008 Express. Microsoft SharePoint Developer Tools.
Se iniciar la instalacin de Microsoft Visual Studio 2010 Ultimate: informe de errores de Microsoft, VC 9.0 Runtime, VC 10.0 Runtime, Microsoft .Net Framework 4, Microsoft Visual Studio 2010 Ultimate, Microsoft ASP .Net, etc.:
Tras la instalacin, el asistente para instalar Visual Studio mostrar la siguiente ventana, con el texto "Correcto. Se instal Visual Studio 2010 y finaliz el programa de instalacin". Pulsaremos "Finalizar":
28
Con el texto: "Debe reiniciar el equipo para completar la instalacin. El programa de instalacin continuar automticamente despus de haber reiniciado el equipo". Desde el botn "Iniciar" - "Todos los programas" podremos ver el grupo de programas "Microsoft Visual Studio 2010":
29
Tras iniciar por primera vez Microsoft Visual Studio 2010 Ultimate, seleccionaremos la configuracin de entorno predeterminada, por ejemplo "Configuracin de desarrollo de Visual Basic":
Realizar aplicacin Visual Basic de Visual Studio 2010 con acceso a base de datos PostgreSQL
A continuacin realizaremos una sencilla aplicacin que permita conectarse al motor de bases de datos gratuito PostgreSQL, para ello usaremos el driver ODBC correspondiente de PostgreSQL. Realizaremos la aplicacin usando el lenguaje de
30
programacin Microsoft Visual basic .Net de Microsoft Visual Studio 2010 en el sistema operativo Microsoft Windows 7. Nos conectaremos con nuestra aplicacin a un servidor de PostgreSQL en GNU Linux Debian. Por supuesto, para probar la conexin, necesitaremos un servidor (equipo) con PostgreSQL, bien con Windows o bien con Linux. En el siguiente artculo explicamos cmo instalar PostgreSQL en GNU Linux Debian: Instalar el motor de bases de datos PostgreSQL en GNU Linux Debian 5 En este otro artculo explicamos cmo instalar PostgreSQL en Microsoft Windows 7: Instalar y administrar PostgreSQL en Microsoft Windows 7
31
Se iniciar el asistente para instalar el driver ODBC de PostgreSQL en Microsoft Windows 7, pulsaremos "Next" para continuar:
Leeremos los trminos de licencia, si estamos de acuerdo marcaremos "I accept the terms in the License Agreement", pulsaremos "Next" para continuar:
32
Pulsaremos "Install" para iniciar la instalacin final del driver ODBC de PostgreSQL en Microsoft Windows 7:
Si tenemos UAC (Control de cuentas de Usuario) activado, nos mostrar un mensaje de aviso, pulsaremos "S" para continuar:
La instalacin se completar, mostrar el mensaje Completed hte psqlODBC_x64 ( psqlODBC_x32) Setup Wizard. Click the Finish button to exit the Setup Wizard. Pulsaremos "Finish" para finalizar la instalacin:
33
Desarrollar aplicacin con Visual Basic .Net de Visual Studio 2010 con acceso a PostgreSQL usando el asistente para agregar nuevo origen de datos
A continuacin desarrollaremos una aplicacin de ejemplo en Microsoft Visual Basic .Net de Microsoft Visual Studio 2010 que acceder a una base de datos PostgreSQL mediante ODBC. Pulsaremos en el botn "Iniciar" de Windows - "Todos los programas" - "Microsoft Visual Studio 2010" y seleccionaremos "Microsoft Visual Studio 2010":
En "Plantillas instaladas" seleccionaremos "Visual Basic" y "Windows". En la parte derecha tendremos las siguientes posibilidades:
Aplicacin de Windows Forms: que ser la que seleccionemos. Aplicacin WPF. Aplicacin de consola. Biblioteca de clases. Aplicacin de explorador WPF. Biblioteca de controles de usuario WPF. Biblioteca de controles personalizados de WPF. Proyecto vaco. Servicio de Windows. Biblioteca de controles de Windows Forms.
Seleccionaremos "Aplicacin de Windows Forms". En el desplegable selecionaremos ".NET Framework 4". En "Nombre" introduciremos, por ejemplo, "AjpdSoftAccesoPostgreSQL". Pulsaremos "Aceptar":
35
Aadiremos el origen de datos a la aplicacin que desarrollaremos, para ello pulsaremos en el men "Datos" - "Agregar nuevo origen de datos":
En el asistente para la configuracin e orgenes de datos, en "De dnde obtendr la aplicacin los datos?" seleccionaremos "Base de datos". Pulsaremos "Siguiente":
Seleccionaremos "Conjunto de datos" en "Qu tipo de modelo de base de datos desea usar?":
36
En la ventana de "Elegir la conexin de datos", en "Qu conexin de datos debera utilizar la aplicacin para conectarse a la base de datos?" pulsaremos en el botn "Nueva conexin":
En "Elegir origen de datos" seleccionaremos "Origen de datos de Microsoft ODBC", en "Proveedor de datos seleccionaremos "Proveedor de datos de .NET Framework para ODBC". Pulsaremos "Continuar":
37
Marcaremos "Origen de datos de sistema (se aplica slo a este equipo). Pulsaremos "Siguiente":
Pulsaremos "Finalizar":
38
En las opciones del driver psqlODBC de PostgreSQL introduciremos las siguientes opciones:
Data Source: nombre que le daremos al origen de datos para identificarlo en la cadena de conexin, en nuestro caso "bdajpdsoft". Database: nombre de la base de datos PostgreSQL a la que nos conectaremos, en nuestro caso "bdajpdsoft". Description: texto descriptivo de la conexin, por ejemplo "PosgreSQL con Visual Basic". SSL Mode: si tenemos el modo SSL activado en el servidor podremos seleccionar "enable", en caso contrario seleccionaremos "disable". Server: nombre de red (hostname) o IP del servidor de PostgreSQL, en nuestro caso, el servidor PostgreSQL lo tenemos en un equipo con GNU Linux Debian, con la IP 192.168.1.100. Port: puerto usado por PostgreSQL, por defecto 5432. User Name: nombre de usuario de PostgreSQL con permisos suficientes para la accin que realizar la aplicacin, en nuestro caso seleccionaremos el usuario por defecto "postgres". Password: contrasea del usuario anterior.
Si la conexin se establece correctamente con el servidor de PostgreSQL nos mostrar el siguiente mensaje:
39
Con el texto: "Connection successful". Si la conexin no puede establecerse mostrar un mensaje con el error que se haya producido. Pulsaremos "Aceptar" en la ventana de "Seleccionar origen de datos":
En la ventana de "Agregar conexin", en la opcin "Usar cadena de conexin", nos habr aadido la cadena de conexin resultante de las opciones anteriores, con todos los parmentros seleccionados. Si queremos realizar otra prueba pulsaremos en "Probar conexin":
40
Si todo es correcto, en la prueba de conexin de Visual Basic con el servidor establecido en el driver ODBC nos mostrar el siguiente mensaje:
Con el texto: "La conexin de prueba se realiz correctamente". El asistente para la configuracin de orgenes de datos de Visual Basic .Net nos mostrar la cadena de conexin. En esta ventana podremos seleccionar las siguientes opciones:
Qu conexin de datos deber utilizar la aplicacin para conectarse a la base de datos?: en este desplegable seleccionaremos el driver ODBC creado anteriormente.
En la siguiente opcin nos indica: Esta cadena de conexin parece contener datos confidenciales (por ejemplo, una contrasea) que son necesarios para conectarse con la base de datos. Sin embargo, almacenar datos confidenciales en la cadena de conexin puede suponer un riesgo para la seguridad. Desea incluir estos datos en la cadena de conexin? Y las opciones:
No, excluir los datos confidenciales de la cadena de conexin. Establecer esta informacin en el cdigo de mi aplicacin. S, incluir datos confidenciales en la cadena de conexin.
41
En nuestro caso, para simplificar y mostrar un ejemplo de conexin a PostgreSQL, seleccionaremos "S, incluir datos confidenciales en la cadena de conexin". Pulsaremos "Siguiente":
Nota: la opcin de guardar los datos confidenciales en la cadena de conexin no es recomendable, lo ideal es guardar los datos de usuario y contrasea de la base de datos en un fichero encriptados, no en la cadena de conexin sin encriptar. A continuacin, en "Guardar cadena de conexin en el archivo de config. de la aplicacin" marcaremos "S, guardar la conexin como" e introduciremos un nombre para la cadena de conexin, por ejemplo "bdajpdsoftConnectionString":
Con el texto: El almacenamiento de las cadenas de conexin del archivo de configuracin de aplicacin facilita el mantenimiento y la implementacin. Para guardar la cadena de conexin en el archivo de configuracin de la aplicacin, escriba un nombre en el cuadro y, a continuacin, haga clic en Siguiente. Desea guardar la cadena de conexin en el archivo de configuracin de la aplicacin?
42
A continuacin, el asistente para la configuracin de orgenes de datos, nos mostrar las tablas que encuentre en el servidor de PostgreSQL (para el usuario que hayamos usado en la conexin y la base de datos seleccionada). En nuestro caso marcaremos "factura". En la parte inferior podremos indicar el nombre para el DataSet que crear el asistente de forma automtica, enlazado con el origen de datos y con las tablas, vistas, procedimientos almacenados y funciones seleccionados, en nuestro caso "bdajpdsoftDataSet". Pulsaremos "Siguiente" para continuar:
43
A continuacin aadiremos un DataGridView al formulario de la aplicacin, para mostrar los datos de la tabla "factura" de PostgreSQL. Para ello pulsaremos en "Cuadro de herramientas", en el grupo de componentes "Datos" seleccionaremos "DataGridView":
Colocaremos el DataGridView en el formulario, seleccionaremos la propiedad "DataSource" del DataGridView, en el desplegable seleccionaremos el DataSet y, dentro de ste, la tabla que queramos mostrar, en nuestro caso "factura":
44
Automticamente mostrar los campos de la tabla seleccionada en el DataGridView, seleccionndolo podremos establecer sus propiedades (columnas a mostrar, tamao, caption (nombre), etc.):
Si compilamos la aplicacin pulsando F5 o desde el men "Depurar" - "Iniciar depuracin" podremos ver que nuestra aplicacin Visual Basic .Net de Microsoft Visual Studio 2010 ya accede al servidor PostgreSQL y mostrar los datos de la tabla "factura":
45
Ahora podremos aadir, por ejemplo, un BindingNavigator, del grupo de componentes "Datos":
Dicho componente es una barra de botones con "ltimo", "Anterior", "Siguiente", "Primero", aadir registro, eliminar registro, el registro actual y el nmero de registros. Para enlazar el componente "BindingNavigator" a la tabla "factura" lo seleccionaremos y en la propiedad "BindingSource" seleccionaremos "FacturaBindingSource":
46
Si compilamos la aplicacin pulsando F5 veremos el resultado del componente BindingNavigator y el componente DataGridView:
Desarrollar aplicacin con Visual Basic .Net de Visual Studio 2010 con acceso a PostgreSQL sin usar componentes visuales
Por un lado, en la clase del formulario declararemos los siguientes elementos:
Public Class Form1 'Para la conexin con PostgreSQL sin componentes visuales Public cadenaConexionODBC As String = "DSN=bdajpdsoft;UID=postgres;PWD=0000;" Public conexionBD As New Odbc.OdbcConnection(cadenaConexionODBC) Dim comandoSQL As OdbcCommand = conexionBD.CreateCommand() Public datasetDatosBD As New DataSet Public dataAdaptarDatosDB As New Odbc.OdbcDataAdapter
Aadiremos un botn al formulario, en el evento onClick del botn pondremos el siguiente cdigo:
Private Sub btAccesoPostgreSQL_Click( ByVal sender As System.Object,
47
ByVal e As System.EventArgs) Handles btAccesoPostgreSQL.Click Try conexionBD.Open() MsgBox("Conexin establecida a la base de datos PostgreSQL. ", MsgBoxStyle.Information, "Conexin establecida") 'Ejemplo para crear una tabla en PostgreSQL con Visual Basic y ODBC If MsgBox("Se va a crear una tabla llamada 'cliente' desea continuar?", MsgBoxStyle.YesNo + MsgBoxStyle.Question) = MsgBoxResult.Yes Then comandoSQL.CommandText = "CREATE TABLE cliente (codigo INTEGER, nombre VARCHAR(100))" dataAdaptarDatosDB.SelectCommand = New Odbc.OdbcCommand(comandoSQL.CommandText, conexionBD) dataAdaptarDatosDB.SelectCommand.ExecuteNonQuery() MsgBox("Tabla creada correctamente en PostgreSQL.", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Tabla creada") 'Ejemplo para insertar un registro en una tabla PostgreSQL con Visual Basic If MsgBox("Desea insertar un registro de prueba en la tabla 'cliente'?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Insertar registro en tabla PostgreSQL") = MsgBoxResult.Yes Then comandoSQL.CommandText = "INSERT INTO cliente (codigo, nombre) values (1, 'Prueba registro')" dataAdaptarDatosDB.InsertCommand = New Odbc.OdbcCommand(comandoSQL.CommandText, conexionBD) dataAdaptarDatosDB.InsertCommand.ExecuteNonQuery() 'Ejemplo de ejecucin de select en PostgreSQL con Visual Basic comandoSQL.CommandText = "select * from cliente" dataAdaptarDatosDB.SelectCommand = New Odbc.OdbcCommand(comandoSQL.CommandText, conexionBD) dataAdaptarDatosDB.Fill(datasetDatosBD) MsgBox("Nmero de registros de la tabla 'cliente': " & _ CStr(datasetDatosBD.Tables(0).Rows.Count), MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Select ejecutado") End If End If conexionBD.Close() Catch ex As Exception MsgBox("Error en la conexin a la base de datos: " & ex.Message,
48
En el cdigo anterior mostramos un ejemplo para crear una tabla, un ejemplo para insertar un registro en una tabla y un ejemplo para realizar un select de una tabla:
49