martes, 28 de mayo de 2013

Interfaz para dispositivos con S.O. iOS de control de servicios de un hogar digital

Por fin puedo mostrar imágenes del que hasta ahora ha sido mi proyecto mas ambicioso. Compendio de tecnologías: iOS, Servicios Web y OpenGL ES. 
No hubiera sido posible sin la ayuda del DTIC de la Universidad de Alicante y su maravilloso Middleware DAI. 







martes, 12 de marzo de 2013

glProject para iOS con OpenGL ES

Otra de las cosas que me ha estado trayendo de cabeza es la integración de la versión OpenGL ES y iOS. Debido a que esta es una versión reducida, no existen muchas de las funciones de integración entre contextos y ventanas de visualización, GLUT. Para la obtener las coordenadas de un objeto 3D en la ventana de un iPAD, hemos de desarrollar una proyección. Para ello he tenido que generar una versión que me de respuesta a este problema, aquí os dejo este algoritmo:


int glhProjectf(float objx, float objy, float objz, float *modelview, float *projection, int *viewport, float *windowCoordinate)
{
    //Transformation vectors
    float fTempo[8];
    //Modelview transform
    fTempo[0]=modelview[0]*objx+modelview[4]*objy+modelview[8]*objz+modelview[12];  //w is always 1
    fTempo[1]=modelview[1]*objx+modelview[5]*objy+modelview[9]*objz+modelview[13];
    fTempo[2]=modelview[2]*objx+modelview[6]*objy+modelview[10]*objz+modelview[14];
    fTempo[3]=modelview[3]*objx+modelview[7]*objy+modelview[11]*objz+modelview[15];
    //Projection transform, the final row of projection matrix is always [0 0 -1 0]
    //so we optimize for that.
    fTempo[4]=projection[0]*fTempo[0]+projection[4]*fTempo[1]+projection[8]*fTempo[2]+projection[12]*fTempo[3];
    fTempo[5]=projection[1]*fTempo[0]+projection[5]*fTempo[1]+projection[9]*fTempo[2]+projection[13]*fTempo[3];
    fTempo[6]=projection[2]*fTempo[0]+projection[6]*fTempo[1]+projection[10]*fTempo[2]+projection[14]*fTempo[3];
    fTempo[7]=-fTempo[2];
    //The result normalizes between -1 and 1
    if(fTempo[7]==0.0)        //The w value
        return 0;
    fTempo[7]=1.0/fTempo[7];
    //Perspective division
    fTempo[4]*=fTempo[7];
    fTempo[5]*=fTempo[7];
    fTempo[6]*=fTempo[7];
    //Window coordinates
    //Map x, y to range 0-1
    windowCoordinate[0]=(fTempo[4]*0.5+0.5)*viewport[2]+viewport[0];
    windowCoordinate[1]=(fTempo[5]*0.5+0.5)*viewport[3]+viewport[1];
    //This is only correct when glDepthRange(0.0, 1.0)
    windowCoordinate[2]=(1.0+fTempo[6])*0.5;  //Between 0 and 1
    return 1;
}
Esta versión implementada en C++, ha de ser llamada por las clases de Objective-C. Para ello estas clases deben de tener la extensión .mm.

Generación Certificados SSL para IIS 5.1

La realización de procesos relativamente sencillos en tecnologías y versiones actuales, son excesivamente complicados en versiones antiguas. Uno de los casos que recientemente me he encontrado es la de generación de certificados para servicios web y paginas web en SSL para poder lograr una encriptación en la comunicación de los mismos. Este tutorial trata de explicar este proceso:
Partimos de una versión de 5.1 de Internet Information Server en Window. El desarrollo comienza con la instalación tanto de la web como del servicio web de forma similar a la realización sin ningún tipo de seguridad. Para ello hemos de copiar en la carpeta c:\inetpub\wwwroot las carpetas de nuestras aplicaciones, y realizar el proceso de creación a traves de IIS.
Posteriormente procedemos a generar los certificados:
Vamos a IIS-> Botón Derecho en Sitio Web Predeterminado->Propiedades->Pestaña Seguridad de Directorios. 
En comunicaciones seguras->Certificado de servidor->Generamos certificado. En este proceso hemos de seleccionar la opción de realizar un certificado exportable.
Esto nos generara en C:\ un archivo llamado certreq.txt.
Ahora necesitaremos un programa denominado OpenSSL descargable desde http://www.openssl.org/source/. Lo instalamos  en C:\ 
Entramos en C:\OpenSSL-Win32\bin y ejecutamos:
  • openssl genrsa -des3 -out CA.key 1024, aquí nos pedirá indicar una contraseña que luego tendremos que indicar de nuevo
  • openssl req -new -key CA.key -x509 -days 1095 -out CA.cer (Si aquí nos da un error, ejecutamos antes) (1*)
  • (1*) set OPENSSL_CONF=c:\OpenSSL-Win32\bin\openssl.cfg y luego ejecutamos la anterior sentencia. Al ejecutar nos pedirá datos de la empresa a la que queremos generar el certificado.
  • Por último ejecutamos: openssl x509 -req -days 730 -in c:\certreq.txt -CA CA.cer -CAkey CA.key -CAcreateserial -out SelfSignedCert.cer
  • Esto nos enlazara el archivo certreq.txt creado antes y nos generara uno nuevo llamado SelfSignedCert.cer en C:\OpenSSL\bin\SelfSignedCert.cer. Este será el que habrá de utilizar el Taller para conectarse al servicio web.
Una vez generado esto nos vamos de nuevo a IIS->Sitio Web Predeterminado. Botón derecho y en la pestaña Seguridad de Directorios pulsamos de nuevo Certificado de Servidor. Aquí continuamos con el proceso iniciado y deberemos de seleccionar el nuevo certificado generado que está en  C:\OpenSSL\bin\SelfSignedCert.cer.
Bien, una vez hecho esto nos vamos IIS->Web de Autoservice->Botón derecho->Propiedades->Pestaña Seguridad de Directorios y en la sección Comunicaciones Seguras-> Pulsamos en Modificar. Marcamos Requerir Canal Seguro->Aceptamos->Aplicamos
Este proceso ha de hacerse una única vez, dándonos la opción de poder tener varios servicios web o web.
Si todo ha ido correctamente, ya podremos acceder a ellos a través de https:\\
No obstante os pongo los enlaces que he utilizado: