解码肯尼亚狮子会报告 GPS 位置的 SMS
Posted
技术标签:
【中文标题】解码肯尼亚狮子会报告 GPS 位置的 SMS【英文标题】:decode SMS reporting GPS positions of Lions in Kenya 【发布时间】:2012-09-03 01:54:55 【问题描述】:Mara-Naboisho Lion Project 具有 asked for our help 解码和绘制装有 GPS 项圈的狮子的位置。
他们从项圈接收短信:
Collar07854_100806210058.SMS
074952494449554d0000000000000000000000000000000000000000000000040f33303030333430313232393738393000000000000000000000000000000000f10a0806100028008c13ef348a0039d0fe000de871004cc92b5ca92d6213ef26640039d108000de86b004cc92d5ca92d5d13ef18620039d101000de865004cc92c5ca92d5813ef0a930039d0fc000de864004cc9311c682d5413eefc170039d045000de7d4004cc95b7c692c5013eeee280039d0ff000de85f004cc92a7c692d6fffffffffffffffffffffffffffffffffffffffffff
Collar07854_100807060011.SMS
074952494449554d0000000000000000000000000000000000000000000000040f33303030333430313232393738393000000000000000000000000000000000f10a0807020038008c13efb2eb0039d0ed000de853004cc92e3cea2d8813efa5060039d0fb000de860004cc9291c6a2d8413ef96fd0039d0fc000de85e004cc92d5c6a2d7f13ef88e00039d0f6000de85a004cc92b5c6a2d7b13ef7ad80039d0fa000de85a004cc9327c6a2d77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
这些可能是 SMS PDU,尽管简单的在线解码器似乎对它们没有多大意义。其中有 ASCII 文本“IRIDIUM”,大概是 SMSC 或 sender 或其他字符串,因为 IRIDIUM 是卫星电话系统,大概是项圈发送位置时的承载者。
UPDATE:他们有一些与这些项圈相对应的 KML 文件;我已经上传了 KML here 和 here。项圈可能是 Vectron-Aerospace 制造的。
它是什么格式,我们如何解码?
(这是一个giving code 项目;也许你想help them,或者看看那里的其他问题?)
【问题讨论】:
+1 表示非常不寻常但实用的问题。我什至觉得很幽默。狮子!哈 【参考方案1】:我想为 dstibbe 的回答做一点贡献,但我还不能发表评论..
“header”的最后一个字节 (8c) 是从 0 开始计数时消息的长度 (140)。
【讨论】:
【参考方案2】:你为什么不问问德国公司的人?要么打电话给他们,要么给他们发电子邮件。我很确定他们会为您提供答案。
此外,根据网站上的产品表,可以设置项圈以不同的模式记录。你必须从狮子项目中找出项圈是如何编程的。
【讨论】:
询问? Pfft,这其中的挑战在哪里? ;-)(+1,实际思考)【参考方案3】:我已经能够翻译纬度/经度位置了!在查看了衣领开发人员的网站后,我发现他们使用的是 x/y/z ECEF 坐标。
第一条消息的第一行:
13ef 348a 0039 d0fe 000d e871 004c c92b 5ca9 2d62翻译为:
0039 d0fe = X = 3789054 000d e871 = Y = 911473 004c c92b = Z = 5032235这翻译成:
纬度:52.43067054630929 朗:13.525755535406619 身高:88.99500464554876这导致在德国的一个位置......这对于肯尼亚保护区来说听起来是错误的,但实际上是制造这些项圈的公司所在的街道: check their website
翻译坐标的代码在网上找到了:
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;
因此,唯一需要解密的代码就是最后一位:5ca9 2d62。
网站的另一条线索表明,这些字节包含主电压/备用电压和温度。
【讨论】:
来自 git github.com/giving/giving.github.com/issues/11 它说项圈也发送“气温”。也许最后两个数字是温度? (嗯……好像数字太大了……) 同样的地方说他们也在跟踪速度,所以这可能是另一个提示..但数字太高了..【参考方案4】:所以,经过 dstibbe 改进后,我们知道格式,可能还有日期/时间戳:
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
我的搜索重点是尝试将接下来的 8 个字节对转换为坐标。 让我们看第一行: 334443658 秒,0039 d0fe 000d e871 004c c92b 5ca9 2d62
可能还剩下四个不同的部分:
-
0039 d0fe
000d e871
004c c92b
5ca9 2d62
我的第一个猜测是第 1 部分是纬度,第 2 部分是经度。这些数字很可能是整数,而不是浮点数。浮点数有一个指数部分(11 位),几乎总是非零。这些数字似乎没有那部分,从 000 开始。
将所有内容转换为整数可能会导致:
-
3789054
911473
5032235
1554591074
看这个,我猜第 1 部分是经度,第 2 部分是纬度。这很常见,只需查看 Google 地球,它也需要 lon-lat 而不是 lat-lon。
现在,有很多方法可以将整数转换为纬度/经度,我最有可能的候选人是:
lon = part_1 / 6371000 / PI * 180
lat = atan(exp(part_2 / 6371000)) / PI * 360 - 90
这会导致埃塞俄比亚“甘贝拉”国家公园的坐标...?难道这些项圈在送到肯尼亚之前就已经在埃塞俄比亚录制了? 恐怕我们需要更多信息来翻译坐标……
纬度:8.169253103106428
伦敦:34.075781281927895
Coordinates in Google Maps
【讨论】:
我在想类似的东西,但没想到它们会是整数。这只剩下第 3 部分和第 4 部分仍未解决... 我希望 GPS 坐标包括海拔。也许这适合其中一列?【参考方案5】:罗伊言论的扩展:
也许“13”不是标题的一部分? 那么标题将是:
SMS 1: 10a0806100028008c
SMS 2: 10a0807020038008c
然后消息将是:
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
它看起来确实像一个日志,8 月 6 日的消息(猜测)有 6 个条目,而 8 月 7 日的第二个消息有 7 个。 项圈会记录什么?我在猜经度、纬度和时间戳?
前八位数字代表时间戳的可能性很高。它们是自下而上递增的。
例如。 13ef348a = 334443658。334443658 秒 = 10 年 8 个月 6 天 23:00:58(自 1970 年以来)。这与第一条短信标题中的日期匹配: Collar07854_ 100806 210058 。它甚至与标题中的时间戳减去 2 小时相匹配。
发帖人的一个问题:每天收到这些短信的频率是多少?他们来自哪一年(我猜是 2010 年)?
【讨论】:
太棒了!它确实适用于两条消息。因此,SMS 中的当前日期/时间似乎是 10 年、8 个月、6 和 7 天。这些项圈是旧的吗?或者时间是从 01-01-2000 开始还是什么的?接下来的 3x 8 个字节是什么意思? :-) 是否有可能获得有关项圈的更多信息以及数据记录的时间(以及记录的位置!?)因为如果我们知道纬度/经度的记录位置(给出或获取),它将帮助我们匹配它! 【参考方案6】:它似乎不是普通的 PDU。它也是 8 位信息,而不是 7 位(像大多数 PDU 一样)。
似乎也有一些模式,如果你去掉它们共同的第一个标题:
074952494449554d0000000000000000000000000000000000000000000000040f33303030333430313232393738393000000000000000000000000000000000f10a
接下来似乎还有另外一个 16 字节的 header/timestamp/id:
SMS 1: 0806100028008c13
SMS 2: 0807020038008c13
再格式化一下,图案就更清晰了:
Message #1:
ef348a0039d0fe000de871004cc92b5ca92d6213
ef26640039d108000de86b004cc92d5ca92d5d13
ef18620039d101000de865004cc92c5ca92d5813
ef0a930039d0fc000de864004cc9311c682d5413
eefc170039d045000de7d4004cc95b7c692c5013
eeee280039d0ff000de85f004cc92a7c692d6fff
ffffffffffffffffffffffffffffffffffffffff
Message #2:
efb2eb0039d0ed000de853004cc92e3cea2d8813
efa5060039d0fb000de860004cc9291c6a2d8413
ef96fd0039d0fc000de85e004cc92d5c6a2d7f13
ef88e00039d0f6000de85a004cc92b5c6a2d7b13
ef7ad80039d0fa000de85a004cc9327c6a2d77ff
ffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffff
【讨论】:
所以数据似乎有 20 个字节长?但我仍然不知道它是什么......第一条消息似乎有 6 个“值”,第二条消息似乎有 5 个“值”,有 7 个空间......?【参考方案7】:这看起来是一个很好的参考:
http://www.dreamfabric.com/sms/
诀窍可能是在最后解码消息。
我设法提取了铱,但没有进一步。
一个快速的 perl 脚本:
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;
【讨论】:
以上是关于解码肯尼亚狮子会报告 GPS 位置的 SMS的主要内容,如果未能解决你的问题,请参考以下文章
基于STM32实现的的短信实时传送位置----GPS+GSM