Wifi位置三角剖分

Wifi位置三角剖分,第1张

Wifi位置三角剖分

这很容易。这只是一些基本的数学。将其分为两部分:

1)查找水平位置(无高度)。

要找到您的位置,您需要3分,但只需专注于2分即可。通过使用2个点,您可以自己创建一个三角形,并根据两个点之间的信号强度找到位置。这将找出您在两个路由器之间的位置。例如,如果您位于路由器3和4之间,并且与3相比,信号强度为-89,而与4相比,信号强度为-54,那么您知道自己比3更接近3。如果您对距离与信号强度进行近似估算,则可以非常准确地了解路由器3和4之间的位置。剩下的问题是确定您在3和4之间处于哪一侧。
,因为您可能在路由器的上方或下方具有相同的信号强度值(-89,-54)(请参见示意图)

6   You could be here3--------------------------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。对于成千上万的值而言,这将很繁琐,但是您必须进行实验,以查看使用尽可能少的数据点可以达到的精度。

编辑:要求代码

我在某处有代码,但是那是几年前的事,所以我必须挖掘很多东西才能找到它。我认为从概念上讲,无需代码即可轻松复制。我测试的android设备花了大约50行Java代码。

本质上,我带了一个android手机,并创建了一个应用程序,该应用程序允许我随时显示已连接的wifi设备的当前ID,其信号强度,附近的其他wifi
ID及其信号强度以及GPS位置。所有这些都可以通过android的api访问。我认为您需要使用API​​
4或更高版本的android设备。就像3年前或4年前一样,所以我只是将其从我记忆中剔除掉。

GPS位置部分是为了使物理强度和wifi强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图,我可以让Google地图同时为我做,因为我可以覆盖他们的地图和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映射。

在我看来,以上内容非常简单,而深度图则更为简单。

理想情况下,您希望尝试使用包含多种不同无线技术的多种不同设备(某些设备,某些b设备,n,g等),以获得更准确的结果。但是我发现,准确性并不是什么大问题,而且您将在5英尺左右。这足够满足我的需求。理想情况下,所有wifi集线器都是相同的型号,它们通常位于大型设施/公司中,但是即使那样,这也没什么大不了的。变异是如此之小,如果您不需要疯狂的准确性,那就没关系了。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5623081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存