TU ANUNCIO / YOUR PUBLICITY

AQUÍ PODRÍA ESTAR TU ANUNCIO: / HERE COULD BE YOUR AD E-mail

viernes, 26 de junio de 2015

Reading data from files msg (Outlook) with VB6 / Lectura de datos de ficheros msg (de Outlook) con VB6

Vamos a exponer, no una sino 3 formas diferentes de poder obtener los datos de un fichero de formato msg de Outlook
Let's expose, not one but three different ways to get data from "msg" file format of Outlook.

Sistema 1: con la ayuda de EAGetMailObj / System 1: with the help of EAGetMailObj



Se incorpora como referencia de esta manera:
It is incorporated by reference in this way


Si no tenemos esta biblioteca se consigue instalando EASendMail:
If you do not have this library is achieved by installing EASendMail:

Se puede descargar el programa desde aquí:
You can download the program here:

También se puede buscar EASendMail y buscarlo por nuestra cuenta. Una vez instalado, ya tendremos este componente para nuestros programas de VB. Necesitamos instalarlo peno no hace falta usarlo. Lo importante es tener este grupo de bibliotecas dll:
You can also search EASendMail and look for ourselves. Once installed, we will have this component to our programs VB. Penile need to install needless use. The important thing is to have this group of dll libraries:

La función que necesitaremos será algo parecida a ésta:
The function we need is something like this:

Sub LeeMSG(ByVal msgF As String)
    Dim oCorreo As New EAGetMailObjLib.Mail
    oCorreo.LicenseCode = "TryIt"

On Error GoTo 100
 Dim texto As String
 texto = ""
 Dim previo As String
    oCorreo.LoadOMSGFile msgF
    Dim Destinatarios
    Dim i As Integer
    Dim Destinatario As EAGetMailObjLib.MailAddress
  
        'MOSTRANDO FECHA
        MsgBox oCorreo.SentDate

        'MOSTRANDO Remitente
        MsgBox oCorreo.From.Address

        'MOSTRANDO DESTINATARIOS
        Destinatarios = oMail.To
        For i = LBound(Destinatarios) To UBound(Destinatarios)
            Set Destinatario = Destinatarios(i)
            MsgBox Destinatario.Address
        Next
    
        'MOSTRANDOS CON COPIAS
        Destinatarios = oMail.Cc
        For i = LBound(Destinatarios) To UBound(Destinatarios)
            Set Destinatario = Destinatarios(i)
            MsgBox Destinatario.Address
        Next

        'MOSTRANDO ASUNTOS
         MsgBox oCorreo.Subject
  
       ' MOSTRANDO TEXTO DEL CORREO
       'MsgBox "Texto del correo: " & oCorreo.TextBody

       ' MOSTRANDO HTML body
       'MsgBox "CUERPO Html: " & oCorreo.HtmlBody
       'filecopy msgfiletexto+".msg"
    
       ' MOSTRANDO ADJUNTOS
       'Dim adjuntos
       'Dim adjunto As EAGetMailObjLib.Attachment

       'adjuntos = oCorreo.Attachments
       'For i = LBound(adjuntos) To UBound(adjuntos)
       '    Set adjunto = adjuntos(i)
       '    MsgBox "Adjuntos: " & adjunto.Name
       'Next

    Exit Sub
10:
    'MsgBox Err.Description
End Sub

Hasta aquí mostramos como obtener los datos y visualizarlos con un mensaje de texto pero es obvio que se puede hacer cualquier cosa con ellos.
Thus far we show how to obtain the data and view them with a text message but obviously you can do anything with them.

Sistema 2: Con la ayuda de msgtool.exe / System 2 With the help of msgtool.exe

Puedes descargarlo de: You can download from:


O simplemente buscando msgtools en Google.
Or just looking msgtools in Google.

Nos dará un comando para utilizar en linea:
This will give us a command to use:

                    msgtool -c origen.msg > destino.eml

Podría utilizarse la función Shell de VB. Al ser esta función asíncrona es posible que cuando quisiñeramos leer los datos del fichero de texto "eml" todavía no se hubiera creado. por ello utilizaremos la función Ejecutar:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400

Public Sub Ejecutar(ByVal CmdLine As String)
On Error GoTo 20
Dim hProcess As Long
Dim RetVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(Chr(34) + CmdLine + Chr(34), 7))
Do
    GetExitCodeProcess hProcess, RetVal
    DoEvents
Loop While RetVal = STILL_ACTIVE
Exit Sub
20 MsgBox "error"
End Sub

La segunda pega consiste en la decodificación UTF-8. Podríamos utilizar las siguientes funciones de codificación-decodificación:

Function isUTF8(ByVal ptstr As String)
    Dim tUTFencoded As String
    Dim tUTFencodedaux
    Dim tUTFencodedASCII As String
    Dim ptstrASCII As String
    Dim iaux, iaux2 As Integer
    Dim ffound As Boolean
    ffound = False
    ptstrASCII = ""
    For iaux = 1 To Len(ptstr)
        ptstrASCII = ptstrASCII & Asc(Mid(ptstr, iaux, 1)) & "|"
    Next
    tUTFencoded = "Ä|Ã…|Ç|É|Ñ|Ö|ÃŒ|á|à |â|ä|ã|Ã¥|ç|é|è|ê|ë|í|ì|î|ï|ñ|ó|ò|ô|ö|õ|ú|ù|û|ü|â€|°|¢|£|§|•|¶|ß|®|©|â„¢|´|¨|â‰|Æ|Ø|∞|±|≤|≥|Â¥|µ|∂|∑|∏|Ï€|∫|ª|º|Ω|æ|ø|¿|¡|¬|√|Æ’|≈|∆|«|»|…| |À|Ã|Õ|Å’|Å“|–|—|“|”|‘|’|÷|â—Š|ÿ|Ÿ|⁄|€|‹|›|fi|fl|‡|·|‚|„|‰|Â|Ú|Á|Ë|È|Í|ÃŽ|Ï|ÃŒ|Ó|Ô||Ã’|Ú|Û|Ù|ı|ˆ|Ëœ|¯|˘|Ë™|Ëš|¸|˝|Ë›|ˇ|Å |Å¡|¦|²|³|¹|¼|½|¾|Ð|×|Ý|Þ|ð|ý|þ|â‰|∞|≤|≥|∂|∑|∏|Ï€|∫|Ω|√|≈|∆|â—Š|⁄|fi|fl||ı|˘|Ë™|Ëš|˝|Ë›|ˇ"
    tUTFencodedaux = Split(tUTFencoded, "|")
    If UBound(tUTFencodedaux) > 0 Then
        iaux = 0
        Do While Not ffound And Not iaux > UBound(tUTFencodedaux)
            If InStr(1, ptstr, tUTFencodedaux(iaux), vbTextCompare) > 0 Then
                ffound = True
            End If
            If Not ffound Then
                tUTFencodedASCII = ""
                For iaux2 = 1 To Len(tUTFencodedaux(iaux))
                    tUTFencodedASCII = tUTFencodedASCII & Asc(Mid(tUTFencodedaux(iaux), iaux2, 1)) & "|"
                Next
                If InStr(1, ptstrASCII, tUTFencodedASCII) > 0 Then
                    ffound = True
                End If
            End If
            iaux = iaux + 1
        Loop
    End If
    isUTF8 = ffound
End Function

Function DecodeUTF8(s)
  Dim i
  Dim c
  Dim n
  s = s & " "
  i = 1
  Do While i <= Len(s)
    c = Asc(Mid(s, i, 1))
    If c And &H80 Then
      n = 1
      Do While i + n < Len(s)
        If (Asc(Mid(s, i + n, 1)) And &HC0) <> &H80 Then
          Exit Do
        End If
        n = n + 1
      Loop
      If n = 2 And ((c And &HE0) = &HC0) Then
        c = Asc(Mid(s, i + 1, 1)) + &H40 * (c And &H1)
      Else
        c = 191
      End If
      s = Left(s, i - 1) + Chr(c) + Mid(s, i + n)
    End If
    i = i + 1
  Loop
  DecodeUTF8 = s
End Function

Como el fichero "eml" es de texto simplemente es entretenido obtener la información con las clásicas funciones de text Right, Left, Mid y Replace.
As the file "eml" is text, it's just fun to get the information with the classic text functions Right, Left, Mid and Replace.

Solución 3: Con la biblioteca de Outlook / Solution 3: With the Outlook library.

Esta solución es la que menos me gusta porque es rendirse a Microsoft. Pero cuando todo lo demás falla y estamos obligados a trabajar con el formato msg. ¿Qué se puede hacer?


Añadimos en Referencias la biblioteca de Outlook e incorporamos el siguiente extracto de código donde queramos:
References add Outlook library and add the following code excerpt where we want:

Dim ol As Outlook.Application
Dim msg As Outlook.MailItem
Set ol = New Outlook.Application
Set msg = ol.CreateItemFromTemplate(eso)
    MsgBox msg.SenderEmailAddress
    MsgBox msg.ReceivedTime
    MsgBox msg.To
    MsgBox msg.Subject
...
Set ol = Nothing
Set msg = Nothing

En lugar de utilizar la función MsgBox para visualizar los datos podemos hacer cualquier otra cosa con estos datos.
Instead of using the MsgBox function to display data we can do anything with this information.

NOTA IMPORTANTE: Puede saltarlos este mensaje:
IMPORTANT NOTE: It can be shown this message:


Si no queremos que salga tendremos que abrir Outlook, >> Programador >> Seguridad de Macros >> Acceso mediante programación >> No avisarme nunca de actividad sospechosa.



Está claro que de nosotros si nos podemos fiar pero hemos dejado la puerta abierta para otros. CUIDADO, Como siempre en Microsoft, la seguridad es parcial.

It is clear that for us if we can trust but have left the door open for others. CARE, As always Microsoft, security is partial.



jueves, 11 de junio de 2015

Looking for a 3D crosslinking model II / Buscando un modelo 3D reticular II

Partiendo de nuestra red (ver entrada anterior: http://carreteras-laser-escaner.blogspot.com/2015/06/looking-for-3d-crosslinking-model.html)


Ejemplo con carga superior: / Top-loading example:


Hemos creado una red de 60x60
Cambiado las bielas por muelles
y, Colocado una carga uniforme en la parte central superior
We have created a network of 60x60
Rods changed by springs
and we've got a uniform load

Éste es el resultado:
This is the result:


El color rojo indica compresión, y el color azul tracción
Red color indicates compression and blue, traction

Cuando la carga es desmesurada:
When the load is very big:


Ejemplo forzando el punto central a un movimiento (creando una onda) / Example forcing the movement to a central point (creating a wave)



Ejemplo haciendo que todos los puntos tengan un pequeño desplazamiento aleatorio: /  Example making all the points have a small random offset:



En la próxima entrega complicaremos la red con diagonales ¿Qué ocurrirá?
Next time we complicate network with diagonals What will happen?












lunes, 8 de junio de 2015

Looking for a 3D crosslinking model / Buscando un modelo 3D reticular

La idea es poder crear una red reticular, fácil de manipular por programación, para poder emular materiales reales. Sus características deben ser:
The idea is to create a mesh network, easily manipulated by programming, to emulate real materials. Its characteristics should be:




  1. La red de puntos se distribuirá en cuadrícula
  2. Cada punto tendrá un nexo con propiedades de unión
  3. Cada punto N tendrá varios puntos conectados. Uno por cada conexión:
  1. The network will be distributed at grid points
  2. Each point will have a link with binding properties
  3. Each point N will have a number of connected points. One for each connection:



Un punto, varias conexiones:
One point, several connections:


Un punto, varios puntos conectados. Uno por cada conexión:
A point, a number of connected points. One for each connection:

Aunque parezca secundario lo primero es adivinar cual es la correlación entre los puntos N y las conexiones K.
Although it may seem secondary, the first thing is to guess what is the correlation between N points and K connections.

El primer paso. Simplificando el problema. 2D: / The first step. Simplifying the problem. 2D:




NOTA: Se numeran los puntos en orden para hacer más fácil la programación de esta manera sólo hará falta un buche "FOR". También se podría haber nombrado los puntos como P[x,y] mucho más lógico desde el punto de vista "humano" pero más difícil a la larga desde el punto de vista informático.
NOTE: The points are numbered in order to make programming easier this way you will only need one "for" loop. I could have also named points as P [x, y] more logical from the "human" view point of, but more difficult from the IT perspective.

Para una red de w puntos de ancho y h puntos de altura:
El número de puntos será de w·h
Las conexiones serán (w-1)·h+(h-1)·w = 2·w·h-w-h.

For a network with wide of w points and height of h points:
The number of points will be w · h
The connections are (w-1) · h + (h-1) · w = 2 · w · hwh.

Para nuestro caso particular
For our particular case:

Biela 0 une punto 0 con 1.
Biela 1 une punto 0 con 4.
Biela 2 une punto 1 con 2.
Biela 3 une punto 1 con 5.
Biela 4 une punto 2 con 3.
Biela 5 une punto 2 con 6.
Biela 6 une punto 3 con 7.
Biela 7 une punto 4 con 5.
Biela 8 une punto 4 con 8.
Biela 9 une punto 5 con 6.
Biela 10 une punto 5 con 9.
Biela 11 une punto 6 con 7.
Biela 12 une punto 6 con 10.
Biela 13 une punto 7 con 11.
Biela 14 une punto 8 con 9.
Biela 15 une punto 9 con 10.
Biela 16 une punto 10 con 11.

Punto  0 conectado con: 4, 1.
Punto  1 conectado con: 5, 0, 2.
Punto  2 conectado con: 6, 1, 3.
Punto  3 conectado con: 7, 2.
Punto  4 conectado con: 8, 0, 5.
Punto  5 conectado con: 9, 1, 4, 6.
Punto  6 conectado con: 10, 2, 5, 7.
Punto  7 conectado con: 11, 3, 6 .
Punto  8 conectado con: 4, 9.
Punto  9 conectado con: 5, 8, 10.
Punto  10 conectado con: 6, 9, 11.
Punto  11 conectado con: 7, 10.

El algoritmo en VB para realizar las conexiones es:
The algorithm in VB for connections is:

Const nnn = 10000
Dim Px(nnn), Py(nnn) As Double
Dim b1(nnn), b2(nnn), P1(nnn), P2(nnn), P3(nnn), P4(nnn), Kmax, Nmax As Integer

----------

w = 4:h = 3:k = -1
Nmax = w * h - 1 '100 '(w - 1) * (h - 1)
For r = 0 To Nmax
i = r Mod w : j = Int(r / w)
  If (i <> w - 1) Then
    k = k + 1:    b1(k) = r:    b2(k) = j * w + (i + 1)
    Debug.Print "Biela " & Trim(k) & " une punto " & Trim(b1(k)) & " con " & Trim(b2(k)) & "."
    P3(b2(k)) = r:    P4(r) = b2(k)
  End If

  If j <> h - 1 Then
    k = k + 1:    b1(k) = r:    b2(k) = (j + 1) * w + i
    Debug.Print "Biela " & Trim(k) & " une punto " & Trim(b1(k)) & " con " & Trim(b2(k)) & "."
    P1(r) = b2(k):    P2(b2(k)) = r
  End If
Next r
Kmax = k - 1

For r = 0 To Nmax
    Debug.Print Replace("Punto  " & Trim(r) & " conectado con: " & Trim(P1(r)) & ", " & Trim(P2(r)) & ", " & Trim(P3(r)) & ", " & Trim(P4(r)) & ".", " ,", "")
Next r


El próximo día explicaremos como poner una carga y substituir bielas por muelles.
The next day we explain how to put a load and replace rods by springs.

http://carreteras-laser-escaner.blogspot.com/2015/06/looking-for-3d-crosslinking-model-ii.html


domingo, 7 de junio de 2015

How to make synchronous the Shell function / Cómo hacer sincrona la función Shell

A veces necesitamos que esté completamente ejecutado el programa que hemos llamado desde shell para poder seguir trabajando. Por ejemplo cuando este debe crear un archivo y queremos trabajar sobre el archivo ya creado.
Sometimes we need the program we have called from shell to continue working be completely executed. For example when you create a file and want to work on the file already created.

Para ello la mejor solución es no usar la función shell directamente. Nos crearemos nuestra propia función de lanzamiento de programas:
For this, the best solution is not to use directly the shell function. We create our own function launching programs:

Previamente definiremos estas funciones:
Previously we define these functions:

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400

_____________________________________________________________

Public Sub Ejecutar(ByVal Ordenes As String)
On Error GoTo 20

Dim hProceso As Long
Dim Terminado As Long
hProceso = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(Ordenes, 7))
Do
    GetExitCodeProcess hProcesoTerminado
    DoEvents 'Esto permite esperar sin "colgar" el programa
Loop While Terminado = STILL_ACTIVE
Exit Sub

20 MsgBox "error"
End Sub



Dim ccc,tal as string
ccc=chr(34) ' carácter espacial comillas
tal = ccc & "C:\Ruta del programa\programa.exe" & ccc & " -a -b -c " & ccc & "parametro con espacios 1" & ccc & " " & ccc & "parametro con espacios2" & ccc
Open App.Path + "\pepa.bat" For Output As #1
        Print #1, tal
Close #1
Shell App.Path + "\pepa.bat",0


Lo cambiaremos a: / We will change it to:

Dim ccc,tal as string
ccc=chr(34) ' carácter espacial comillas
tal = ccc & "C:\Ruta del programa\programa.exe" & ccc & " -a -b -c " & ccc & "parametro con espacios 1" & ccc & " " & ccc & "parametro con espacios2" & ccc
Open App.Path + "\pepa.bat" For Output As #1
        Print #1, tal
Close #1
Ejecutar App.Path + "\pepa.bat"

Y ahora sí que hemos terminado con todos los problemas de espacios en blanco y sincronía.
And now we have finished with all the problems of blank spaces and sync.



sábado, 6 de junio de 2015

Solution of spaces in the path of the Shell Function in Visual Basic / Solucion definitova para los espacios en las rutas con la función Shell en Visual Basic

Cuando queremos que sea ejecutado un comando (o programa) de MSDOS desde nuestro programa de Visual Basic solemos recurrir a la función SHELL. De tal manera:
When we want a MSDOS command (or program) to be run from our Visual Basic program SHELL usually resort to function. Such a way:

programa.exe -a -b -c parametro1 parametro2

Escribiremos en nuestro programa:
We write in our program:

Shell  "programa.exe -a -b -c parametro1 parametro2",0

El problema reside cuando hay espacios en blanco:
The problem is when there are blanks spaces:

C:\Ruta del programa\programa.exe -a -b -c parametro con espacios 2 parametro con espacios 2

Está claro que esto no funciona ni en el terminal. Deberíamos escribir:
Clearly, this does not work or the terminal. We should write:

"C:\Ruta del programa\programa.exe" -a -b -c "parametro con espacios 2" "parametro con espacios 2"

Y esperamos que en nuestro programa podamos escribir:
And we hope that in our program we can write:

Dim ccc as string
ccc=chr(34) ' carácter espacial comillas
Shell  ccc & "C:\Ruta del programa\programa.exe" & ccc & " -a -b -c " & ccc & "parametro con espacios 1" & ccc & " " & ccc & "parametro con espacios2" & ccc,0

Si funciona hemos terminado con el problema.
If it works we have done with the problem.

Si no funciona ¿Qué está ocurriendo? ¿Porque funcionan las comillas en MSDOS, en la terminal y no funciona desde Shell.
Case of malfunction what is happening? Why the quotes work on MSDOS, in the terminal and does not work from Shell.

Solución definitiva / Ultimate solution


Esta solución deberíamos intentarla cuando todo sale mal porque es muy retorcida. Lo que haremos será crear un archivo .bat (archivo de procesamiento por lotes) y luego ejecutar éste desde Shell.
This solution should try it when everything goes wrong because it is so twisted. What we will do is create a .bat file (batch) and then run it from Shell.

Dim ccc,tal as string
ccc=chr(34) ' carácter espacial comillas
tal = ccc & "C:\Ruta del programa\programa.exe" & ccc & " -a -b -c " & ccc & "parametro con espacios 1" & ccc & " " & ccc & "parametro con espacios2" & ccc
Open App.Path + "\pepa.bat" For Output As #1
        Print #1, tal
Close #1
Shell App.Path + "\pepa.bat",0


Otro tema es la asincronía del programa Shell esto lo salvaremos en la siguiente entrega.
Another issue is the asynchrony of the Shell program. This will be saved in the next installment.


miércoles, 3 de junio de 2015

Of how statistics makes good a low quality sensor / De cómo la estadística hace bueno un sensor malo

Imaginemos el siguiente par de sucesos. Por un lado, un tirador olímpico con una bala, por otro, un tirador mediocre con un millón de balas. Si tuviéramos que aportar cual acertará al menos una vez en la diana, ¿Por cual apostaríamos?

Imagine us the next couple of events. On the one hand, an Olympic shooter with a bullet, on the other hand, a lackluster shooter with a million bullets. If we had to bet which will hit at least once in the target. By which we'd bet?

¿Porqué nos hacemos este planteamiento?
Why are we doing this approach?

Del artículo anterior (http://carreteras-laser-escaner.blogspot.com.es/2015/05/the-discrete-gis-i-el-gis-discreto-i.html) he recibido muchos correos preguntándome como había hecho las mediciones como resulta más tedioso contestar uno a uno que responder en grupo redacto esta nueva entrada del blog.
Since the publication of our previous article (http://carreteras-laser-escaner.blogspot.com.es/2015/05/the-discrete-gis-i-el-gis-discreto-i.html) We have received many emails wondering how we'd done the measurements. As is more tedious answer one to one we reply to group in this new entry.

La respuesta es muy sencilla, simplemente con un teléfono móvil. Se que a partir de aquí empezaré a tener muchas críticas en cuanto un dispositivo móvil no tiene la misma exactitud que un aparato específico de medición de las altas frecuencias.
The answer is very simple, just with a cell phone. From here I will begin to have many reviews as a mobile device does not have the same accuracy as a specific high frequencies measuring device.

Para ello explicaré como hacer que un simple teléfono móvil tenga la exactitud de un aparato profesional. El primer paso es disponer de un aparato de medición de altas frecuencias fiable. El precio de estos está entre 200€ y 2000€.
For it I will explain how to make a simple mobile phone has the accuracy of a professional unit. The first step is to have a high frequencies measuring device. The price of these is between 200 € and 2000 €.

Por otra parte hay que conocer un poco de programación de android. Cuando en nuestro móvil buscamos cuantas redes hay disponibles, Podemos ver algo parecido a ésto:
On the other hand we must know a little android programming. When we look for at our few mobile networks are available, we can see something like this:


La información de cuantas redes hay disponibles la tenemos con el acceso:
Information on how many networks are available, we have to the access;

import android.net.wifi.WifiManager; // Permitirá la inclusión de funciones de escaneo wifi
...
WifiManager wifi; //Permitirá tener acceso a los valores de la clase wifiManager
...
wifi.getScanResults() // Matriz de datos.

como caso partícular con wifi.getScanResults().size, se obtiene el número de redes. Lo que tenemos que hacer es jugar con los valores de intensidad de la señal (de cada una de ellas) y el número de ellas:
As a particular case wifi.getScanResults().Size give us the number of networks. What we have to do is play with the intensity values of the signal (of each) and the number of them:

La función más simple sería:
The simplest function would be:

medida = k1 x n  (n=número señales) Podemos asegurar que esta solución no produce unos buenos resultados.
Measure = k1 = xn (n = number signals) We can ensure that this solution does not produce good results.


Una solución más compleja:
A solution more complex:

medida = k1 x n + k2 x n^2
measure = k1 x n + k2 x n^2
Error < 22%

ó

medida = k1 x n + k2 x n^2 + k3 x n^3
measure = k1 x n + k2 x n^2 + k3 x n^3
Error < 19%

Este tipo de soluciones polinomiales no mejoran el acercamiento a las mediciones de nuestro aparato de precisión. hacer depender sólo del número de señales. No se notan mejorías desde la segunda potencia y el error no baja del 20%. Hay que decir que para tener una idea aproximada de donde hay mas radiación es más que suficiente. Hay que tener además la volatilidad de estas redes según sean medidas según la hora del día o el día de la semana.

Si quisiéramos ser más exigentes tendríamos que saber cual es la intensidad de cada señal y promediarlo ponderadamente.

This type of polynomial solutions do not improve the approach to the measurement precision of our devices. With only the number of signals no are noticeable improvement from the second power, and the error is 20% in any case.It notes that have an approximate idea of where there is more radiation is sufficient. It should also be volatile as these networks are measured by time of day or day of the week.

If we have to be more demanding to know what the intensity of each signal and average it ponderously.

La solución ponderada más simple sería del tipo:
The simplest weighted solution would be as this kind:

medida= C x {(k11 x i1 + k12 x i1^2 + k13 x i1^3) + (k21 x i2 + k22 x i2^2 + k23 x i2^3) + .. +(kn1 x in + kn2 x in^2 + kn3 x in^3)} / n 
measure= C x {(k11 x i1 + k12 x i1^2 + k13 x i1^3) + (k21 x i2 + k22 x i2^2 + k23 x i2^3) + .. +(kn1 x in + kn2 x in^2 + kn3 x in^3)} / n 

Los coeficientes C, kij hay que buscarlos. Esta labor es muy tediosa y los errores comparados con nuestro medidor profesional da resultados con errores menores al 2%.
The coefficients C, kij must be sought. This work is very tedious and errors compared to our professional meter gives results with errors less than 2%.

Limitaciones: Evidentemente todo esto se realiza con mediciones de radiación debidas al las emisiones wifi. A otro tipo de emisiones no se puede cunatificar el dispositivo móvil porque simplemente carece de tales sensores.
Limitations: Obviously all this is done with measurements of radiation emissions caused by the the wifi. Another type of emissions can not be quantified because the mobile device simply lacks such sensors.

Una solución a este último problema se puede conseguir partiendo de un medidor de contaminación electro magnética que permite enviar los datos obtenidos por bluetooth.
A solution to the latter problem can be achieved based on an electro magnetic contamination meter that sends the data via Bluetooth.

Como siempre, la primera pregunta a hacerse es para qué queremos los datos. La mejor solución sería de tipo mixto. Es decir el primer paso sería una toma de datos general de un amplio territorio con nuestro móvil y un estudio exhaustivo de detalle en las zonas de más alta radiación.
As always, the first question to ask is why do we need the data. The best solution would be of mixed type. Is the first step would be a general data it takes a large territory with our smartphone and a comprehensive study of detail in areas of higher radiation.