Ampliar el espacio en la Raspberry Pi

Aumentar el espacio de nuestra partición en la Raspberry Pi

Cuando creamos una nueva SD con el sistemas Raspbian para nuestra Raspberry PI, da igual la versión de esta, la partición de trabajo que nos crea es de 4 Gb, si la actualizamos, o si le instalamos cualquier programa, este espacio rápidamente se nos agota.

Raspberry Pi 2
Raspberry Pi 2

Para que la partición donde esta instalado el sistema utilice todo el espacio disponible de nuestra SD tendremos que seguir los siguientes pasos.

Para realizar esta tarea Raspbian nos ofrece un programa «raspi-config», este programa nos permite configurar varios parámetros de nuestra Raspberry, como puede ser cambiar la contraseña del usuario, activar la cámara, opciones de inicio, y como no, expandir nuestra partición hasta usar todo el espacio de la tarjeta SD donde tengamos instalado nuestro sistema.

Para ampliar el espacio de nuestra partición ejecutaremos el comando «raspi-config» con derechos de administrador.

sudo raspi-config

Una vez ejecutado el comando nos aparecerá la siguiente pantalla.

ampliar espacio en nuestra raspberry pi
Pantalla del comando raspi-config

Para ampliar el espacio de nuestra raspberry pi seleccionaremos la primera opción «Expand Filesystem», después de unas comprobaciones nos mostrara la siguiente pantalla.

particion-redimensionada
Partición de nuestro sistema Raspbian redimensionada,

Con esta la partición ha cambiado de tamaño ajustándose al total de nuestra tarjeta SD. Para que los cambios surtan efecto tendremos que reiniciar nuestra Raspberry Pi. Pulsamos en «OK» y volvemos a la pantalla anterior.

Una vez en la pantalla principal seleccionaremos la opción de «Finish» y salimos del programa.

Nos mostrara otra pantalla indicándonos si queremos reiniciar nuestra Raspberry Pi, le indicamos que «Yes» y nuestra Raspberry Pi se reiniciara.

Reiniciar nuestra Raspberry Pi
Reiniciar la Raspberry Pi para activar los cambios

Una vez que la Raspberry Pi se haya reiniciado, podemos verificar que la Raspberry Pi utiliza todo el espacio con el siguiente comando,

df -h

Este comando nos mostrara el tamaño, espacio disponible y usado de las particiones que tengamos creadas en nuestro sistema. En nuestro caso la que nos interesa en la partición de «/dev/root» que sera prácticamente el tamaño de nuestra SD.

Verificar-particionesUna vez realizada la comprobación, ya tenemos nuestro sistema ejecutándose en la Raspberry Pi utilizando todo el espacio disponible en la SD.

Si tienes algún nota o duda,  déjanos un comentario.

Personalización imagen ISO de VMWare ESXi 6.0 para un laboratorio de pentesting (II)

Personalización imagen ISO de VMWare ESXi 6.0

El principal problema que nos encontramos al instalar un sistema con VMWare ESXi 6.0 es la falta de drivers, principalmente, para las tarjetas de red. Este problema se resuelve fácilmente con añadir a nuestra iso de VMWare ESXi 6.0 el driver que necesitemos.
Para hacer esto podemos usar el script en PowerShell de “ESXi-Customizer-PS”, este script nos permitirá no solo personalizar nuestra iso de ESXi de la versión 6.0, si no también las versiones 5.0, 5.1 y 5.5. Tampoco tendremos que descargar la iso desde la web de VMWare para realizar la personalización, el script ya se encarga de descargar la iso de la versión que deseamos personalizar. El script también dispone de varios drivers de tarjetas de red, por que tampoco nos tendremos que preocupar de buscar los drivers de nuestra tarjeta.
Personalización imagen ISO ESXiPara hacer la personalización lo primero que tenemos que hacer es descargar el script desde la pagina de “VMware Front Experience”, también tenemos que tener instalado el PowerCLI de VMWare y la versión de PowerShell en la versión 2.0 o superior.

Inicio con ESXi-Customizer-PS

Para ejecutar el script solo tendremos que abrir una consola de PowerShell. Una vez abierta nos movemos hasta la carpeta donde tenemos descargado el script de ESXi-Customizar-PS,

cd Carpeta-de-descargar-script

Una vez en la carpeta de descarga ejecutamos el scrpit

ESXi-Customizer-PS-v2.4.ps1

Con esto simplemente descargaremos la imagen iso de ESXi de la versión 6.0 desde la pagina de VMWare sin ninguna modificación, una versión básica .

Parámetros de ESXi-Customizer-PS

Para ver los parámetros del script solo tenemos que ejecutar el script con el parámetro -help

ESXi-Customizer-PS-v2.4.ps1 -help

Los principales parámetros disponibles son los siguientes.

Versión de la imagen iso que vamos a utilizar:

  • -v50: Versión de ESXi en la versión 5.0.
  • -v51: Versión de ESXi en la versión 5.1.
  • -v55: Versión de ESXi en la versión 5.5.
  • -v60: Versión de ESXi en la versión 6.0.
ESXi-Customizer-PS-v2.4.ps1 -v55

Utilizamos la versión 5.5  del VMWare ESXi.

Cargar los drivers desde la pagina de «VMware Front Experience» o desde una carpeta local

Para indicar al script que dirvers queremos cargar en nuestra imagen iso personalizada usaremos el parámetro -load, este parámetro crga los drivers desde la pagina de VMWare Front Experience o desde la carpeta local, los drivers que queramos instalar los pondremos después del parámetro separados por «,» (comas).

ESXi-Customizer-PS-v2.4.ps1 -load net-r8168, net-e1000e

Este ejemplo nos creara una imagen iso del VMWare ESXi de la versión 6.0 con los drivers para tarjetas de red con el chip R8168 y E1000e, la imagen iso se guardara en la misma carpeta donde se encuentra en script.

Eliminar drivers y otro paquetes de la imagen iso basica.

Igual que podemos agregar nuevos drivers y paquetes a la imagen iso básica de ESXi, podemos eliminar paquete desde esta misma imagen iso. Para ello solo tenemos que ejecutar el script con el parámetro -remove

ESXi-Customizer-PS-v2.4.ps1 -remove net-r8168, net-e1000e

Este ejemplo haría lo contrario que el ejemplo anterior, eliminaría los drivers de la tarjeta de red con el chip R8168 y E1000E.

Obtener una lista con las imágenes iso disponibles

En ocasiones necesitamos personalizar una versión en concreto de ESXi, para obtener una lista con las isos disponibles en la web de VMWare podemos usar el parámetro -sip. El script se conectara con la web de VMWare y obtendrá un lista con las isos disponibles y un numero, al final del listado de las isos, el script nos pedirá que introduzcamos el numero correspondiente a la isos que queremos utilizar.

ESXi-Customizer-PS-v2.4.ps1 -sip

Indicar la carpeta para guardar la imagen iso personalizada

Si queremos que la imagen iso personaliza que nos creara el script se guarde en una carpeta distinta a la del script, se lo tendremos que indicar con el parámetro  -outDir <Ruta del directorio>

ESXi-Customizer-PS-v2.4.ps1 -outDir c:\ESXi\Salida

Indicar el nombre del fichero de la imagen iso personalizada

Además de poder indicar en que directorio vamos a guardar nuestra imagen iso personalizada, también podemos indicar el nombre del fichero que queremos utilizar. Esto lo podemos hacer con el parámetro -ozip <nombre del fichero>

ESXi-Customizer-PS-v2.4.ps1 -outDir c:\ESXi\Salida -ozip fichero-esxi.iso

Indicar la carpeta local donde se encuentran los drivers, en formato VIB

Para indicar al script donde se encuentran los drivers que no están disponibles online, sino que están descargados en nuestra maquina utilizaremos el parámetro -pkgDir <Directorio>

ESXi-Customizer-PS-v2.4.ps1 -outDir c:\ESXi\Salida -pkgDir c:\Drivers\ESXi\Personalizados

Hay más parámetros, pero estos son los básicos para poder agregar los drivers que necesitemos para poder instalar el sistema de VMWare ESXi en nuestro equipo.

 

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.