Todas las entradas de: pruebas

Instalación VMWare ESXi 6.0 para un laboratorio de pentesting (I)

Instalación VMWare ESXi 6.0

Con  ESXi de VMware permite crear un sistema virtualizado sin tener que destinar muchos recursos al sistemas host o anfitrión. El sistema ESXi instala una versión básica de linux para poder ejecutar el software de virtualización. No dispone de ningún entrono gráfico, solo tiene unas opciones básicas para poder configurar el sistema, como puede ser la  tarjeta de red y su dirección IP tanto con versión IPv4 como IPv6. La configuración del teclado.  si permite el acceso a la consola del sistema remotamente, etc.

Los requerimientos básicos para poder instalar un ESXi 6 son:

  • Procesador de 64 bits de al menos 2 núcleos.
  • Tarjeta de red de 1 Gb.
  • Memoria de 4 Gb.
  • Disco duro de 1Gb.

Casi todas las placas de equipos montados con especificaciones de servidor no tendrán problemas con estas expecificaciones. Pero si lo vamos ha instalar en un equipos de tipo «domestico» hay muchas probabilidades, aunque la tarjeta de red sea de 1 Gb, que la instalación WMWare ESXi 6.0  no la reconozca. Eso no quiere decir que no podas instalar el ESXi en esa placa, pero si que tengamos que personalizar la imagen ISO del ESXi y añadirle el driver de nuestra tarjeta. Otro problema que nos podemos encontrar es, si el equipo en el que vamos ha realizar la instalación, tiene solo 4 Gb de memoria y tenemos un tarjeta gráfica con memoria compartida, esto hará que no podamos instalar el sistemas. La única solución que hay para esto es, si podemos desactivar la tarjeta gráfica, y liberar esa memoria que usa la tarjeta gráfica,  e instalar otra tarjeta externa, o bien, si no podemos hacer el cambio, aumentar la memoria ram.

Podemos descargar el fichero iso desde la propia pagina web de VMware. Para ello solo tendremos que crear una cuenta en la pagina de VMWare, ir a la zona de descargas de VMWare y descargar la imagen.

Como crear una unidad de USB con la imagen ISO del ESXi 6.

Para crear un usb con la imagen de instalación VMWare ESXi 6.0, podemos utilizar el programa Rufus. Este programa nos permitirá copiar la imagen a nuestra unidad usb sin ninguna complicación. Solo le tendremos que indicar en que dispositivo usb queremos cargar la unidad y el fichero iso que vamos a utilizar. Después del proceso ya tendremos nuestro usb listo para poder arrancar nuestro equipo con él e instalar VMWare ESXi 6.0.

Crear sub con ESXi 6.0
Crear USB arrancable con VMWare ESXi 6.0 y Rufus

Instalar VMWare ESXi 6.0 desde una unidad USB.

Al iniciar la instalación nos aparece un menú con la opción de arrancar la instalación de ESXi  o arrancar desde el disco local. Pulsamos «intro» sobre «ESXi-6.0-XXXXXXXXXX-standard installer» e iniciamos la instalación del sistema.

Instalación VMWare ESXi 6.0 imagen 1
Menu de arranque de VMWare ESXi 6.0

 

 

 

Después se realizara la cargar de los archivos básicos para poder realizar la instalación VMWare ESXi 6.0.

Instalación VMWare ESXi 6.0 imagen 2Despues de terminar de cargar los ficheros necesarios se ejecutara el instalador del VMWare ESXi 6.0

Instalación VMWare ESXi 6.0 imagen 3Si después de la pantalla de arriba, nos muestra esta pantalla de error, y nuestro equipo dispone de la tarjeta de red, es que el instalador de ESXi 6.0 no reconoce la tarjeta de red, y debemos personalizar nuestra iso de instalación VMWare ESXi 6.0.

Instalación VMWare ESXi 6.0 imagen 4
Error de adptador de red no encontrado en VMWare ESXi 6.0

Si todo a ido correctamente, y la tarjeta de red, la memoria, y demás características básicas se han cumplido nos aparecerá esta para iniciar la instalación VMWare ESXi 6.0

Instalación VMWare ESXi 6.0 imagen 5

Lo siguiente que nos pide el disco donde vamos ha realizar la instalación de sistema anfitrión.

VirtualBox_ESXi 6.0_07_01_2016_19_29_26
Seleccionar el disco donde se quiere instalar el sistema anfitrión

Si en el disco que hemos seleccionado ya existiera una instalación de VMWare nos indicara, si queremos hacer una instalación nueva, o si por lo contrario, queremos realizar una actualización del sistema ya instalado.

VirtualBox_ESXi 6.0_07_01_2016_19_29_51Lo siguiente que nos queda es seleccionar el idioma de la instalación.

VirtualBox_ESXi 6.0_07_01_2016_19_30_11
Seleccionar el idioma para la instalacion del VMWare ESXi 6.0

Contraseña del usuario root del sistema.

VirtualBox_ESXi 6.0_07_01_2016_19_30_34
Contraseña para el usuario root del sistema anfitrion del VMWare ESXi 6.0

Y confirmamos la instalación.

VirtualBox_ESXi 6.0_07_01_2016_19_32_05Después de realizar la copia de los ficheros y las configuraciones pertinentes, y si todo ha salido bien, nos aparecerá la siguiente pantalla, confirmándonos que la instalación a terminado satisfactoriamente, y que se procederá a reiniciar el equipo.

VirtualBox_ESXi 6.0_07_01_2016_19_33_52
Sistema instalado correctamente

Pantalla que nos indica que el sistema esta reiniciando.

VirtualBox_ESXi 6.0_07_01_2016_19_34_08 Y si el arranque no ha tenido ningún problema, esta sera la pantalla que nos aparezca. Ya tenemos el sistema instalado y ejecutándose.

VirtualBox_ESXi 6.0_07_01_2016_19_35_44
Pantalla principal del sistema VMWare ESXi 6.0 ya funcionando

A partir de aquí, solo nos queda instalar los sistemas que queremos que se ejecuten en nuestro sistema virtualizado, pero eso sera en otro post.

Si tienes alguna duda o sugerencia puedes dejar un comentario.

 

Como escribir en un tarjeta SD con Arduino

Como escribir en un tarjeta SD con Arduino

como escribir en un tarjeta SD
Adaptador SD para arduino

En nuestros proyectos muchas veces necesitamos como escribir en un tarjeta SD con Arduino para almacenar la información que nos devuelve los sensores en algún lugar para después poderlos descargar y procesarlos en nuestro equipo.

 

Materiales usados

Arduino UNO Arduino UNO
 Arduino Shield SD Shield para SD
protoboard Protoboard
cables_union Cables de conexión

Escribir y leer en una tarjeta SD desde arduino

La mejor forma para realizar eso, es aprovechas la multitud de accesorios que hay para Arduino  que incorpora ranuras para tarjetas SD (Arduino Wireless SD Shield).

Para trabajar con tarjetas SD, Arduino (Arduino Uno R3) dispone de una librería que nos facilita el trabajo de como escribir en un tarjeta SD. La librería que tenemos que incluir en nuestros programas es

#include <SD.h>

Esta librería, aparte de incorporar las funciones básicas para escribir y leer fichero, también dispone de varias funciones para el manejo de la tarjeta, como puede ser espacio disponible, formato de la tarjeta, manejo de fichero (creación y eliminación de ficheros), lectura y escritura de ficheros, etc.

Conexión del lector de tarjetas SD con Arduino

Para la comunicación del lector de tarjeta SD (SD Card Reader Module Slot Socket For Arduino ARM MCU) y el microcontrolador se utilizan 4 puertos digitales, lo habitual, por lo menos en los accesorios que he podido manejar, los puertos que manejan son los siguientes:

  • En el pin digital 4: SD_CS.
  • Pin 11: SD_DI.
  • En el 12 conectar: SD_DO.
  • y en el pin 13: SD_CLK.

Se podrían usan otros y configurarlos, pero la mayoría de los accesorias que soportan tarjetas SD (Samsung Evo MB-MP16DA/EU – Tarjeta de memoria Micro SDHC de 16 GB (UHS-I Grade 1 Clase 10, con adaptador SD)), suelen ser shield, tarjetas que se conectan directamente en los pines del Arduino. No pudiendo modificar los pines que utilizan.

El formato de archivos que soporta el Arduino es FAT16 o FAT32, y el el tamaño máximo de la tarjeta SD que suele soportar es de hasta 16Gb (Samsung Evo MB-MP16DA/EU – Tarjeta de memoria Micro SDHC de 16 GB (UHS-I Grade 1 Clase 10, con adaptador SD)).

Leer un fichero en la tarjeta SD desde Arduino

Para como escribir en un tarjeta SD tendremos que crear un objeto que sera el que se encargue de realizar las operaciones de escritura y lectura.

Declaración del objeto para el maneje de fichero.

File miFichero;

Una vez que hemos declaro el objeto, le asignaremos el fichero con el que queremos trabajar y el modo de apertura, podemos indicar la apertura en modo “FILE_WRITE”, este modo nos permitirá abrir el fichero en modo lectura y escritura, si el fichero no existiera, Arduino lo crearía y lo abriría, si por el contrario, el fichero ya existiera, Arduino lo abriría y las escrituras que realicemos, las haría al final del archivo.

MiFichero = SD.open(“Nombre_Fichero.ext”, FILE_WRITE);

Leer un fichero desde la tarjeta SD desde Arduino

Si lo que queremos es solo abrirlo para lectura solo los tendremos que abrir de esta otra forma.

MiFichero = SD.open(“Nombre_Fichero.ext”);

Si el fichero no existe, esta operación provocara un error. Para comprobar que un fichero existe la librería de SD de Arduino nos proporciona la siguiente función.

SD.exists(“Nombre_Fichero.ext”)

Nos devolverá true, su el fichero existe, por lo contrario, si no existe, nos devolverá false. Una vez que hemos abierto el fichero, solo nos queda escribir o leer de el. Para leer solo tenemos que utilizar la función “println” de la siguiente forma.

MiFichero.println(“Información a guardar en el fichero”);

Pero si lo que queremos es leer del fichero, utilizaremos esta otra función.

MiFichero.read();

Esta función nos devolverá un byte leído desde el fichero.

Si lo que queremos es leer una linea, por ejemplo, los haríamos de la siguiente manera.

Byte byteLeido;
String Cadena = “”;
while (miFichero.available())
{
    byteLeido = miFichero.read();
    if (byteLeido == 13)
    {
        break;
    }
    else
    {
        Cadena = Cadena + char(byteLeido);
    }
}

Después de terminar nuestras operaciones con el fichero, solo nos queda nada mas que cerrarlo. Para ello utilizaciones la función “close”.

MiFichero.close();

Esto hará que cerremos todas operaciones con el fichero.

Estas son solo una pocas funciones disponibles para  la lectura/escritura de como escribir en un tarjeta SD con Arduino (Arduino Uno R3), pero muchas otras disponibles, para obtener más información sobre la librería SD de Arduino puede consultar este enlace. https://www.arduino.cc/en/Reference/SD

Hacer ping con visual C#

h-pingLa forma más fácil de comprobar que un equipo esta “vivo” en nuestra red es haciendo un ping. Lo que hace este comando es enviar un paquete ICMP al equipo que queremos verificar, el equipo al recibir este paquete devuelve una confirmación de recepción. Con esta acción ya hemos comprobado que el equipo esta funcionando y conectado.

Cuando nuestro programa en Visual C# tiene que conectarse a cualquier otro equipo, nos puede interesar antes de ejecutar las funciones de conexión es si ese equipo esta disponible o no. Podemos confirmarlo fácilmente haciéndole un ping.

Hacer ping con Visual C#

En la biblioteca de .Net “System.Net.NetworkInformation” tenemos disponible una función que nos hará ese trabajo. Para poder usarla tendremos que agregar a nuestro proyecto la siguiente referencia “System.Net”, podemos agregar tambien el namespace “System.Net.NetworkInformation” para facilitar el trabajo con las funciones.

Para hacer ping tendremos que crear dos objetos, un objeto “ping” como tal, este el que enviara el paquete ICMP. Y el objeto PingReply, este manejara la información devuelta.

Ejemplo de uso:

Ping HacerPing = new Ping();
int iTiempoEspera = 5000;
PingReply RespuestaPing;
string sDireccion;
sDireccion = txtIP.Text;
RespuestaPing = HacerPing.Send(sDireccion, iTiempoEspera);
if (RespuestaPing.Status == IPStatus.Success)
{
    txtLog.AppendText("Ping a " +
        sDireccion.ToString() +
        "[" +
        RespuestaPing.Address.ToString() +
        "]" +
        " Correcto" +
        " Tiempo de respuesta = " +
        RespuestaPing.RoundtripTime.ToString() +
        " ms" +
        "\n")
}
 else
{
    txtLog.AppendText("Error: Ping a " +
        sDireccion.ToString() +
        "\n");
}

Explicación:

Creamos el objeto Ping.

Creamos una variable de tipo “int” para almacenar el tiempo de espera, este valor esta en milisegundos.

Creamos el objeto PingReply para el manejo de la respuesta del ping.

Variable de tipo “string” donde guardaremos la dirección IP del equipo que queremos verificar.

Hacemos el Ping, le pasamos como parámetros los la dirección Ip que queremos comprobar y el valor de tiempo de espera en milisegundos, este ultimo parámetro es opcional, indicándole la dirección Ip o el nombre del equipo seria suficiente. La respuesta se la pasamos al objeto PingReply.

Para comprobar el estado comprobamos el valor que nos devuelve PingReply.Status, este valor es del tipo “IPStatus”. Para saber si ha sido satisfactorio solo tenemos que comprobar que el estado es “IPStatus.Success”. Si se ha producido un error podemos comprobar el tipo de estado devuelto del “IPStatus”. Más información sobre “IPStatus” en la librería de MSDN

Desde el objeto PingReply podemos obtener otras informaciones, como puede ser la dirección Ip de la maquina remota, el tiempo que se ha tardado en realizar, valor devuelto en milisegundos, opciones que se ha utilizado para el envio del paquete ICMP o el buffer de los datos recibidos por el ICMP.

Personalizar la serialización de tipos en XML

Serialización con XML
Serialización con XML

Cuando queremos guardar en fichero XML alguna estructura de datos podemos recurrir a la serialización.

Con las funciones actuales disponibles para el manejo de XML en C# la serialización de estructuras de datos es relativamente sencilla. Pero el problema nos surge cuando en la estructura de datos hay algún tipo de objeto que, o no nos interesa el modo en que hace la conversión, por la razón que sea, o por que la serialización de ese objeto no esta soportada.

Para solucionar este problema C# nos proporciona los atributos [XMLIgnore], para indicarle al proceso de serialización que ignore ese objeto, y [XmlElement], donde le indicamos como se va ha convertir ese objeto.

Para indicar al proceso de serialización del XML que ese objeto lo ignore, solo tendremos que anteponer el atributo [XMLIgnore] delante del objeto que queremos. Por ejemplo:

[XmlIgnore]
public Image Imagen { get; set; }

En este caso el tipo “Image” no soporta serialización, por lo que la conversión la tendremos que realizar nosotros mismos.

Una que le hemos dicho que ignore ese objeto le tenemos que indicar como vamos a convertirlo. Para ello tendremos que crear nuestra función de conversión he indicarle que la use en para ese elemento. Para indicarle que objeto vamos a utilizar solo tenemos que utilizar el atributo [XmlElement(“Nombre_del_objeto”], le indicamos el nombre que le hemos dado al objeto, no el tipo. Por ejemplo:

[XmlElement("Imagen")]
public byte[] ConvertImageToByte
{
    // Devolvemos una cadena de byte cuando nos pasan la imagen
    get
        {
            byte[] ImagenByte = null;
            // Si el valor pasado es distinto a null, pasamos la conversión, sino pasamos null
            if (Imagen != null)
            {
                // Convertimos la imagen en un array de byte[]
                ImageConverter ConvertirImagen = new ImageConverter();
                ImagenByte = (byte[])ConvertirImagen.ConvertTo(Imagen, typeof(byte[]));
            }
        return ImagenByte;
    }

    // Devolvemos una imagen cuando nos pasan una cadena de byte[]
    set
    {
        // Si el valor pasado es null
        if (value == null)
        {
            // Devolvemos otro null
            Imagen = null;
        }
        else
        {
            // Convertimos el array de bytes[] en una imagen
            ImageConverter ConvertirImagen = new ImageConverter();
            Imagen = (Image)ConvertirImagen.ConvertFrom(value);
        }
    }
}

En el ejemplo se utiliza el objeto “Imagen” del ejemplo anterior que es de tipo “Image”, que no esta soportado por la serialización de XML. Lo que hacemos es convertilo en un array de byte para poderlo guardar en el fichero.

La parte del “get” la serialización de XML la utilizara cuando va ha grabar los datos, leeremos desde el objeto “Imagen” la imagen que queremos y con ayuda de la función “ImageConverter” la convertimos en un array de byte, le indicamos el formato que vamos a utilizar en el segundo parámetro que le pasamos a la función en este caso “typeof(byte[]).

ImageConverter ConvertirImagen = new ImageConverter();

ImagenByte = (byte[])ConvertirImagen.ConvertTo(Imagen, typeof(byte[]));

La parte del “set” la serialización de XML la usa cuando lee los datos desde el fichero de XML. Le pasara la cadena de byte que tiene grabada y cargara en la variable “Imagen” la imagen es su formato correcto, tipo “Image”. Para la conversión volvemos a utilizar la función “ImageConverter”, en este caso nos devolverá un objeto, para pasárselo a la variable solo tenemos que indicar que ese objeto es de tipo “Image”

ImageConverter ConvertirImagen = new ImageConverter();
Imagen = (Image)ConvertirImagen.ConvertFrom(value);

Si lo aplicamos a un objeto que es de un tipo soportado por la serialización de XML, lo que hará, sera ignorar su método de serialización y utilizar el que le indiquemos.

Si tienes alguna sugerencia sera bienvenida, deja un comentario.

Ajustar color de la fuente según el color de fondo en Visual C#

En ocasiones podemos necesitar ajustar el color de la fuente según el color del fondo del control. Por ejemplo poner el color de la fuente a blanco, por que el color del fondo es negro, o de cualquier otro color oscuro.

Esto se puede hacer calculando en nivel del color. Para este calculo yo utilizo la siguiente formula.

double coefienteOscuridad = 0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B;

Lo que hacemos es crear un coeficiente multiplicando cada valor de los calores básico por un coeficiente, ya que según el color básico hará que el color final sea mas o menos oscuro. Y por ultimo sumamos los resultado.

Según el valor devuelto podemos jugar con el color que deseemos.

Por ejemplo, si el coeficiente “coefienteOscuridad” es superior a 100, el color de la fuente sera negro, y por el contrario si el coeficiente es inferior el color de la fuente lo pongo a blanco.

El valor 100 lo he sacado de probar diferentes colores y ver como se distingue el texto.

Podemos jugar con el para ajustar el color de la fuente al color que más se ajuste a nuestras necesidades.

Ejemplo completo, en este ejemplo ajusta el color de la fuente, ha blanco o negro, de una celda de un dataGridView según el color de fondo de la celda:

// Calculamos el color de fondo para ajustar el color de la fuente
Color color = e.CellStyle.BackColor;
double coefienteOscuridad = 0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B;
// Indice de oscuridad
if ( coefienteOscuridad > 100)
{
// si el color es claro, el texto lo ponemos de color negro
e.CellStyle.ForeColor = Color.Black;
}
else
{
// si el color es oscuro, el texto lo ponemos de color blanco
e.CellStyle.ForeColor = Color.White;
}

Y con esto ya tendríamos ajustado el color de nuestra fuente para que sea totalmente legible, independientemente del color del fondo.

Si tienes alguna sugerencia o duda, no tengas ningún reparo en escribir un comentario.

Ejecutar aplicaciones con permisos de administrador en Visual Studio c#

En algunas ocasiones necesitamos que nuestras aplicaciones se ejecuten con lo privilegios de administrador. Para hacer esto en una aplicación desarrollada con Visual C# tenemos que añadir a nuestro proyecto un fichero de “Archivo de manifiesto de aplicación”. Para agregar el fichero, accedemos “Proyecto” – “Agregar nuevo elemento”, y seleccionamos “Archivo de manifiesto de aplicación”.

Captura_Agregar_Nuevo_Elemento

Esto nos creara el fichero “app.manifest”.

Captura_Archivo_manifiesto_aplicacion
Este fichero contiene varias opciones de configuración, pero las opciones que nos interesan son:

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

<!-- Opciones del manifiesto de Control de cuentas de usuario

Si desea cambiar el nivel de Control de cuentas de usuario de Windows, reemplace el

nodo requestedExecutionLevel por alguno de los siguientes.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
La especificación del nodo requestedExecutionLevel deshabilitará la virtualización de archivos y del Registro.

Si desea usar la virtualización de archivos y del Registro para la compatibilidad

con versiones anteriores, elimine el nodo requestedExecutionLevel.

-->

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

</requestedPrivileges>

requestedPrivileges
En la parte comentada nos muestra los niveles disponibles:

asInvoke: Nivel de seguridad por defecto.

requireAdministrator: Nivel de seguridad como administrador.

highestAvailable: Nivel de seguridad el mayor posible.

Para indicar que nuestra aplicación va a trabajar con nivel de seguridad de administrador, solo tenemos que copiar la linea:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

requestedExecutionLevel_administrador
de la parte comentada, y sobre escribir:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

de la parte no comentada.

requestedExecutionLevel_administrador_sobreescrito
Después de guardar los cambios, si le damos al botón de “Inicar”, el Visual Studio se reiniciara para ejecutarse con permisos de administrado.

Si ejecutamos el ejecutable de la aplicación nos mostrar la típica ventana para aceptar los privilegios de administrador.

OPC el idioma de los sistemas industriales

La comunicación de los sistemas industriales siempre a sido un tema muy complicado. Cada fabricante de plc’s utilizaba un sistema de comunicación propio, sin ofreces ningún tipo de información a tercera partes para poder realizar productos que pudieran trabajar con el. Esto hacia que el montaje de un sistema fuera complicado, ya que te tenias que basar en los productos que el fabricante elegido te ofrecía.

PROBLEOPC

Pero esto, se terminó con la aparición del sistema OPC, (OLE for Process Control, por sus siglas en ingles) es un sistema creado en un principio por Microsoft para la comunicación de sistemas industriales. En la actualidad este estándar esta gestionado por la fundación OPC Foundation. La aparición de este protocolo ha permitido una comunicación mas fácil entre los sistemas de control, sistemas SCADA, HMI, etc. con los sistemas de control, PLC’s.

SOLUCIOPC

En un principio este estándar se basó en la tecnología de Microsoft, Este, se baso en la tecnologia OLE, que emplea el formato COM/DCOM, que Micorosft desarrolo para el intercambio de innfomarcion entre aplicaciones y sistemas, como es normal, pero con el traspaso de la gestión a la fundación, esta ha impulsado un sistema libre, sin basarse en ninguna tecnología propietaria.

Por eso en la actualidad, con la versión UA, se puede encontrar desarrollos de sistemas OPC para cualquier sistema, ya se Windows, Linux, OsX, etc. Aunque el sistema principal, y el que dispone de un mayor catalogo de productos para el desarrollo sigue siendo Windows. Esto es debido en parte utilización de este sistema por parte de la industria de equipos industriales.

RTEmagicC_oemgatewayproxy_08.png

En la actualidad podemos encontrar librerías para el desarrollo para cualquier sistema, .Net, Python, Java, etc.

 

 

Leer coordenadas de un gps en python

gps-iconLos gps, no los navegados que son otra cosa, suelen devolver la información obtenida mediante el protocolo NMEA. Este protocolo define la información que podemos obtener del gps y como esta sera trasmitida.

Para obtener las coordenadas del gps tenemos que esperar a recibir una la sentencia $–GGA, esta tiene el siguiente formato:

$–GGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh

Formato:

  • $–GGA: Indica que la información es la posición, hora, e información relacionada con el gps. Los dos guiones (–), pueden ser cualquier cosa, pero normalmente suele ser «GP», es raro encontrar un gps que cambie esta definición.
  • hhmmss.ss: Hora a la que fue tomada esas coordenadas.
  • 1111.1111: latitud, en formato ggmm.ssss, los segundos en formato decimal. Esta es una de la información que me interesa.
  • a: Esto indica en que hemisferio se ha tomado las coordenadas si en el norte (N) o en el sur (S).
  • yyyyy.yyyy: Longitud, lo mismo que la latitud, pero nos da las coordenadas de la longitud. Tiene el mismo formato.
  • a: Lo mismo que para el hemisferio norte y sur, pero en esta caso indicando «E» para el este y «W» para el oeste.

Los demás campos están relacionados con el numero de satélites, calidad de la señal del GPS, altitud a la que nos encontramos, etc.

El gps que estoy utilizando, es un gps bluetooth, que una vez que lo he enlazado con el ordenador me crea un puerto serie, en mi caso con linux «/dev/rfcomm0». Una vez que lo tenemos conectado solo tenemos que conectarnos en python utilizando la librería pyserial.

Para pasar el formato de las coordenadas devuelto por el gps, a unas coordenadas normales en el formato ggº mm’ ss.ss» lo he hecho del siguiente modo.

Para separar cada unos de los campos utilizo en comando «split», pasándole como parámetro «,». Este nos devuelve cada campo en una posición de una tabla, utilizando la coma como separador.

vCampos = vSentenciaNMEA.split(',')

Los campos que nos interesan, para la conversión de las coordenadas están en la posición 2, latitud y en la 4, longitud. Y los campos 3, para saber si estamos en el norte o en el sur, y el campo 5, para el este o el oeste.

Con esto ya podemos tratar las coordenadas como más nos interés.

Si tienes algún consejo, recomendación o alguna duda utiliza los comentarios.

Nuevo Raspberry Pi 2, nuevas novedades

Nuevo Raspberry Pi 2
Raspberry Pi 2

Hace poco salio a la venta la nueva versión de este pequeño ordenador, el  nuevo Raspberry Pi 2, que nos ha dado muchas alegrías, y aun más dolores de cabeza.

Nuevo Raspberry Pi 2

La versión de este nuevo Raspberry Pi 2 (Raspberry Pi 2 Quad Core Starter Bundle) entre sus nuevas características, trae como procesador un nuevo RM11 ARMv7 ARM Cortex-A7 de 4 núcleos a una velocidad de 900 MHz, y de memoria disponemos de 1Gb de tipo LPDDR2 SDRAM a 450 MHz.

El el tema de los gráficos el procesador que incorpora es el Broadcom VideoCore IV 250 MHz. OpenGL ES 2.0 .

La tarjeta de red sigue siendo la misma que en versiones anteriores, En este aspecto se puede echar un poco de menos no poder contar con un puerto de red a 1 Gigabit.

Pero la ampliación de del procesador y de la memoria le abren nuevas posibilidades.

Nuevo Raspberry Pi 2
Raspberry Pi 2

Raspberry contara con una versión de Windows 10

Aunque no soy muy forofo de los sistemas de Microsft, sobre todos de estos últimos (Vista, Windows 8 o 8.1), creo que Microsoft se ha centrado mucho en copiar los iPad y intentar ser los primeros en tener un sistema como el de las tables en el pc, Pero como funcionamos en una tablet es muy distinta a como trabajamos en un pc, la verdad, no veo a ninguna secretaria sobando la pantalla y dejando las huellas en ellas.

Pero buena al caso, Microsoft esta desarrollando un versión de su ultimo sistema para el nuevo Raspberry Pi 2.

Me imagino que los de Microsoft se han dado cuenta que los protagonistas de los próximos sistemas sera el tan de moda últimamente «Internet de las cosas». Y por ello no querrán perderse este  nuevo mercado.

Casi todos los sistemas que montan en la actualidad los equipos de control de estos dispositivos suelen venir con Linux, no estoy hablando de sistemas industriales, que estos suelen seguir trabajando con Windows, aunque las nuevas versiones ya suelen montar bastantes sistemas Linux, muchos de los coches, por ejemplo, que actualmente equipan sistemas inteligentes de control, en su interior tienen un Android, que no deja de ser un Linux.

También me imagino que desechara el interface de usuario que utilizan en la actualidad, por otro más practico. Pero de eso no estoy seguro, son Microsoft y son los amos del mercado.

Conclusión

Debido ha esta ultimas mejoras, en potencia y velocidad, los de Raspberry Pi dan un puñetazo en la mesa a los últimos intentos de otros fabricantes, como puede ser a Intel, que ofrecían mayor potencia pero a un coste mayor. Los de Raspberry Pi demuestran, de nuevo, que se puede tener más con menos, ya que el precio de los nuevos no varia con respecto a los de las versiones anteriores. Hay que recordar que de la primera versión se ha llegado ha vender más de 5,5 millones de unidades.

Relacionado

Pagina oficial de Raspberry Pi 2

Como obtenerlo Raspberry Pi 2 Quad Core Starter Bundle

Como devolver una imagen al «SRC» de un IMG con PHP

GD-Graphics-LibraryEn algunas ocasiones se necesita personalizar algún fichero de imágenes en nuestra web dependiendo de cualquier cosa, cambiar la foto del usuario, cambiar un logotipo, etc.

Lo fácil es poner en el propio «src» de la etiqueta «IMG» el código de php que cargue el nombre de la imagen que queremos cargar.

Algo parecido a esto:

<img src="<?php echo $nombre_de_la_imagen; ?>" width="256" height="200" />

Pero esto si tenemos muchas imagen a procesar seria un poco engorroso, sobre todo a la hora de actualizar.

Para evitar tener que duplicar código hay varios métodos, el más común seria crearnos una función en nuestro fichero de funciones globales,  pero rebuscando por google encontré otra solución que me pareció a lo menos curiosa.

Y esta es hacer que el propio fichero de php nos devuelva la imagen, no la ruta al fichero que contiene la imagen, sino la propia imagen. Una cosa como esto.

<img src="http://www.todavianose.com/imagen.php?fichero=4c86b5285ef7ca3bab" width="256" height="256" alt="Texto alternativo" longdesc="Descripcion larga" />

Una de las funciones que nos permite esto, es crear nuestro propio sistema de captcha, o crear una imagen de algún texto que no queramos que los robots que pululan por la red lo puedan indexar.

Para hacer esto lo que tenemos que hacer lo primero, es indicar que los datos que vamos ha devolver desde el fichero de php son una imagen, esto en php se hace con las siguientes funciones.

header("Content-type: tipo de mime");

Donde «tipo de mime» le indica el formato en el que le vamos ha enviar los datos, para imágenes lo tenemos que cambiar por:

  • image/jpeg: le indicamos que los datos que va ha recibir están en formato de iamgen jpeg.
  • image/png: los datos que le vamos ha enviar están en formato png.
  • image/gif: lo mismos pero en formato gif.

No solo podemos indicarle que lo que vamos ha enviar es una imagen, también podemos decirle que es otro tipo de archivo como por ejemplo un fichero pdf (application/pdf), un fichero de audio en formato mp3 (audio/x-mpeg-3), en esta pagina hay una lista con todos los tipo de mimes que podemos utilizar.

Y ya podemos enviar al «scr» el fichero de la imagen con el siguiente comando de php

readfile("ruta-al-archivo");

Utilizando la libreria GD, podemos crear nuestras propias imágenes, si quieres saber algo mas sobre estas funciones solo tienes que ver los comandos que hay disponibles.

Un ejemplo completo quedaría de la siguiente forma.

<?php
// Cargamos la imagen a mostrar
$archivo='usuario.png';
header("Content-type: image/png");
header("Content-length: ".filesize($archivo));
header("Content-Disposition: inline; filename=$archivo");
readfile($archivo);
// Fin crear imagen
?>

Y con esto estaría, si tienes alguna duda o sugerencia puedes dejar un comentario.