es impresionante, la pereza que me da programar por hobbye... pero al fin lo he hecho.
Tal y como tenía pensado desde un principio.
He hecho una nueva función en la librería que vengo desarrollando desde hace ya tiempo, que ha pasado por varias modificaciones, incluso por ser rescrita casi por completo: Adsl.au3, que he ido compartiendo por aquí.
Precisamente, en el momento en que la escribí prácticamente de cero, eliminé una función (La que calculaba la velocidad de bajada de la conexión a internet) ;).
Acabé bastante harto de la librería
;)
y esta función en su primera versión era un poco incómoda de usar, ya que se requería de un servidor con soporte de PHP, montar un pequeño script PHP (del que se proporcionaba código fuente) en el servidor...
Así pues, decidií quitar esa función de la librería, hasta encontrar una forma más elegante de hacerlo, ya que había mejorado bastante el código de la UDF. Y por fin, he encontrado la forma y lo mejor: ¡La he implementado! :).
En realidad, la forma la tenía ya pensada desde el momento en que rescribí la librería, como comentaba aquí:
http://www.emesn.com/autoitforum/viewto ... dad#p11655
Por aquel entonces empezaba a tener una idea de como medir la velocidad de bajada de la conexión a internet, en base a lo que iba leyendo.
Ahora, me he puesto a calcular (por encima) antes de meterme con el código y parecía bastante fiable. Así, que me he puesto a ello y he hecho la función _AdslGetDownloadSpeed(), que calcula la velocidad de bajada de la conexión a internet.
Además, permite indicar como queremos que nos devuelva la velocidad: en kilobits por segundo, kilobytes por segundo o (aunque poco usual) megabytes por segundo.
Esta última opción normalmente devolverá "0", ya que ha de ser muy muy rápida la conexión, para descargar un mega por segundo ;).
Además, para facilitar al programador que la use, que pueda hacer un informe detallado del test de velocidad, la función también devuelve el tiempo que se ha tardado en calcular la velocidad de bajada. Este valor lo devuelve en segundos y en milisegundos.
Lo he hecho basándome en la idea que tenía, de descargar bytes del código fuente de una página fiable en cuanto a estabilidad (finalmente me he decantado por la de Microsoft en inglés, porque la de Google que es la que hubiera querido usar por cargarse bastante más rápido, redirecciona según el país y eso fastidia la función) pero no me he complicado controlando el tiempo durante el que se descargan los datos. Símplemente descargo el código de la página, calculo los bytes que contiene con StringLen() y paso la cantidad a kilobits, kilobytes o megabytes, según se reciba en el parámetro de la función. Luego, divido el resultado entre los segundos que se ha tardado en cargar los datos y listo, obtengo la velocidad.
La verdad, es que podría afinarse un poco más.
Por ejemplo, como he aprovechado una función interna que hace todo el lío de conectar con el servidor, enviarle las cabeceras HTTP, obtener la respuesta del servidor... (esta función ha sido actualizada para recibir bloques de "1" byte" del servidor), pues se calcula algo más de tiempo del que se tarda realmente en descargar el código de la web, ya que también se envían las cabeceras HTTP al servidor y claro, esto lleva tiempo, por poco que sea.
Esto supondrán pocos milisegundos más, pero si se solucionara de alguna forma afinaría más el cálculo de la velocidad. Pero habría que tocar bastante código para hacerlo aprovechándose de la función interna que tiene la librería.
Y hacer código para manejar la conexión con el servidor sólo para esta función sería igual de engorroso y ocuparía bastante también...
Así, que bueno. como da la velocidad más o menos, de momento lo he dejado así.
De todas formas, si encontráis un fallo, una forma mejor de hacerlo o lo que sea, será bienvenido. Creo que la fórmula que he usado para calcular la velocidad es correcta, si no lo es corregidme.
Aquí un pequeño ejemplo de uso de esta función:
Código: Seleccionar todo
#Include "Adsl 3.0.1.au3"
Global $Speed
$Speed=_AdslGetDownloadSpeed(1)
Msgbox(0, "", " Test de velocidad:"&@CRLF&@CRLF&"Velocidad de bajada: "&$Speed[1]&" kbps."&@CRLF&"Tiempo empleado para el test: "&$Speed[3]&" segundos ("&$Speed[2]&" milisegundos)."&@CRLF&@CRLF&" ***Los datos de este test son aproximados, dependientes de varios factores que condicionan la velocidad de la conexión a internet.***")
Exit
Pues porque aunque creo que debe funcionar, he de probar lo de enviar datos a un servidor...
He de ver que el servidor no se desconecte si recibe cualquier cosa, etc etc.
Lo malo, es que una cosa es descargar el código de una página, que es al fin y al cabo una visita a esta. Pero otra muy distinta, es cargar datos al servidor... Lo digo, por eso de que puede suponer un problema para el dueño del servidor, ya que si mucha gente comprobara la velocidad de subida enviándole datos a su servidor...
Por eso, esto es más delicado y hay que ver una forma fiable de hacerlo, sin fastidiar ningún servidor.
¿Ideas?.
Se me ocurre, intentar estudiar algún test de velocidad (que seguro que sube datos a un servidor), ver la dirección de ese servidor e intentar subirlos con AutoIt. Pero aunque la teoría es sencilla, tiene miga por lo que hablaba en el post que he puesto más arriba, por el flash y/o javascript.
Espero que os guste.
Salu2!