Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Wi-Fi位置三角测量_Android_Ios_Algorithm_Wifi_Triangulation - Fatal编程技术网

Android Wi-Fi位置三角测量

Android Wi-Fi位置三角测量,android,ios,algorithm,wifi,triangulation,Android,Ios,Algorithm,Wifi,Triangulation,以这张地图为例: 我需要了解Wi-Fi三角测量的基本原理。上图描绘了这一场景。为了实现Wi-Fi三角测量,我需要至少三个Wi-Fi热点及其位置。设置: 为简单起见,假设我有一个1平方公里乘1平方公里的区域,并且在这个区域有三个Wi-Fi热点。坐标系如下:正方形区域的一个角是(0,0,0),对角线最远的角将有坐标(1,1,1)。所有的位置确定都是相对于这个坐标系单独完成的(为了简单起见,我不想要全局xyz坐标)。其中,我有三个Wi-Fi热点位于(x1、y1、z1)、(x2、y2、z2)、(x3、

以这张地图为例:

我需要了解Wi-Fi三角测量的基本原理。上图描绘了这一场景。为了实现Wi-Fi三角测量,我需要至少三个Wi-Fi热点及其位置。设置:

  • 为简单起见,假设我有一个1平方公里乘1平方公里的区域,并且在这个区域有三个Wi-Fi热点。坐标系如下:正方形区域的一个角是(0,0,0),对角线最远的角将有坐标(1,1,1)。所有的位置确定都是相对于这个坐标系单独完成的(为了简单起见,我不想要全局xyz坐标)。其中,我有三个Wi-Fi热点位于(x1、y1、z1)、(x2、y2、z2)、(x3、y3、z3)。

  • 我们有一个人的设备能够接收Wi-Fi信号并计算位置(x,y,z)处的信号强度。该设备可以是手机、平板电脑等

  • 问题:动态计算人的位置(x、y、z),因为当您现在有以下输入时,他们会四处移动:

  • 从每个Wi-Fi热点接收的信号的信号强度

  • 以前存储在变量或数据库中的Wi-Fi热点的坐标

  • 第一个问题:如何根据上述输入计算位置?我假设信号强度与到路由器的距离成正比,但确切的关系是什么?这是如何做到如此准确的


    第二个问题:我认为上述投入足够了。还需要什么吗?

    这很简单。这只是一些基础数学。将其分为两部分:

  • 找到你的水平位置(没有高度)
  • 要找到你的位置,你需要三个点,但只需要专注于两点一秒钟。通过使用两点,您可以与自己创建一个三角形,并根据两点之间的信号强度找到您的位置。这将找出你在两个路由器之间的位置。例如,如果你在路由器3和4之间,你的信号强度与3相比是-89,与4相比是-54,你知道你更接近3而不是4。如果你做一个距离和信号强度的近似值,你可以得出一个相当准确的读数,你在路由器3和4之间的位置。剩下的问题是确定你在3到4之间的哪一边,因为你可以在路由器的上面或下面有相同的信号强度值(-89,-54)(看图表)

    然后找到另一个路由器,注意你的信号强度。通过查看5和6个路由器之间的信号强度关系(在图中),您应该能够非常容易地确定您在哪一边

  • 你可以用身高做同样的事情
  • 要完成上述所有操作,您只需要近似的距离与信号强度以及路由器之间的距离。根据我的测试(我自己编写了Wi-Fi三角测量代码),移动设备上的信号强度相当一致,因此一台设备应该与旁边的设备具有相同的结果

    我认为这是通过GPS定位(可能是硬编码的),还是基本上与此相同的原理。Skyhook是苹果公司批准的唯一一项服务,因此苹果公司基本上也做了同样的事情,然后确保其他应用程序不能使用它(任何使用包含这些功能的受限库的iPhone应用程序都将被拒绝)

    如何找到距离:

    你需要做一些简单的近似。根据您的环境,这些近似值并不完全相同,因此-89英尺(27米)可能意味着您距离路由器3 15英尺(4.5米),但-89英尺(27米)可能意味着您距离路由器4 13英尺(4米)。不管你做什么,这都不是100%的准确,但这没关系,因为你肯定可以在5英尺(1.5米)以内

    所以你要做的就是找到一堆点,从路由器3得到一个读数-89,然后记下你的距离。然后,你取一个平均值,用这个平均值在你的数据库中记录下来(也就是说,当你从路由器3到-89时,你的身高是15英尺(4.5米))。然后对其他值执行此操作,如-50或其他值,然后记下您的值并找到平均值。现在,如果-89表示您距离路由器3有15英尺(4.5米),而-50表示您距离路由器3有25英尺(4.5米)(仅举一个例子),那么当您距离路由器3有-75时,您必须估计您的距离,除非您想手动获得-75的近似值。这对于成吨的值来说是很麻烦的,但您必须进行实验,以了解使用尽可能少的数据点可以达到多高的精度

    你可以通过意识到信号强度是对数的来近似两个信号强度的平均值,所以你可以估计,既然-89是15英尺(4.5米),那么-75将是对数的(我不记得是以10为底还是以2为底,但我倾向于以10为底),比-89远14/100

    询问密码

    我在某个地方有代码,但那是几年前的事了,所以我得翻很多东西才能找到它。我认为从概念上讲,不需要代码就可以轻松复制。我测试的android设备用了大约50行Java代码

    基本上,我用一部android手机创建了一个应用程序,可以随时显示连接的Wi-Fi设备的当前ID、信号强度、附近的其他Wi-Fi ID及其信号强度,然后显示GPS位置。这些都可以通过Android的API访问。我想你需要一个API 4或更高版本的Android设备。这是三四年前的事了,所以我只是从我记忆中把它扔掉

               6
    
       You could be here
    
    3--------------------------4
    
      You could also be here
    
                5
    
    BestFitObject{
       Tuple<long, long> GPSLocation;
       List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken
    }
    
    WifiDevice{
       UUID ID; // Think a string should work fine, might be an internal type that encompasses UUID which would be better.
       int floorNumber;
       Tuple<long, long> GPSLocation; // Not entirely necessary, could provide better accuracy though
    }
    
    ClientPosition{
       List<Tuple<UUID, signedIt> NearbySignals; // Tuple of the UUID of the Wi-Fi device and the signal strength taken during the time of the ping.
    }