<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rubén Hinojosa Chapel - Blog personal &#187; Movilidad</title>
	<atom:link href="http://www.hinojosachapel.com/category/movilidad/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hinojosachapel.com</link>
	<description>Consultoria empresarial, Tecnologias .NET, Desarrollo web y Comunicacion digital. Investigacion y Desarrollo en Musica Algoritmica.</description>
	<lastBuildDate>Fri, 16 Jul 2010 17:39:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Cómo encender el teléfono en Windows Mobile con C#</title>
		<link>http://www.hinojosachapel.com/2010/02/como-encender-el-telefono-en-windows-mobile-con-c.aspx</link>
		<comments>http://www.hinojosachapel.com/2010/02/como-encender-el-telefono-en-windows-mobile-con-c.aspx#comments</comments>
		<pubDate>Thu, 25 Feb 2010 19:53:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Movilidad]]></category>
		<category><![CDATA[Tecnologías .NET]]></category>

		<guid isPermaLink="false">http://www.hinojosachapel.com/?p=673</guid>
		<description><![CDATA[Recientemente un cliente me pidió, como parte de los requerimientos del proyecto, que para realizar ciertas acciones en su aplicación de Windows Mobile se encendiera y apagara el teléfono automáticamente, sin que el usuario tuviera que intervenir. Concretamente, la aplicación tiene que abrir una conexión de datos GPRS, conectarse a un webservice situado en un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; "><a href="http://www.hinojosachapel.com/wp-content/uploads/2010/02/encender-telefono.png"><img class="aligncenter size-full wp-image-677" title="encender-telefono" src="http://www.hinojosachapel.com/wp-content/uploads/2010/02/encender-telefono.png" alt="encender-telefono" width="350" height="502" /></a></p>
<p>Recientemente un cliente me pidió, como parte de los requerimientos del proyecto, que para realizar ciertas acciones en su aplicación de Windows Mobile se encendiera y apagara el teléfono automáticamente, sin que el usuario tuviera que intervenir. Concretamente, la aplicación tiene que abrir una conexión de datos GPRS, conectarse a un <em>webservice</em> situado en un servidor de Internet, e intercambiar cierta información con éste. El teléfono no se utiliza para comunicaciones de voz, sólo de datos.</p>
<p>Como era una tarea que nunca antes había realizado, tuve que recurrir a Google para intentar encontrar la solución, alguna solución cercana, a alguna pista que me llevara hacia ella. Pronto la decepción se apropió de mí. Por más que buscaba y buscaba cómo encender el teléfono de Windows Mobile con C#, no encontraba nada, a pesar de que la búsqueda la realizaba en Inglés, <a title="El Inglés es el idioma más extendido en Internet" href="http://www.internetworldstats.com/stats7.htm" target="_blank">el idioma más extendido en la red</a>.</p>
<p>Sin embargo, aunque lentamente, poco a poco me fui acercando a la solución. La causa de la falta de respuestas era que no estaba escribiendo la pregunta correcta. Para un usuario común puede que la frase &#8220;encender el teléfono&#8221; le resultara natural, pero en términos más técnicos el enfoque correcto es &#8220;encender la radio del dispositivo móvil&#8221;. Y en Inglés. Algo así como: <a title="Buscar con Google: turn radio on and off windows mobile c#" href="http://www.google.com/search?q=turn+radio+on+and+off+windows+mobile+c%23&amp;btnG=Buscar&amp;hl=es&amp;lr=&amp;rlz=1C1CHNG_esES344ES344&amp;sa=2" target="_blank">turn radio on and off windows mobile c#</a>. Aunque en este contexto existen otros posibles sinónimos de <em>turn</em>, como <em>switch</em> o <em>toggle</em>.<br />
<span id="more-673"></span><br />
Resulta que en la ROM del dispositivo existe una dll no documentada llamada <strong>ossvcs.dll</strong>, que exporta funciones para controlar los Dispositivos de Radio (<em>Radio Devices</em>). Es decir, los módulos de Bluetooth, Teléfono y Red Inalámbrica (WiFi). <strong>Ossvcs.dll</strong> exporta las funciones por un número de orden y no por su nombre. Estas funciones pertenecen a un API no administrado, por lo que para invocarlas desde nuestro código C# necesitaremos declarar los prototipos mediante p/Invoke. Las funciones que necesitamos son las siguientes:</p>
<p><strong>[DllImport("ossvcs.dll", EntryPoint = "#276", CharSet = CharSet.Unicode)]<br />
private static extern uint GetWirelessDevice(ref IntPtr pDevice, int pDevVal);</strong></p>
<p><strong>[DllImport("ossvcs.dll", EntryPoint = "#273", CharSet = CharSet.Unicode)]<br />
private static extern uint ChangeRadioState(ref RDD pDevice, int dwState, int saveAction);</strong></p>
<p><strong>[DllImport("ossvcs.dll", EntryPoint = "#280", CharSet = CharSet.Unicode)]<br />
private static extern uint FreeDeviceList(IntPtr pDevice);</strong></p>
<p>Nótese cómo <strong>EntryPoint</strong> contiene el número de orden que identifica a la función invocada.</p>
<p>De las tres funciones, la que realmente nos interesa es<strong> ChangeRadioState()</strong>, porque justamente es la que nos permite cambiar el estado de la radio. Es decir, encenderla o apagarla. O dicho de forma llana, encender o apagar el teléfono.</p>
<p>He creado una clase llamada<strong> MobileRadio</strong>, que expone un único método público estático: <strong>SetDeviceState()</strong>. Este método acepta dos argumentos de tipo entero. El primero indica el tipo de dispositivo, y el segundo informa el estado al que se desea cambiar. El tipo de dispositivo puede ser uno de los siguientes: Bluetooth, el Teléfono o la Red Inalámbrica (WiFi). No necesitas conocer de memoria los valores enteros que se pueden traspasar. La clase <strong>MobileRadio</strong> exporta también dos estructuras (<strong>RADIODEVTYPE</strong> y <strong>RADIODEVSTATE</strong>) que contienen las constantes necesarias.</p>
<p>Para encender el teléfono basta la siguiente línea de código:</p>
<p><strong>MobileRadio.SetDeviceState(MobileRadio.RADIODEVTYPE.PHONE, MobileRadio.RADIODEVSTATE.ON);</strong></p>
<p>Y para apagarlo, ¿lo adivinas? <img src='http://www.hinojosachapel.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Para conocer el estado actual del teléfono, si está encendido o apagado, utilizamos la propiedad booleana <strong><a title="La propiedad PhoneRadioOff en la MSDN" href="http://msdn.microsoft.com/es-es/library/microsoft.windowsmobile.status.systemstate.phoneradiooff(en-us).aspx" target="_blank">PhoneRadioOff</a></strong> de la clase <strong>SystemState</strong>, situada en el espacio de nombres <strong>Microsoft.WindowsMobile.Status</strong>:</p>
<p><strong>Microsoft.WindowsMobile.Status.SystemState.PhoneRadioOff</strong></p>
<p>Esta propiedad es verdadera (<em>true</em>) si la radio del dispositivo está apagada, y falsa (<em>false</em>) en caso contrario.</p>
<p>Puedes descargar el proyecto completo desde <a title="Descargar Cómo encender el teléfono en Windows Mobile con C#: Código fuente" href="http://www.hinojosachapel.com/wp-content/uploads/2010/02/encendertelefono.zip">aquí</a>.</p>
<p><strong>Enlaces de interés:</strong></p>
<p><strong>Cómo encender el teléfono en Windows Mobile con C#<br />
</strong><a title="Cómo encender el teléfono en Windows Mobile con C#: Código fuente" href="http://www.hinojosachapel.com/wp-content/uploads/2010/02/encendertelefono.zip">El código fuente del proyecto</a></p>
<p><strong>Turn radio on and off as needed</strong><br />
<a title="Turn radio on and off as needed" href="http://community.intermec.com/t5/General-Development-Developer/Turn-radio-on-and-off-as-needed/m-p/138" target="_blank">http://community.intermec.com/t5/General-Development-Developer/Turn-radio-on-and-off-as-needed/m-p/138</a></p>
<p><strong>Controlling the Radio Devices</strong><br />
<a title="Controlling the Radio Devices " href="http://www.teksoftco.com/articles/article%20007/radiodevices.htm" target="_blank">http://www.teksoftco.com/articles/article%20007/radiodevices.htm</a></p>
<p><strong>Toggle WiFi/BT/Phone using .NET code only!!!</strong><br />
<a title="Toggle WiFi/BT/Phone using .NET code only!!!" href="http://forum.xda-developers.com/showthread.php?t=413159" target="_blank">http://forum.xda-developers.com/showthread.php?t=413159</a></p>
<p><strong>PInvoke.net: A wiki for .NET developers</strong><br />
<a title="PInvoke.net: A wiki for .NET developers" href="http://www.pinvoke.net/" target="_blank">http://www.pinvoke.net/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinojosachapel.com/2010/02/como-encender-el-telefono-en-windows-mobile-con-c.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cómo hacer una llamada telefónica en Windows Mobile con C#</title>
		<link>http://www.hinojosachapel.com/2009/08/como-hacer-una-llamada-telefonica-en-windows-mobile-con-c.aspx</link>
		<comments>http://www.hinojosachapel.com/2009/08/como-hacer-una-llamada-telefonica-en-windows-mobile-con-c.aspx#comments</comments>
		<pubDate>Thu, 06 Aug 2009 12:24:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Movilidad]]></category>
		<category><![CDATA[Tecnologías .NET]]></category>

		<guid isPermaLink="false">http://www.hinojosachapel.com/?p=582</guid>
		<description><![CDATA[Un teléfono móvil moderno, provisto de Windows Mobile, nos permite abrir archivos de MS Office, leer PDFs, hacer fotos, leer el correo electrónico, acceder a contenidos online por RSS, llevar la agenda de actividades, gestionar nuestros contactos, escuchar música, ver vídeos, chatear, jugar, ejecutar aplicaciones de un amplio rango&#8230; Además, por si no fuera suficiente, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-583" title="Aplicación Teléfono" src="http://www.hinojosachapel.com/wp-content/uploads/2009/08/telefono.jpg" alt="telefono" width="301" height="465" /></p>
<p>Un teléfono móvil moderno, provisto de Windows Mobile, nos permite abrir archivos de MS Office, leer PDFs, hacer fotos, leer el correo electrónico, acceder a contenidos online por RSS, llevar la agenda de actividades, gestionar nuestros contactos, escuchar música, ver vídeos, chatear, jugar, ejecutar aplicaciones de un amplio rango&#8230; Además, por si no fuera suficiente, también sirve para hacer llamadas telefónicas. <img src='http://www.hinojosachapel.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Realizar una llamada telefónica mediante código C# desde una aplicación nuestra de Windows Mobile es algo ridículamente simple, gracias a un recurso que Microsoft ha puesto a nuestra disposición: la clase <a title="Clase Phone" href="http://msdn.microsoft.com/es-es/library/microsoft.windowsmobile.telephony.phone(en-us).aspx" target="_blank">Phone</a>. Esta clase se encuentra definida dentro del ensamblado Microsoft.WindowsMobile.Telephony (en la DLL microsoft.windowsmobile.telephony.dll), por lo que debemos agregar una referencia a este ensamblado en nuestro proyecto de Visual Studio.<span id="more-582"></span></p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-584" title="Microsoft.WindowsMobile.Telephony" src="http://www.hinojosachapel.com/wp-content/uploads/2009/08/referencias.jpg" alt="Microsoft.WindowsMobile.Telephony" width="311" height="264" /></p>
<p>Ahora sólo nos resta declarar y crear un objeto de la clase <strong>Phone</strong>, y llamar a su método mágico: <a title="Método Talk() de la clase Phone" href="http://msdn.microsoft.com/es-es/library/aa455391(en-us).aspx" target="_blank">Talk()</a>.</p>
<p>Phone p = new Phone();<br />
p.Talk(numero);</p>
<p>Este método recibe como parámetro un texto (<em>string</em>) que representa el número al cual se desea llamar: public void Talk(string number).</p>
<p>El proceso no es silencioso. Realmente lo que hace es ejecutar (y mostrar) el programa <em>Teléfono</em> del sistema operativo. Delega en él todas las operaciones, como por ejemplo, colgar la llamada.</p>
<p>Puedes descargarte el proyecto completo desde <a title="Descargar proyecto de la aplicación Teléfono" href="http://www.hinojosachapel.com/wp-content/uploads/2009/08/telefono.zip">aquí</a>.</p>
<p>¿Y por qué necesitaríamos realizar llamadas telefónicas desde una aplicación propia? ¿Acaso para escribir una versión mejorada del programa nativo? Yo conozco al menos un caso en que sí es necesario acudir a esta funcionalidad. Hace algunos años tuve que desarrollar una <a title="Aplicación OIGAA" href="http://www.oigaa.com/howitworks/mobile.htm" target="_blank">aplicación de telecomunicaciones</a> que necesitaba, como parte de su funcionamiento, realizar llamadas automáticamente a un cierto número. La aplicación OIGAA convierte los teléfonos móviles en extensiones de la centralita corporativa, permitiendo a sus usuarios responder desde cualquier lugar como si estuvieran en la oficina, y ofreciendo además diversas funcionalidades de valor añadido. Aquí te dejo algunas capturas de pantalla de la aplicación ejecutándose en el emulador de dispositivos móviles.</p>
<ul>
<li><a title="OIGAA: Pantalla de autenticación" href="http://www.hinojosachapel.com/wp-content/uploads/2009/08/oigaa1.jpg">OIGAA: Pantalla de autenticación</a></li>
<li><a title="OIGAA: Conexión y actualización inicial de datos" href="http://www.hinojosachapel.com/wp-content/uploads/2009/08/oigaa2.jpg">OIGAA: Conexión y actualización inicial de datos</a></li>
<li><a title="OIGAA: Agenda de contactos. Posibilidad de iniciar una conexión de VoIP" href="http://www.hinojosachapel.com/wp-content/uploads/2009/08/oigaa3.jpg">OIGAA: Agenda de contactos. Posibilidad de iniciar una conexión de VoIP</a></li>
<li><a title="OIGAA: Configuración del tipo de llamada y el mensaje de presencia" href="http://www.hinojosachapel.com/wp-content/uploads/2009/08/oigaa4.jpg">OIGAA: Configuración del tipo de llamada y el mensaje de presencia</a></li>
</ul>
<p><strong>Enlaces de interés:</strong><br />
<a href="http://www.hinojosachapel.com/wp-content/uploads/2009/08/telefono.zip">Código completo del ejemplo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hinojosachapel.com/2009/08/como-hacer-una-llamada-telefonica-en-windows-mobile-con-c.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
