saber - decodificar SMS informando las posiciones GPS de los Leones en Kenia
obtener coordenadas google maps android (7)
El Proyecto León Mara-Naboisho ha pedido nuestra ayuda para decodificar y trazar las posiciones de los leones equipados con collares GPS.
Reciben SMS de los collares:
Collar07854_100806210058.SMS
074952494449554d0000000000000000000000000000000000000000000000040f33303030333430313232393738393000000000000000000000000000000000f10a0806100028008c13ef348a0039d0fe000de871004cc92b5ca92d6213ef26640039d108000de86b004cc92d5ca92d5d13ef18620039d101000de865004cc92c5ca92d5813ef0a930039d0fc000de864004cc9311c682d5413eefc170039d045000de7d4004cc95b7c692c5013eeee280039d0ff000de85f004cc92a7c692d6fffffffffffffffffffffffffffffffffffffffffff
Collar07854_100807060011.SMS
074952494449554d0000000000000000000000000000000000000000000000040f33303030333430313232393738393000000000000000000000000000000000f10a0807020038008c13efb2eb0039d0ed000de853004cc92e3cea2d8813efa5060039d0fb000de860004cc9291c6a2d8413ef96fd0039d0fc000de85e004cc92d5c6a2d7f13ef88e00039d0f6000de85a004cc92b5c6a2d7b13ef7ad80039d0fa000de85a004cc9327c6a2d77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Estas son presumiblemente SMS PDU, aunque los simples decodificadores en línea no parecen tener mucho sentido de ellos. Está el texto ASCII "IRIDIUM" en ellos, presumiblemente el SMSC o remitente o algo de cadena, ya que IRIDIUM es un sistema de teléfono satelital y presumiblemente el portador cuando los collares envían sus posiciones.
ACTUALIZACIÓN : Tienen algunos archivos KML que corresponden a estos collares; He subido el archivo KML aquí y aquí . Los collares son probablemente fabricados por Vectronic-Aerospace.
¿Qué formato es, y cómo lo decodificamos?
(Este es un proyecto de código de donación , ¿quizás quiere ayudarlos o ver otros problemas allí?)
Esto parece una buena referencia:
http://www.dreamfabric.com/sms/
El truco podría ser decodificar el mensaje al final.
Logré extraer el IRIDIUM pero no fui más allá.
Un script de Perl rápido para eso:
my $text=".....";
my $str;
while( $text ) {
$str .= chr( hex(substr $text, 0, 2) );
if( length($text) > 2 ) {
$text8 = substr($text, 2);
} else {
$text8 = '''';
}
}
print $str;
Expansión en la observación de Roy:
tal vez el ''13'' no es parte de los encabezados? Entonces los encabezados serían:
SMS 1: 10a0806100028008c
SMS 2: 10a0807020038008c
Y luego los mensajes serían:
Message #1
13ef 348a 0039 d0fe 000d e871 004c c92b 5ca9 2d62
13ef 2664 0039 d108 000d e86b 004c c92d 5ca9 2d5d
13ef 1862 0039 d101 000d e865 004c c92c 5ca9 2d58
13ef 0a93 0039 d0fc 000d e864 004c c931 1c68 2d54
13ee fc17 0039 d045 000d e7d4 004c c95b 7c69 2c50
13ee ee28 0039 d0ff 000d e85f 004c c92a 7c69 2d6f
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ff
Message #2
13ef b2eb 0039 d0ed 000d e853 004c c92e 3cea 2d88
13ef a506 0039 d0fb 000d e860 004c c929 1c6a 2d84
13ef 96fd 0039 d0fc 000d e85e 004c c92d 5c6a 2d7f
13ef 88e0 0039 d0f6 000d e85a 004c c92b 5c6a 2d7b
13ef 7ad8 0039 d0fa 000d e85a 004c c932 7c6a 2d77
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ffff ffff ffff ffff ffff ffff ffff ffff ffff ffff
ff
Parece un registro, con el mensaje de 06 de agosto (adivinar) tiene 6 entradas y el segundo de 07 de agosto con 7. ¿Qué registraría un collar? Estoy adivinando longitud, latitud y marca de tiempo?
Es probable que los primeros ocho dígitos representen la marca de tiempo. Son incrementales de abajo hacia arriba.
P.ej. 13ef348a = 334443658. 334443658 segundos = 10 años, 8 meses, 6 días, 23:00:58 (desde 1970). Esto coincide con la fecha en el título del primer sms: Collar07854_ 100806 210058 . Incluso coincide con la marca de tiempo menos 2 horas en el título.
Una pregunta para el afiche: ¿con qué frecuencia se reciben estos textos por día? ¿De qué año son (supongo 2010)?
No parece ser una PDU normal. También es información de 8 bits, no de 7 bits (como la mayoría de las PDU).
También parece haber patrones, si quitas el primer encabezado que tienen en común:
074952494449554d0000000000000000000000000000000000000000000000040f33303030333430313232393738393000000000000000000000000000000000f10a
A continuación, parece haber otro encabezado de 16 bytes / marca de tiempo / id:
SMS 1: 0806100028008c13
SMS 2: 0807020038008c13
Y formatee un poco, el patrón se vuelve más claro:
Message #1:
ef348a0039d0fe000de871004cc92b5ca92d6213
ef26640039d108000de86b004cc92d5ca92d5d13
ef18620039d101000de865004cc92c5ca92d5813
ef0a930039d0fc000de864004cc9311c682d5413
eefc170039d045000de7d4004cc95b7c692c5013
eeee280039d0ff000de85f004cc92a7c692d6fff
ffffffffffffffffffffffffffffffffffffffff
Message #2:
efb2eb0039d0ed000de853004cc92e3cea2d8813
efa5060039d0fb000de860004cc9291c6a2d8413
ef96fd0039d0fc000de85e004cc92d5c6a2d7f13
ef88e00039d0f6000de85a004cc92b5c6a2d7b13
ef7ad80039d0fa000de85a004cc9327c6a2d77ff
ffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffff
¡Pude traducir las posiciones lat / lon! Después de ver el sitio web de los desarrolladores de collar, he visto que están usando coordenadas ECEF de x / y / z.
La primera línea del primer mensaje:
13ef 348a 0039 d0fe 000d e871 004c c92b 5ca9 2d62
Se traduce como:
0039 d0fe = X = 3789054 000d e871 = Y = 911473 004c c92b = Z = 5032235
Esto se traduce en:
Lat: 52.43067054630929 Lon: 13.525755535406619 Height: 88.99500464554876
Esto da como resultado una ubicación en Alemania ... que suena mal para una reserva de Kenia, pero de hecho es la calle de la compañía la que hace estos collares: verifique su sitio web
El código para traducir las coordenadas se ha encontrado en línea:
public static double[] xyz2LLH(double x, double y, double z)
{
double[] llh = new double[3];
double da = 0.0; // datum parameter
double df = 0.0; // datum parameter
double a = 6378137 - da;
double f = 1 / 298.2572235630 - df;
double b = (1 - f) * a;
double e2 = 2 * f - f * f;
double E2 = (a * a - b * b) / (b * b);
double p = Math.sqrt(x * x + y * y);
llh[0] = Math.atan2(y, x);
double theta = Math.atan((z * a) / (p * b));
llh[1] = Math.atan((z + E2 * b * Math.pow(Math.sin(theta), 3)) / (p - e2 * a * Math.pow(Math.cos(theta), 3)));
double N = a / Math.sqrt(1 - e2 * Math.sin(llh[1]) * Math.sin(llh[1]));
llh[2] = p / Math.cos(llh[1]) - N;
llh[0] = Math.toDegrees(llh[0]);
llh[1] = Math.toDegrees(llh[1]);
return llh;
}
Entonces, el único código que queda para descifrar es el último bit: 5ca9 2d62 .
Otra pista del sitio web sugiere que estos bytes contienen la tensión y la temperatura principales de respaldo / voltaje.
Entonces, después de la mejora por dstibbe, conocemos el formato y probablemente una marca de fecha / hora:
Message #1
334443658 seconds, 0039 d0fe 000d e871 004c c92b 5ca9 2d62
334440036 seconds, 0039 d108 000d e86b 004c c92d 5ca9 2d5d
334436450 seconds, 0039 d101 000d e865 004c c92c 5ca9 2d58
334432915 seconds, 0039 d0fc 000d e864 004c c931 1c68 2d54
334429207 seconds, 0039 d045 000d e7d4 004c c95b 7c69 2c50
334425640 seconds, 0039 d0ff 000d e85f 004c c92a 7c69 2d6f
Message #2
334476011 seconds, 0039 d0ed 000d e853 004c c92e 3cea 2d88
334472454 seconds, 0039 d0fb 000d e860 004c c929 1c6a 2d84
334468861 seconds, 0039 d0fc 000d e85e 004c c92d 5c6a 2d7f
334465248 seconds, 0039 d0f6 000d e85a 004c c92b 5c6a 2d7b
334461656 seconds, 0039 d0fa 000d e85a 004c c932 7c6a 2d77
He centrado mi búsqueda en tratar de convertir los siguientes pares de 8 bytes en coordenadas. Tomemos la primera línea: 334443658 segundos, 0039 d0fe 000d e871 004c c92b 5ca9 2d62
Probablemente quedan cuatro partes distintas:
- 0039 d0fe
- 000d e871
- 004c c92b
- 5ca9 2d62
Mi primera suposición fue que la parte 1 sería latitud y parte 2 longitud. Y lo más probable es que los números sean enteros, no coma flotante. Los números de punto flotantes tienen una parte exponente (11 bits) que casi siempre son distintos de cero. Estos números no parecen tener esa parte, comenzando con 000.
Traducir todo en enteros probablemente resulte en:
- 3789054
- 911473
- 5032235
- 1554591074
Al ver esto, creo que la parte # 1 es la longitud y la parte # 2 es la latitud. Esto es bastante habitual, solo mira Google Earth, que también espera lon-lat en lugar de lat-lon.
Ahora, hay muchas maneras de convertir un entero a latitud / lon, mi candidato más probable sería:
lon = part_1 / 6371000 / PI * 180
lat = atan (exp (part_2 / 6371000)) / PI * 360 - 90
Esto da como resultado coordenadas en un Parque Nacional Etíope ''Gambela'' ...? ¿Podría ser que los collares hayan estado grabando en Etiopía antes de enviarlos a Kenia? Necesitamos más información para traducir las coordenadas, me temo ...
Lat: 8.169253103106428
Lon: 34.075781281927895
¿Por qué no le preguntas a la gente de la compañía alemana? Llámalos o envíales un correo electrónico. Estoy bastante seguro de que te proporcionarán la respuesta.
Además, de acuerdo con la hoja de producto en el sitio web, los collares se pueden configurar para grabar en diferentes modos. Tienes que averiguar por el proyecto del león cómo se han programado los collares.
Quiero contribuir un poco a la respuesta de dstibbe, pero aún no puedo comentar.
El último byte del ''encabezado'' (8c) es la longitud del mensaje (140) cuando comienza a contar en 0.