概述
好久没写博客了,最近都在忙其他事。
最近遇到一个问题就是 做了一个基于手机GPS模块的APP,客户要求根据GPS获得的坐标与指定点的坐标计算距离,小于规定的并滞留5分钟时,自动结束或者提示。
效果什么的都做出来了,但是苦于一个问题: GPS 有没有信号?
按照之前写的项目 里面并没有如何显示信号 客户反应定位什么到挺准的但是自动结束提示 这个不准 定的5分钟 实际是 6分钟或者 12分钟甚至30分钟后才提示。
开始以为是自己写的有问题,在测试机上(博主自己的手机 三星A7 2016版)完全木有问题啊 很准,测了几次后发现也出现上面提到的问题 ,其实不是手机的问题,是GPS 信号的问题,定的是5分钟 但是如果在4分钟的时候 没GPS 信号 这个时候是不做处理的 只有等有GPS 信号的时候才会继续判断 ,这个过程如果一直没有GPS信号的话那就没戏了。
这个问题我们知道但是客户不知道啊,于是只好在项目里面添加一个显示当前GSP连接上卫星颗数显示。
百度了一大堆 有现成的好 开始粘贴复制,拿起键盘就是干!!!!!
GpsStatus.Listener listener = new GpsStatus.Listener() { @Override public void onGpsStatusChanged(int event) { switch (event) { //第一次定位 case GpsStatus.GPS_EVENT_FIRST_FIX: Log.i("lh", "第一次定位"); break; //卫星状态改变 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Log.i("lh", "卫星状态改变"); //获取当前状态 GpsStatus gpsStatus = locationMgr.getGpsStatus(null); //获取卫星颗数的默认最大值 int maxSatellites=gpsStatus.getMaxSatellites(); //创建一个迭代器保存所有卫星 Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator(); int count = 0; while (iters.hasNext() && count <= maxSatellites) { GpsSatellite s = iters.next(); count++; } } System.out.println("搜索到:" + count + "颗卫星 max :"+maxSatellites); break;//定位启动 case GpsStatus.GPS_EVENT_STARTED: Log.i("lh", "定位启动"); break; //定位结束 case GpsStatus.GPS_EVENT_STOPPED: Log.i("lh", "定位结束"); break; } }; };
在开始GPS处使用
locationMgr.addGpsStatusListener(listener);
好了,开始运行结果输出的log是
11-09 15:38:38.282 27788-27825/com.sss I/lh: onStatusChanged: GPS 正常工作
11-09 15:38:38.302 27788-27825/com.ssss I/lh: 卫星状态改变
11-09 15:38:38.302 27788-27825/com.sss I/System.out: 搜索到:28颗卫星 max :255
11-09 15:38:40.272 27788-27825/com.sss I/lh: maxSatellites: 255
- - 我靠 看到这里 搜索到了 28颗卫星 这可和我之前了解到 只要搜星 至少4颗就可以定位,现在 28颗了 结果还是静悄悄的木有一点反应。
于是在下了好几款GPS测试的软件 打开一看 赤果果的一样 也是20-30颗卫星 但是他的有效卫星数 是 0,这是为什么呢?
经过在网上求爷爷求奶奶以后,知道了一个叫 卫星信燥比 的概念 (请饶恕博主孤陋寡闻以及大学期间患上了健忘症)
所谓信燥比,就是S/N0。学信息的朋友应该对这个概念不陌生,就是有用信息和其他各种噪声的比值,是当前卫星状况的体现,比如一个星,在地平面附近,或者被半遮挡了,你自然对这个星的追踪会出现问题,信燥比就会增高,一般的认为,在30-40左右是理想,50以下可以接受,其他的会引进误差,那些不参与解算的
网上看到这个后茅塞顿开,瞬间打开了任督二脉。
在代码里面添加
运行 结果 果然如此 信燥比全是0.0。while (iters.hasNext() && count <= maxSatellites) { GpsSatellite s = iters.next(); count++;s.getSnr();(在这里)}
11-09 15:49:57.262 27788-8049/com.sss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/comsss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/comsss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/com.sss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/com.sss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/com.ssss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/com.sss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/com.sss I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-8049/comssscagps I/System.out: 搜索到:28颗卫星 max :255
11-09 15:49:57.262 27788-27825/com.sss.cagps I/lh: 卫星状态改变
11-09 15:49:57.262 27788-27825/comsss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/comsss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/comsss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/cosss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sssscagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/cosss.cagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.sssagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/cosssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/comsssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.ssssscagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/comsssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/comsssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.shsssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/cosssagps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.ssssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/cosssgps I/lh: onGpsStatusChanged: 信噪比0.0
11-09 15:49:57.262 27788-27825/com.ssss.cagps I/System.out: 搜索到:28颗卫星 max :255
可以看到全是0.0 这也解释了为什么 已经连上了28颗卫星,就是迟迟无法定位的原因。
问题找到了,下一个问题接踵而来:之前说至少要4颗卫星就可以定位了,但是看信燥比有10颗卫星有信号了 为什么还是没数据呢?
之后又是各个网站博客群聊里面跪求 信燥比多少合适,直到看到了上面找到的答案 引用其中一段:
“一般的认为,在30-40左右是理想,50以下可以接受”
ok,找到问题了,设置信燥比高于30的才算做有效卫星数。修改代码
while (iters.hasNext() && count <= maxSatellites) { GpsSatellite s = iters.next(); count++;运行。。。。。。。。。。。。。。。。。。。。。。。if(s.getSnr()>30) { count++; if(count >=4) { //表示有信号 }else { //信号弱或无信号 } }}
和下载 的软件对比,有效卫星数相差 1-3颗范围内证明是正确的
有的啰嗦,觉得啰嗦的直接看代码。
END
最后
以上就是陶醉超短裙为你收集整理的手机GPS 搜星 根据信燥比 判断 信号强弱的全部内容,希望文章能够帮你解决手机GPS 搜星 根据信燥比 判断 信号强弱所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复