Página 1 de 1

Nueva versión de ADSL.au3: 3.0.1

Publicado: 29 Jun 2012, 00:19
por Jonny
¡Por fin!.

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
Seguro que os preguntáis, que por qué no calcula también la velocidad de subida, como todos los test de velocidad...

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!

Re: Nueva versión de ADSL.au3: 3.0.1

Publicado: 30 Jun 2012, 12:06
por Jonny
Bueno... He estado probando y reprobando la función con personas que dicen tener distintas velocidades de ADSL y parece no ir del todo bien.
Con tres megas parece ser que sí funciona. A mi, que tengo 6 megas me suele devolver quinientos y pico (a veces un poco menos) kbps y parece que con más velocidad se aleja bastante. Por ejemplo, me dijeron que en un ADSL de 10 megas devolvía "161"... y en una de ... 50 cuatrocientos y pico. O hago mal las cuentas, o la función no va como debe...

Así, que estoy viendo la forma de rescribirla, y probar como se comentaba en el post que puse en el mensaje anterior, a descargar realmente un archivo en vez de el código de una web.

Tras pensar, en que archivo podría usar de la web de Microsoft, que no vaya a cambiar: lo eliminen, cambien de nombre etc, he pensado que el Security essentials quizás no lo quiten del servidor ni lo cambien de ubicación ni de nombre de archivo ;).
Así, que ese es el que usaré, que además ocupa unas nueve megas y algo (más que de sobra para medir la velocidad de bajada).

Realmente no veo la diferencia, porque la fórmula se me ocurre que ha de ser la misma. Descargar: o bien datos durante un segundo y transcurrido este ver cuantos bytes se han descargado en ese tiempo y pasarlo a kilobits, kilobytes o lo que sea, o bien, descargar una cantidad determinada de datos (un mega por ejemplo) y una vez descargado, ver cuanto tiempo se ha tardado en hacer la descarga y dividir los bytes por el tiempo, para obtener los bytes por segundo. y convertirlo a la unidad que sea...

Habrá que probar, pero de momento sin hacer código no veo diferencia en el resultado que vaya a dar la función haciéndola de esta manera.

Lo bueno es, que no será difícil hacer el código, pues no sabía que AutoIt tuviese funciones nativas para descargar archivos. Yo pensaba hacerlo con _InetGetSource de la librería Inet.au3, que he visto que usa una función nativa de AutoIt.
Y lo mejor, es, que esa función ¡se puede ejecutar en segundo plano! :) y hay funciones para obtener info de la descarga, así que no hará falta liarse con bucles demasiado complejos etc.

¡A ver que sale ahora!

Salu2!

Re: Nueva versión de ADSL.au3: 3.0.1

Publicado: 30 Jun 2012, 16:06
por BasicOs
Buen aporte para medir la velocidad de la adsl
Salu22:)

Re: Nueva versión de ADSL.au3: 3.0.1

Publicado: 01 Jul 2012, 11:02
por Jonny
Bueno, ya casi tengo la función rescrita planteándola como ponía en el mensaje anterior. Pero pasa una cosa extraña con InetClose().

Resulta, que al comprobar los bytes leídos del archivo que uso para descargar datos, he hecho, que cuando se haya leído una cantidad determinada de bytes deje de descargar datos.
Para eso utilizo InetClose() pasándole el handle que devuelve InetGet(). Parece que deja de descargar datos, pero siempre devuelve "False", en vez de "True" como pone en la ayuda, que debería devolver si se cancela la descarga.

Además, no se si será normal, pero al llamar a InetGet() con el último parámetro fijado a "1" (ejecutar en segundo plano) en la ayuda pone que debe devolver un handle, y al comprobar lo que devuelve, veo que es un "1"...

En cambio, la función InetGetInfo() funciona perfectamente con el valor que retorna InetGet()...

En cualquier caso, ya casi está hecha la función faltará probarla y la cuelgo por aquí.

¿Sabéis por qué lo de las funciones Inet()?.

Salu2!

Re: Nueva versión de ADSL.au3: 3.0.1

Publicado: 23 Abr 2014, 01:32
por morkcop
Hola, veo que tienes mucha idea sobre los parametros que utilizar para conexiones a internet desde autoit, mi pregunta es, como puedo detectar si hay o no conexion a internet, pues tengo una conexion a internet que se desconecta a cada rato y me gustaria que se volviera a conectar automáticamente. Gracias de ante mano.