我需要了解Wifi三角测量基本上是如何工作的。场景如上图所示。为了实现wifi三角测量,我需要至少3个Wifi热点及其位置。设置:
1.为简单起见,我们假设我有一个 1平方公里乘1平方公里的区域,我在这个区域有3个Wifi热点。坐标系如下:方形区域的1角为(0,0,0),对角最远的角为坐标(1,1,1)。所有位置确定都是相对于该坐标系统单独进行的(为简单起见,我不需要全局xyz坐标)。在这个中,我有(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)的3个wifi热点。
2。我们有一个人能够接收wifi信号并计算位置(x,y,z)的信号强度。设备可以是手机,平板电脑等。
问题:动态计算人物的位置(x,y,z),因为当你现在有以下输入时它们会移动:
1。从每个wifi热点接收的信号的信号强度
2。先前存储在变量或数据库中的wifi热点的坐标。
第一个问题:如何根据输入计算位置?我假设信号强度与路由器的距离成正比,但具体的关系是什么? Skyhook如何准确地做到这一点?
第二个问题:我相信上述输入就足够了。还有什么需要吗?
谢谢!
答案 0 :(得分:18)
这很简单。这只是一些基本的数学。将其分为两部分:
1)找到你的水平位置(没有高度)。
要找到你的位置,你需要3分,但只需要专注于2分。通过使用2个点,您可以自己创建一个三角形,并根据两点之间的信号强度找到您的位置。这将找出您在两个路由器之间的位置。例如,如果您在路由器3和4之间,并且与3相比,您的信号强度为-89且信号强度为4为-54,那么您知道自己比您更接近3如果你做了距离与信号强度的近似,你可以准确地读出你在路由器3和4之间的位置。剩下的问题是,确定你在哪一方面。因为您可以在路由器上方或下方具有相同的信号强度值(-89,-54)(参见图表)
6
You could be here
3--------------------------4
You could also be here
5
然后找到另一台路由器,注意你的信号强度。通过查看5到6个路由器之间的信号强度关系(在图中),您应该能够非常轻松地确定您所在的一侧。
2)你可以用身高做同样的事情。
要完成上述所有操作,您实际上只需要近似距离与信号强度以及路由器之间的距离。根据我的测试(我编写了自己的WiFi三角测量代码),移动设备的信号强度非常均匀,因此一个设备应该与旁边的设备具有相同的结果。
skyhook这样做我认为要么通过GPS定位(可能是硬编码),要么与此基本相同。 Skyhook是唯一获得苹果批准的服务,因此Apple基本上做了同样的事情,然后确保其他应用程序无法使用它(任何使用受限制的80211库的iPhone应用程序都包含这些功能这将被应用商店拒绝)。
编辑:如何找到距离:
您需要做一些简单的近似。根据您的环境,这些近似值不会完全相同,因此-89英尺可能意味着您距离路由器3 15英尺,但路由器4的-89可能意味着您距离13英尺远。无论你做什么,这都不是100%准确,但这没关系,因为你可以确保在5英尺内。
所以你要做的就是找到一堆积分,从路由器3中得到-89的读数,然后记下你的距离。然后,你取平均值,并使用这个平均值放入你的数据库(这说明当你从路由器3重新-89时,你15英尺)。然后,您可以为其他值执行此操作,例如-50或其他任何值,然后记下您的值并找到平均值。现在,如果-89意味着你在15英尺外,而-50意味着你在25英尺之外(仅举例),当你从路由器3重新-75时,你必须近似你的距离除非你想手动接近-75。这对于大量的值来说是很麻烦的,但是您必须尝试使用尽可能少的数据点来查看准确度。你可以通过意识到信号强度是对数来估计两个信号强度平均值,所以你可以估计,因为-89是15英尺,那么-75将是对数的(基数10或基数2,我不能记得,但我和#39; m倾向于基地10)比-89远14/100倍。
编辑:要求代码
我在某个地方有代码,但是几年前我就不得不挖掘很多东西才能找到它。我认为从概念上讲,没有代码就很容易复制。我花了大约50行java代码用于我测试的Android设备。
基本上我拿了一部Android手机并创建了一个应用程序,允许我随时显示连接的wifi设备的当前ID,信号强度,其他附近的wifi ID及其信号强度,然后GPS地点。这些都可以通过android的api访问。我认为你需要API 4或更高版本的Android设备。这就像3或4年前一样,所以我只是把它从我记忆中抛出来。
GPS定位部分是为了使物理和wifi强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图,我可以让谷歌地图同时为我做这件事在创建距离图时,我可以基本上覆盖他们的地图和GPS坐标。您仍然需要一张深度图来映射楼层,我们可以通过查找您是否位于两台路由器中间来轻松完成。我们知道同一楼层的wifi集线器的信号强度最强,然后可以通过确保在不同楼层的wifi集线器上有较弱的信号来进行双重检查。该深度图本质上是wifi集线器的列表,以及它们各自的楼层。我们不需要他们的位置,因为我们可以最好地将信号强度调整到我们在设施周围行走时抓住的GPS位置并抓住某些集线器的信号强度。这是一些简单的数学。因此,对于2D平面位置,从顶部向下看,我们有一堆像这样的对象:
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 woudl be better.
int floorNumber;
Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though
}
然后当我们ping客户端设备并希望最适合它时,它会返回一个这样的对象:
ClientPosition{
List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping.
}
然后我们可以轻松地将ClientPosition最适合我们使用上述两个对象创建的2D地图。
以上非常简单,深度图更简单在我看来。
理想情况下,您想尝试点击几个不同的设备,包括几个不同的无线技术(一些设备,一些设备,n,g等),以获得更准确的结果。我发现的是,准确度并不是那么大,而且你在5英尺左右。这对我的需求来说足够准确。理想情况下,所有的wifi集线器都是相同的型号,它们通常在大型设施/公司,但即便如此,它并没有那么大的优惠。变化是如此之小,如果你不需要疯狂的准确性,它就不重要了。
答案 1 :(得分:6)
嗯,这是一个信号,所以它的强度会下降到距离的平方。 See Inverse-Square Law
Android会在dBm为您提供信号强度。我不熟悉那个单元,但如果它像音频分贝一样,它不是线性刻度。你想要把它考虑在内。
在一个完美的世界中,这些领域将足够均匀,可以进行纯粹的测量,从而为您提供距离,但如果您通过任何金属做到这一点,那么事情可能会变得难看。此外,设备的wifi无线电的内部配置可能使其在某些方向上更敏感。我不是工程师或其他任何人,所以我不知道这些事情将在多大程度上影响最终结果。这可能是无关紧要的。
最后,对于三维位置,我相信你需要四个参考点。如果所有wifi热点都处于同一高度,您仍然可以找到您的水平位置。如果不是,你会在他们所在的飞机上找到你的位置,这对你来说可能不够准确,这取决于飞机的陡峭程度。
答案 2 :(得分:0)
不要担心将DBm转换为距离。无线电信号以光速(几乎)传播,除了由于环境因素导致的一些衰减。所以,如果你能&#34; ping&#34;您可以通过该设备大致了解其距离。给定已知位置的全向天线,您可以使用接收回复绘制半径和绘制圆圈所需的时间。现在,如果您从多个设备执行此操作,圆圈将相交,这应该为您提供方向。当然这都是2d。你也可以在3d中做同样的事情,但你要改为绘制球体。您拥有的设备越多,位置就越准确。