Visual Basic Foro
Programación => Visual Basic .NET / C# => Mensaje iniciado por: softmania en Noviembre 19, 2013, 01:46:14 am
-
Esto se encuentra en el foro de vb6 y el código es correspondiente a vb.net ... Moderador mi intención no es hacer spam ... simplemente trato de ordenar la información, el tema es que no se si debo borrar de vb6 el post ya que fue una respuesta.
Hola, bueno explicaré un poco como es el tema de los módem GSM a través de USB, así pueden practicar desde su celular, módem Claro, módem Movistar o desde cuales quiera…
Es realmente fácil la manipulación de los mismos, hay código AT estándar que se aplica prácticamente en todos los módem y hay otros que son particulares de cada dispositivo…
Estos códigos AT nos permiten conversar con el dispositivo, pudiendo ejecutar intrucciones en el mismo, obtener datos y establecer configuraciones ...
No empecé explicando que es un comando AT, porque no pretendo profundizar conceptos, ni aburrirlos, pero sería bueno que investiguen un poco sobre el tema
Vamos al grano…
Explicaré con Vb.net, pero es equivalente a VB6…
Trataré de hacer el ejemplo lo más simple que se pueda
Primero hay que tener el driver del módem el cual permitirá interactuar con el puerto serie a través del puerto USB … este puede venir en forma individual o contenido en el aplicativo que la empresa haya proporcionado para interactuar con el mismo … ok
Una vez que tenemos instalado el driver… hay que identificar el puerto COM con el que acepta los comandos AT, ya que puede haber más de uno utilizados por el dispositivo…
En algunos casos se puede saber porque esta descripto en el mismo nombre con el que se encuentra el driver, en administrador de dispositivos (caso Windows), pero otras veces habrá que hacer algunas pruebas…
Programación
Agregamos un Control que nos permite conectar el puerto COM (o puerto serial), “Serialport”
Armamos una función de conexión
Private Function Conectar() As String
Try
With SerialPort1
If .IsOpen Then
.Close()
End If
.PortName = “COM9”
.BaudRate = 9600 ‘bits por segundo (velocidad)
.DataBits = 8 ‘bits de datos
.DtrEnable = False
.StopBits = IO.Ports.StopBits.One
.Parity = IO.Ports.Parity.None
.Handshake = IO.Ports.Handshake.None
.WriteBufferSize = 1024 ‘buffer de escritura
.ReadBufferSize = 2048 ‘buffer de lectura
.WriteTimeout = 500 ‘tiempo de espera
.Encoding = System.Text.Encoding.Default
.Open()
End With
Conectar = vbOK
Catch ex As Exception
Conectar = ex.Message
End Try
End Function
De donde saque los datos de la función? De las propiedades del dispositivo, allí se detalla la configuración del puerto …
Bién, ya estamos conectados… ahora … ¿Cómo enviamos un comando AT?
Haremos otra función para que se entienda
Public Function Check_AT() As String
Try
SerialPort1.Write("AT" & Chr(13))
Check_AT = vbOK
Catch ex As Exception
Check_AT = ex.Message
End Try
End Function
EL chr(13) es necesario para darle ingreso al comando AT
Ahora unos comandos AT para tener en cuenta
ATZ&F = resetea el dispositivo
Private Function Resetear() As String
Try
SerialPort1.Write("ATZ&F" & Chr(13))
Resetear = vbOK
Catch ex As Exception
Resetear = ex.Message
End Try
End Function
Para enviar SMS se construiría de la siguiente manera: AT+CMGS
Private Function Enviar_mensaje(ByVal Numero_Movil As String, ByVal Mensaje As String) As String
Try
SerialPort1.Write("APZ&F" & Chr(13))
SerialPort1.Write("AT+CMGF=1" & Chr(13)) ‘este comando establece el modo texto
SerialPort1.Write("AT+CMGS=" & Chr(34) & (Numero_Movil) & Chr(34) & Chr(13))
SerialPort1.Write(Mensaje & Chr(26))
Enviar_mensaje = vbOK
Catch ex As Exception
Enviar_mensaje = ex.Message
End Try
End Function
Chr(26) es un carácter especial necesario para poder indicar el envío del mensaje “→”
Para obtener mensajes contenidos en el dispositivo sería algo así: AT+CMGL
Private Function Recibir_mensaje(ByVal Tipo As Tipo) As String
Try
SerialPort1.Write("ATZ&F" & Chr(13))
SerialPort1.Write("AT+CMGF=1" & Chr(13)) ‘este comando establece el modo texto
Select Case Tipo
Case 0
SerialPort1.Write("AT+CMGL=" & Chr(34) & "REC UNREAD" & Chr(34) & Chr(13)) ‘solo recibiremos los sms no leidos
Case 1
SerialPort1.Write("AT+CMGL=" & Chr(34) & "REC READ" & Chr(34) & Chr(13)) ‘solo recibiremos los sms leidos
Case 2
SerialPort1.Write("AT+CMGL=" & Chr(34) & "STO UNSENT" & Chr(34) & Chr(13)) ‘solo recibiremos los sms no enviados
Case 3
SerialPort1.Write("AT+CMGL=" & Chr(34) & "STO SENT" & Chr(34) & Chr(13)) ‘solo recibiremos los sms enviados
Case 4
SerialPort1.Write("AT+CMGL=" & Chr(34) & "ALL" & Chr(34) & Chr(13)) ‘Recibiremos todos los sms
End Select
Recibir_mensaje = vbOK
Catch ex As Exception
Recibir_mensaje = ex.Message
End Try
End Function
Para recibir en forma automática mensajes que vaya recibiendo el dispositivo sería:
Private Function Auto_Recibir() As String
Try
SerialPort1.Write("ATZ&F" & Chr(13)) ‘reseteamos
SerialPort1.Write("AT+CMGF=1" & Chr(13)) ‘establecemos el modo texto
SerialPort1.Write("AT+CNMI=" & Chr(34) & "1,2,0,0,0" & Chr(34) & Chr(13)) ‘esto es más largo de explicar, recomiendo lo investiguen
Auto_Recibir = vbOK
Catch ex As Exception
Auto_Recibir = ex.Message
End Try
End Function
Bueno hay muchos comandos mas, como saber la señal del dispositivo, nivel de carga de la batería, fabricante, se pueden hacer llamadas, colgar llamadas, etc y algo interesante para que investiguen, se pueden redireccionar llamadas ... mnmnm
Bueno salu2
-
Yo era que prepare también algo similar pero nunca me funciono para recibir el mensaje.
La funcion que pasaste aca me dice un error en As Tipo no esta definido.
Private Function Recibir_mensaje(ByVal Tipo As Tipo) As String
Yo tengo un Galaxy S2 como se en que puerto esta conectado.
-
Mira vos, yo siempre trabaje directamente con los modulos motorola G20/G24, pensaba que esos comandos eran especificos de motorola, no sabia que era un std gsm
-
¡Qué bueno!
Me gustaría implementar esto. ¿Alguien podría decirme qué se necesita para ello? No sé nada al respecto, por lo que no sé si se necesita un modem especial (y si se debe comprar a las empresas prestadoras del servicio de telefonía celular), alguna autorización o registración, etcétera.
Muchas gracias.
Jerónimo
-
yo siempre use un modem,
pero por lo que comenta el amigo "softmania" con cualquier telefono conectado x USB con los drivers correspondientes a una pc, seguramente aparezca como un puerto COM en la PC, una vez que identificas el puerto, lo abris como un puerto serie comun y le envias los comandos AT.
No la telefonica, no tiene idea, el SMS lo envia siempre el telefono, ya sea escribiendolo en el tel o por el comando AT, pero en definitiva siempre sale un SMS
-
Gracias, Waldo.
¿El modem qué tipo de modem es? La última vez que usé uno era para dial-up :-[
Imagino que siempre será más cómodo poner un modem y no estar conectando y desconectando un teléfono, ¿no?
Muchas gracias.
Jerónimo
-
Con los unicos que yo trabaje son Motorola modelos G20 o G24, pero no es un modem externo con gabinete, es mas bien un OEM para algun proyecto electronico, necesita fuente y la interfaz es serial RS-232
-
Perdón por la ignorancia.
¿A ese modem se le pone un chip de telefonía celular para que pueda enviar mensajes?
Muchas gracias.
Jerónimo
-
Si, si un simcard comun y silvestre como el de cualquier telefono
-
Excelente.
Muchas gracias, Waldo, por tus respuestas y por tu tiempo.
Jerónimo
-
Hola Enter ... te defino a función que pides ...
Private Function Recibir_mensaje(ByVal Tipo As Tipo) As String
Enum Tipo
SMS_NO_LEIDOS
SMS_LEIDOS
SMS_NO_ENVIADOS
SMS_ENVIADOS
SMS_TODOS
End Enum
Private Function Recibir_mensaje(ByVal Tipo As Tipo) As String
Try
SerialPort1.Write("ATZ&F" & Chr(13))
SerialPort1.Write("AT+CMGF=1" & Chr(13)) 'este comando establece el modo texto
Select Case Tipo
Case Form1.Tipo.SMS_NO_LEIDOS
SerialPort1.Write("AT+CMGL=" & Chr(34) & "REC UNREAD" & Chr(34) & Chr(13)) 'solo recibiremos los sms no leidos
Case Form1.Tipo.SMS_LEIDOS
SerialPort1.Write("AT+CMGL=" & Chr(34) & "REC READ" & Chr(34) & Chr(13)) 'solo recibiremos los sms leidos
Case Form1.Tipo.SMS_NO_ENVIADOS
SerialPort1.Write("AT+CMGL=" & Chr(34) & "STO UNSENT" & Chr(34) & Chr(13)) 'solo recibiremos los sms no enviados
Case Form1.Tipo.SMS_ENVIADOS
SerialPort1.Write("AT+CMGL=" & Chr(34) & "STO SENT" & Chr(34) & Chr(13)) 'solo recibiremos los sms enviados
Case Form1.Tipo.SMS_TODOS
SerialPort1.Write("AT+CMGL=" & Chr(34) & "ALL" & Chr(34) & Chr(13)) 'Recibiremos todos los sms
End Select
Recibir_mensaje = vbOK
Catch ex As Exception
Recibir_mensaje = ex.Message
End Try
End Function
Hola Jerónimo
no sé si se necesita un modem especial
Puedes usar cualquier módem gsm ... (puede que tengas un módem gsm a mano como son los módem claro y movistar que se usan para conectividad de internet o simplemente tu celular ... con el tema del celular puedes tener algunos inconveniente dependiendo de la marca y modelo ... )
Y como dice el colega Waldo
Si, si un simcard comun y silvestre como el de cualquier telefono
Esto tiene muchas aplicaciones. Se puede implementar en Desarrollos en donde automáticamente se envíen mensajes individuales o masivos para diferentes propósitos ....
Publicidades, estados de deudas, etc ...
Pero esto es potenciado con la capacidad de recibir y procesar los mensajes recibidos ... ya que mediante ellos se puede tener una conversación automatizada con el emisor ... ejemplo ... ampliaciones de servicios, selección de opciones, códigos de alertas,etc
Creo que ampliaré un poco mas con un ejemplo, consigan un módem claro, este tipo módem trae los driver contenidos en el mismo ... ya estaré subiendo un ejemplo ... salu2 colegas
-
Excelente, softmania.
Muchas gracias.
Jerónimo
-
Hola nuevamente Colegas ...
Bueno acá les dejo el Link de un ejemplo en vb2010. :)
Hay una clase que les permitirá utilizar un módem GSM ... y un plus ::) ... que es una función que fue echa a medida del módem claro, separando la cadena de datos obtenidas y presentada en el listview ...
http://www.mediafire.com/download/9ijg2kwnpmkbbf8/Modem_SMS.rar (http://www.mediafire.com/download/9ijg2kwnpmkbbf8/Modem_SMS.rar)
pass: softmania
Salu2 Colegas
-
Gracias por compartir.
Un dato para tener en cuenta que me paso en algunas ocasiones.
Para enviar un sms luego de ingresar el texto del mensaje se termina con un ctrl+z , o chr 26.
Bueno tenia hecho mi codigo similar al tuyo, y luego del ctrl+z, el modem devolvia error, no siempre.
Una vez, mientras devolvia error continuamente, pare el programa, abrir un hyperterminal y ejecute todo a mano, y perfecto sin error, me puse a pensar cual era la diferencia, y se me ocurrio que al hacerlo a mano, existe un delay entre que termino de escribir el texto y luego ingreso el ctrl+z, asi que se me ocurrio en mi codigo poner un delay antes del ctrl+z, y nunca mas fallo.
-
Excelente información. Gracias a ambos por compartirla.
Voy a ver si me consigo un modem para empezar a probar.
Saludos.
Jerónimo
-
Excelente, yo era que hice con un amigo para unos políticos en época electorales un pequeño sistema para que cualquier afiliado a ese partido consulte en que mesa tiene que botar.
La gente enviaba un sms a un numero con su numero de cedula, y el sistema le devolvia en que mesa, puesto etc... tenia que botar. Pero ya no tengo mas el sistema se me fundio con un disco duro.
Yo usaba una nokia e7 cuando eso, despues probe hace otra ves con la samsung pero ya dejo de funcionar.
Y utilizaba este servicio.
http://smsenabler.com/