.NET Tutorial 35. Enviar SMS desde .NET

En este tutorial vamos a ver como es posible enviar SMS desde una aplicación de .NET (C#, VB.NET)

Para este tutorial necesitaremos dos cosas:

  • Un teléfono móvil con bluetooth
  • Un ordenador portátil con bluetooth

La gran mayoría de los móviles tienen bluetooth, no asi los portátiles, avisados quedáis  🙂

Lo primero que tenemos que hacer es activar el servicio bluetooth tanto en el móvil como en el portátil. Cuando hacemos esto y desde el portátil nos conectamos vía bluetooth con el móvil (nos pedirá una contraseña y tal) en el ordenador se "instalan" una serie de puertos serie:

Lo primero que tenemos que averigurar es que puerto serie es el que usa la conexión bluetooth para enviar los mensajes.

Desde la barra de tareas, pulsamos en 1 y luego con el botón derecho en el icon del bluetooth (2):

Pulsamos en "Abirir configuración":

En nuestro caso se puede utilizar el COM13:

También  hay otra forma de averiguar el puerto físico del modem del móvil. Pulsamos en "Mostrar dispositivos Bluetooth":

A continuación con el botón derecho pulsamos en "Control" sobre el dispositivo bluetooth en cuestión:

En esta pantalla pulsamos en "Configurar dispositivo":


(Haz click para ampliar)

En la pestaña "Módem" vemos el puerto serie:

En nuestro caso, podemos usar tanto el puerto COM11, como el COM13.

Bien, una vez llegados a este punto ya lo tenemos todo listo.

¿Cómo se envían SMS desde una aplicación, por ejemplo C# o VB.NET?

Usaremos lo que se conoce como comandos AT.

Los comandos AT se usan para comunicarse directamente con los modems, y en este caso en particular, con "el modem" del teléfono móvil.

Básicamente de lo que se trata es de abrir una comunicación con el puerto serie en cuestión y enviar una serie de comandos, así de simple. En nuestro caso, para el envío de SMS los comandos son los siguientes:

AT
AT+CMGF=1
AT+CSCA="+mi_numero_telefono"
AT+CMGS="+numero_destino"
Mensaje + (Control+Z)

Nota: El carácter Control+Z es el carácter ASCII 26 decimal

El interface de la aplicación es este:

Y aquí el resultado (tomado con la webcam del portátil):

 

Mini-explicación para "torpes":

  • En principio los "Settings" 9600,n,8,1 tienen que funcionar. No hace falta que cambies estos valores
  • El "Handshaking" a mi me funciona con el valor "Ninguno"
  • A mí no me ha hecho falta que activar las señales de DTR ni RTS
  • En mi caso particular, tengo que poner los números con el +34 delante, por ejemplo: +346xxxxxxxx tanto en mi número como en el destinatario
  • Aunque pongas como tú numero un número "inventado" el destinatario va ha seguir viendo tu número real
  • El texto está limitado a 140 carácteres. Tener en cuenta que los carácteres especiales, como la "ñ", o caracteres que contienen acentos en realidad se cuentan como 2 carácteres. Por ejemplo, la palabra "camion" tiene 6 carácteres, pero la palabra "camión" tiene 7. ¿Me explico? 🙂

Pues bien, imagínate las posibilidades que puede dar esto. Todo esto surgió porque ayer ví en la tele está notícia: Más de 1.000 pamploneses se apuntan al sms que "salva" de la grúa

En la tele se vió el interface del programa que usaban los del "hay-untamiento" y se pudo ver claramente el icono típico de Visual Studio en el caption del formulario, tal y como se ve aquí:

Y aquí os dejo un enlace al vídeo (empieza en el minuto 23)

Ahora, usad vuestra imaginación, yo personalmente lo usaré mañana para "programar" los SMS típicos de fin de año 🙂

Nota: He incluido también el ejecutable por si alguien quiere probarlo y no tiene el Visual Studio para compilar el código. Es necesario el .NET Framework 3.5 (Vista y 7 ya lo llevan). Qué lo disfrutéis.

 

Saludos.
mov eax,ollydbg; Int 13h  

Descargar proyecto .NET Tutorial 35
(26 KB. Visual Studio 2008)

Descargar binarios del .NET Tutorial 35
(16 KB. Requiere .NET Framework 3.5) 

 

.NET Tutorial 34. XNA y pixel perfect collision

En el tutorial 16 vimos como verificar colisiones 2d usando "regiones". Usando XNA vamos a ir un paso más allá. En vez de realizar la comprobación por regiones veremos que es posible verificar las colisiones a nivel de pixeles, lo cual es mucho más preciso y da un poco igual la "forma" de nuestros sprites.

Al igual que en el tutorial 16 tendremos lo siguiente:


(Haz click para agrandar)

Por defecto se evalúa la colisión solo cuando hay intersección entre las dos regiones:

Aunque pulsando la tecla I se evaluará siempre la colisión:


(Haz click para agrandar)

Y aquí el resultado de la colisión a nivel de pixel:

Pues bien, ¿cómo se consigue realizar una colisión a nivel de pixels?

Pues usando la propiedad GetData que incorpora XNA.

En nuestro código tenemos lo siguiente:

Private Boss As Texture2D
Private BossTextureData() As Color

Private Player As Texture2D
Private PlayerTextureData() As Color

Tanto  Boss como Player representan las texturas que se cargan desde el Content de XNA, mientras que BossTextureData y PlayerTextureData representan un array unidimensional con los datos de cada pixel: Canal Alfa, Red, Green y Blue.

Las texturas se cargan tal y como hemos visto en los tutoriales anteriores:

Boss = Content.Load(Of Texture2D)("finalboss_0001")

La información de los pixels de la textura los cargamos así:

ReDim BossTextureData((Boss.Width * Boss.Height) – 1)
Boss.GetData(BossTextureData)

Al utilizar GetData estamos guardando toda la información de los pixels en BossTextureData.
Como veis, es un array unimensional de objetos Color.

Al ser unidimensional, ¿Cómo accedemos al pixel de la posición (100, 35) ?

Pues así:

Color = BossTextrureData (x + y*AnchoTextura)

o lo que es lo mismo:

Color = BossTextureData (100+35*AnchoTextura)

Recordareis que la componente Alfa es la Color.A, la componente "roja" es la Color.R, la verde la Color.G y la azul la Color.B

Si en el área de colisión (marcada de amarillo en este tutorial) la componente alfa del boss es <> 0 y además si la componente alfa del jugador es <> 0 hay pixels "que se están pisando" dentro de esa regió, por lo tanto, hay colisión.

Fácil, limpio y realmente rápido 🙂

Podemos usar tambén esta técnica para realizar esto:

Nota: El vídeo es de un remake del Bruce Lee de spectrum y que voy actualizando cuando tengo algo de tiempo y ganas 🙂

En este caso, tengo una "máscara" que le dice al jugador por donde puede pisar o escalar. Se utiliza la misma técnica que la colisión por pixels.

 

Saludos.
mov eax,ollydbg; Int 13h  

Descargar proyecto .NET Tutorial 34
(180 KB. Visual Studio 2008 Professional / XNA GS 3.1)

Descargar binarios del .NET Tutorial 34
(788 KB. Requiere .NET Framework 3.5 / XNA Framework 3.1

 

Espiando a la vecina del sexto

En la entrega anterior (Tutorial 25) vimos como "interceptar" los mensajes de una aplicación y como interactuar con ellos.

En esta ocasión vamos a "interceptar" todo el escritorio de nuestra vecina, de tal modo que en nuestro ordenador estaremos viendo "en tiempo real" su escritorio.

Este tipo de aplicaciones se las conoce como "herramientas de asistencia remota", que de alguna forma permiten tomar el control del PC al que estamos dando asistencia.

Existen muchas herramientas de esto tipo, quizás la más conocida sea VNC (en sus distintas variantes: TeamViewer, UltraVNC, TightVNC, RealVNC, etc).

Tambien existe software comercial tipo PC AnyWhere, RemoteAdmin o incluso LogmeIn que puede funcionar también via web.

Incluso (si me equivoco ruego me perdonen) el MSN tiene disponible una opción para que un amigo tuyo tome el control de tú PC.

En el ejemplo que nos ocupa hoy solo vamos a capturar el escritorio, no podremos interactuar con el equipo remoto de ninguna forma, cosa que no ocurre con todos los programas anteriormente citados.

En la solución que acompaña a este tutorial existen dos proyectos: 

  • Cliente
  • Servidor

El cliente es el programa que se ejecuta en el PC que se quiere controlar.
El servidor es el programa que se ejecuta normalmente en nuestro PC.

Por norma general, el servidor tiene que estar corriendo cuando un cliente se conecte al servidor, ya que lo primero que se pide al iniciar el cliente es la dirección IP del servidor. Tened esto en cuenta cuando estéis ejecutando la solución.

Podemos ejecutar el servidor y cliente en el mismo PC, básicamente para ver que la "cosa" funciona:


(Haz click para agrandar)

Al hacerlo así, en la captura de pantalla se verá la propia interfaz del servidor y dentro de ésta una copia y dentro otra copia y así hasta el infinito y más allá.

Lo interesante viene cuando se está mirando el escritorio de la vecina:


(Haz click para agrandar)

El servidor tiene un par de opciones para decirle al cliente el tamaño de la captura de pantalla del escritorio. A más tamaño es necesario más ancho de banda.

También dispone de otra opción para indicarle al cliente cada cuanto tiempo éste tiene que realizar las capturas de pantalla y enviarlas al servidor. A menos tiempo más ancho de banda se necesita pero las imagenes se verán mas fluídas.

Por último el cliente se muestra como un icono en el área de notificación. Para cerrarlo simplemente dile a tu vecina que  pulse en dicho icono y seleccione "Exit".

 

Y con esto, todo por hoy. Si alguién tiene alguna duda o quiere comentar algo, me dijeron que el botón Comentar no se desgasta 🙂

 

Saludos.
mov eax,ollydbg; Int 13h

 

Descargar código fuente del Ollydbg Remote Desktop Viewer
(68 KB. Visual Studio 2008)  

 

.NET Tutorial 32. Aplicaciones Multilingües usando recursos y CultureInfo

Incluir soporte para multiples lenguajes es una de esas características que hacen que nuestras aplicaciones destaquen sobre las demás.

¿A qué os dá mucha "rabía" que el juego "X" no esté traducido al español?. Muchas veces debido a ese motivo se dejan de vender juegos. Pues con las aplicaciones ocurre lo mismo.

Además, si das soporte para varios lenguajes es posible que tu aplicación tenga más éxito de lo que en un principio habías imaginado.

Como todo, existen varias formas de conseguir que una aplicación esté disponible en varios idiomas.

Hay quien utiliza bases de datos, documentos XML, ficheros csv, etc.

Dichos métodos son válidos como cualquier otro. Sin embargo lo que os intentaré explicar en este tutorial tiene una "ventaja" sobre el resto:  En tiempo de diseño podrás ver la aplicación traducida. De esta forma podrás comprobar rápidamente que todos los controles están traducidos sin necesidad de ejecutar la aplicación.

Para ello usaremos una carácteristica muy interesante que tiene Visual Studio: Los recursos y el Namespace Globalization.

Bien, manos a la obra 🙂

Nota: El código que veréis en este tutorial es mínimo, por no decir prácticamente nulo. El "trabajo duro" es hacer la traducción, pero bueno, nosotros somos programadores (o eso intentamos :). De la traducción que se encargue el departamento de marketing / traducción 🙂

A la hora de insertar los controles en nuestro formulario normalmente los insertamos en nuestro idioma habitual, aunque si eres "masoquista" seguramente pongas los textos en lenguaje klingon, pero bueno, eso lo dejaremos para otro día (risas y descojone total 🙂 

Nuestra "super-aplicación" además tiene un menú para cambiar de idioma:

De tal forma, que al pulsar sobre el idioma correspondiente, todos los controles de la aplicación se traducirán al idioma seleccionado. Además de traducir los idiomas, todos los texto que mostramos por ejemplo en unMessageBox también estarán traducidos. 

Pues bien, una vez diseñado el formulario nos fijaremos en una propiedad interesante para nosotros, Language. Veréis que por defecto el valor de esa propiedad es (Predeterminado):


(Haz click para agrandar la imagen)

Sin embargo, al desplegar dicha opción se mostrarán un montón (pero un montón de verdad) de idiomas, incluso alguno de ellos que ni conocías, ¿Igbo?…¿Hola? O_o

Nuestra super-appz en principio estará en estos idiomas:

  • Español (es)
  • Inglés (en)
  • Francés (fr)
  • Ruso (ru-RU)
  • Japonés (ja-JP)
  • Chino simplificado (zh-CHS)

Nota sabionda: Como sabréis dentro de cada idioma existen variantes culturales.Existe el "español de Argentina", el "español de México", … aunque tambíen existe el "francés de Francia", el "francés de Canadá",…
Por eso, en principio en distinta la "configuración cultural" es-ES (español estádar) que la "configuración" es-AR (español de Argentina)

Pues bien, lo que haremos es cambiar la propiedad Language y seleccionaremos por ejemplo Inglés. Al hacer esto verás que automáticamente la propiedad Localizable se pone a True.

Una vez hecho esto cambiaremos por ejemplo el titulo del formulario (obviamente en inglés). Al hacer esto verás que automáticamente se ha creado un nuevo fichero de recursos con el nombre Form1.en.resx (pulsa en el icono "Mostrar todos los archivos" en el explorador de soluciones) :


(Haz click para agrandar la imagen)

Bien, sigamos. Traducimos el resto de controles del formulario (repito, obviamente al inglés):

Y por último el menú:

Si ahora pulsas en el archivo Form1.en.resx verás que contiene una seriede "recursos". La columna nombre hace referencia a la propiedad del control, mientras que la columna Valor, como su nombre indica es el valor de dicha propiedad:


(Haz click para agrandar la imagen)

La "gracía" del asunto es que una vez hecho todo esto, si cambias la propiedad Language en el formulario y la vuelves a poner en (Predeterminado) verás que los controles vuelven a estar en español.

Como verás he cambiado la propiedad Language al Francés y he "traducido"(google) los textos de los controles y el menú. Lo mismo para el Ruso de Rusia, el japonés de Japón y el Chino simplificado.

Resultado: 

Bien, con esto, los controles del formulario ya están traducidos. Ahora vamos a traducir los "textos" que no forman parte de los controles, comopor ejemplo aquellos textos que muestras en un MessageBox.

Añadiremos un nuevo elemento a nuestro proyecto, en este caso un Archivo de recursos, al que llamaremos Textos.resx :


(Haz click para agrandar la imagen)

Aquí es donde pondremos nuestros textos traducidos:

La idea es que cuando en el código hagas algo como esto:

MessageBox.Show (rm.GetString("ID1"))

se muestre "La contraseña es correcta" si la aplicación está en español, o que se muestre "Correct password" si la aplicación está en inglés o "??????"si a alplicación está en chino

Al igual que antes, tendremos que tener un archivo de recursos para cada uno de los idiomas:


(Haz click para agrandar la imagen)

Aquí es importante que los archivos se llamen todos "Textos.xxxx.resx", donde xxxx representa la cultura del idioma en cuestión.

Por eso podéis ver que los archivos se llaman Textos.en.resx, Textos.fr.resx, Textos.ja-JP.resx,…

Código para el cambio del idioma.

Es algo "tan complicado" como esto:

ChangeLocaleCultureRunTime("ru-RU")

Esa línea hace que el formulario y los textos se muestren en ruso

Para cambiar al chino:

ChangeLocaleCultureRunTime("zh-CHS")

Al Francés:

ChangeLocaleCultureRunTime("fr")

En esta aplicación de pruebas se pedirá que introduzcamos una contraseña.

Si la contraseña es "1234" se mostrará un mensaje diciendo que la contraseña es correcta, de lo contrario se mostrará otro mensaje diciendo que la contraseña no es correcta.

Bien, iniciamos la aplicación (que por defecto estará en español):

Al pulsar en la opción "Japonés" se mostrará todo el formulario en "Japonés". Si introducimos "123" en la caja de texto para el password y damos al botón "Aceptar" se muestra esto:

Estando en "Japonés" cambiamos el idioma el "Inglés":

Al pulsar en el botón "Aceptar" se muestra:

Ahora cambiamos al "Chino":

Ponemos la contraseña "correcta": 1234

Al pulsar en el botón "Aceptar" se muestra "La contraseña es correcta" en Chino:

Si ahora cambiamos a español:

Lo vemos todo en español:

Y al pulsar en el botón "Aceptar":

 

Cuando examinéis el código veréis que unicamente hay un procedimiento de 11 líneas llamado ChangeLocaleCultureRunTime( )

Como véis, más simple imposible. 🙂

Para finalizar, si mirais tanto en la carpeta Debug como Release veréis que se han creado unas carpetas. En dichas carpetas esta la dll que contiene los recursos traducidos:

 

Bien, pues con esto ya tenéis una base para poder hacer aplicaciones multilingües

??????? 🙂

 

Saludos.
mov eax,ollydbg; Int 13h 

 

Descargar código fuente del .NET Tutorial 32
(226 KB. Visual Studio 2008)