Iphone 如何使用Wi-Fi获得距离

Iphone 如何使用Wi-Fi获得距离,iphone,objective-c,wifi,Iphone,Objective C,Wifi,我想使用wi-fi查找距离,并在iPhone的地图上绘制标记 那么我能得到什么想法或代码呢?仅仅使用网卡上的信号强度是不可能获得到接入点的精确距离的(以米或英尺为单位)。可能您可以使用3个或更多接入点获得大致距离。现在有一种技术可以使用3个GSM移动基站获得到移动用户的距离。使用接收功率,您可以使用射频传播模型计算出从发射器到接收器的距离。然而,听起来你想要的是位置,而不仅仅是距离 自由空间路径损耗模型: 在第一次阅读您的问题时,我假设您指的是到接入点的距离。在写了一大堆关于这个的文章之后,我意

我想使用wi-fi查找距离,并在iPhone的地图上绘制标记


那么我能得到什么想法或代码呢?

仅仅使用网卡上的信号强度是不可能获得到接入点的精确距离的(以米或英尺为单位)。

可能您可以使用3个或更多接入点获得大致距离。现在有一种技术可以使用3个GSM移动基站获得到移动用户的距离。

使用接收功率,您可以使用射频传播模型计算出从发射器到接收器的距离。然而,听起来你想要的是位置,而不仅仅是距离

自由空间路径损耗模型:


在第一次阅读您的问题时,我假设您指的是到接入点的距离。在写了一大堆关于这个的文章之后,我意识到你可能有别的意思。如果这就是你的意思,继续阅读

根据您的配置:

  • 单个固定接收器(您的手机不需要固定,但如果您正在寻找瞬时测量值,它实际上是固定的)
  • 单个固定基站(接入点)
  • 接收器上的全向天线
  • 802.11b/g协议
这是不可能做到的。即使你在这个级别上工作,这也是一个不可能解决的问题。为了使它稍微更可行,您需要确定接收器相对于两个(但最好是更多)基站的位置。即使如此,这仍然是一个难题。射频波以光速传播,因此使用中继技术测量往返信号传播延迟不会提供良好的精度(接收器必须运行极快,然后出现问题…)。同样,这都是假设你基本上是在构建你自己的射频硬件,显然你不会为iPhone这样做


追踪基站位置的最佳方法是在更改手机位置时记录WiFi信号强度。通过“改变位置”,你基本上必须在该区域周围扫掠。通过一些良好的启发式算法,以及处理非距离相关信号退化的鲁棒性,您可以获得相当高的精度(可能在10米左右)。

使用苹果的CoreLocation框架,它可以为您提供位置坐标。我无法链接到它,因为我无法访问iPhone文档。

您在这里想要实现什么

如果你想用Iphone在地图上标出你的位置,那么这个功能已经是Iphone的一部分,Iphone有GPS接收器,可以“开箱即用”

如果你正试图使用wifi找到笔记本电脑的位置,并将该位置发送到iphone,那么你有一个相当难解决的问题,如果不做大量工作,这可能是不可行的

有一些设施可以让您从GSM天线杆上三角测量您的位置,但这些天线杆位于已知横向/纵向的固定位置。Wifi接入点没有地理位置数据库,因此很难/不可能从这些位置进行三角测量

您可以使用第三方服务,例如使用GSM跟踪您的位置,但是这些服务非常不准确,除非您在大城市,并且需要您在跟踪的任何位置都安装GSM调制解调器。

这里您可以找到从GPS计算两个位置之间距离的公式。这是我在此基础上创建的一个C#代码(按公制缩放)


如何使用wifi在地图上定位我的位置?@Espo:不要散布谎言。我刚拿了一根卷尺,测量了距离,因此我证明了有可能测量到接入点的距离。你也可以使用接近度。如果接入点的位置已知,能够到达它会将您置于距离AP位置(wifi范围)的范围内。但是,如果我使用iPod,那么如何获取我的位置?因为在iPod中只有wifi存在…您是否有任何代码可以通过GSM移动站提供距离?可以获取接入点的角度,我知道一些英特尔无线网卡可以找到这个。接入点的角度意味着角度,这通常需要旋转发射机或接收机。。。(或以不等相位传输的信号)这是有用的,为什么?他应该如何知道接入点的GPS位置?这只是部分事实。您还可以查看侧向,即根据信号强度测量到接入点的距离。这意味着信号强度沿某些已知公式衰减。这可能很困难,但并非不可能。看看微软研究院的“雷达”。这是可能的,但建立一个考虑障碍物等影响的模型几乎是不可能的。这些障碍物通常也在移动。是的,我没说这是可行的。没有什么是100%准确的。
    private double Distance(GpsPosition p1, GpsPosition p2)
    {
        // http://www.mathforum.com/library/drmath/view/51711.html

        double A = p1.Latitude / 57.29577951;
        double B = p1.Longitude / 57.29577951;
        double C = p2.Latitude / 57.29577951;
        double D = p2.Longitude / 57.29577951;

        if((A==C) && (B==D))
            return 0;

        if((Math.Sin(A)*Math.Sin(C)+Math.Cos(A)*Math.Cos(C)*Math.Cos(B-D)) > 1.0)
            return 6372.72 * Math.Acos(1);
        else
            return 6372.72 * Math.Acos(Math.Sin(A) * Math.Sin(C) + Math.Cos(A) * Math.Cos(C) * Math.Cos(B - D));
    }