手机GPS 搜星 根据信燥比 判断 信号强弱

好久没写博客了,最近都在忙其他事。

最近遇到一个问题就是 做了一个基于手机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以下可以接受,其他的会引进误差,那些不参与解算的
 
网上看到这个后茅塞顿开,瞬间打开了任督二脉。
在代码里面添加
while (iters.hasNext() && count <= maxSatellites) {
                        GpsSatellite s =  iters.next();
                        
                            count++;
                           
				s.getSnr();(在这里)
}

运行 结果 果然如此  信燥比全是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/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
 
 


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值