考虑这张地图:
我需要了解无线三角测量基本上是如何工作的。场景如上图所示。为了实现Wi-Fi三角测量,我需要至少三个Wi-Fi热点及其位置。设置:
>
我们有一个人的设备能够接收Wi-Fi信号并计算位置(x、y、z)处的信号强度。该设备可以是手机、平板电脑等。
问题:当你有以下输入时,动态计算人的位置(x,y,z):
>
以前存储在变量或数据库中的Wi-Fi热点的坐标。
第一个问题:如何根据上述输入计算位置?我假设信号强度与到路由器的距离成正比,但确切的关系是什么?Skyhook是如何做到这一点的?
第二个问题:我认为上述投入已经足够。还有什么要求吗?
甚至不用担心将dBm转换为距离。
无线电信号以光速(几乎)传播,但由于环境因素会造成一些衰减。因此,如果你能“ping”这个设备,你就可以大致了解它的距离。
给定一个已知位置的全向天线,然后您可以使用接收回复所需的时间绘制半径并绘制一个圆。现在,如果你从多个设备上这样做,圆圈会相交,这应该会给你提供方向。当然这都是两个维度。
你可以在三维空间里做同样的事情,但是你可以画球体。设备越多,位置就越准确。
这是一个信号,所以它的强度会随着距离的平方而下降。见平方反比定律。
Android将给你dBm的信号强度。我不熟悉这个单位,但如果它有点像音频分贝,它就不是线性刻度。你要考虑到这一点。
在一个完美的世界里,磁场足够均匀,纯测量可以给你提供距离,但是如果你通过任何金属进行测量,事情可能会变得丑陋。此外,设备Wi-Fi收音机的内部配置可能会使其在某些方向上更加敏感。我不是工程师,所以我不知道这些事情会在多大程度上影响最终结果。这可能无关紧要。
最后,为了获得三维位置,我相信你需要四个参考点。如果所有的无线热点都在同一高度,你仍然可以找到你的水平位置。如果他们不是,你会在他们所在的飞机上找到你的位置,这可能对你来说不够精确,这取决于飞机有多陡。
这很容易。这只是一些基础数学。将其分为两部分:
要找到你的位置,你需要三点,但只要专注于两点一秒钟。通过使用两点,您可以与自己创建一个三角形,并根据两点之间的信号强度找到您的位置。这将找出你在两个路由器之间的位置。例如,如果你在路由器3和4之间,与3相比,你的信号强度是-89,与4相比,你的信号强度是-54,你知道你更接近3,而不是4。如果你做一个距离与信号强度的近似值,你可以得出一个非常准确的读数,你在路由器3和4之间的位置。剩下的问题是确定你在3到4之间的哪一边,因为你可以在路由器上面或下面有相同的信号强度值(-89,-54)(看图表)
6
You could be here
3--------------------------4
You could also be here
5
然后找到另一个路由器,注意你的信号强度。通过查看5和6个路由器之间的信号强度关系(在图中),您应该能够非常容易地确定您在哪一边。
要完成上述所有操作,您只需要近似的距离与信号强度以及路由器之间的距离。根据我的测试(我自己编写了Wi-Fi三角测量代码),移动设备上的信号强度相当一致,因此一台设备应该与旁边的设备具有相同的结果。
天钩做到这一点,我认为要么通过全球定位系统定位(它可能是硬编码的),要么基本上与此相同的原理。天空钩是苹果批准的唯一服务,所以苹果基本上做了同样的事情,然后确保其他应用程序不能使用它(任何使用受限的802.11库的苹果应用程序都将被拒绝应用程序
如何找到距离:
你需要做一些简单的近似。根据您的环境,这些近似值不尽相同,因此-89英尺(27英尺
所以你要做的就是找到一堆点,从路由器3得到-89的读数,然后记下你的距离。然后,你取一个平均值,然后用这个平均值存入你的数据库(它说当你离路由器3有-89英尺时,你有15英尺(4.5英尺)
通过了解信号强度是对数的,您可以在两个信号强度平均值之间进行近似,因此您可以估计-89是15英尺(4.5英尺)
询问密码
我在某个地方有密码,但那是几年前的事了,所以我必须翻遍很多东西才能找到它。我认为从概念上讲,没有代码应该很容易复制。我花了大约50行Java代码来测试Android设备。
基本上,我用一部android手机创建了一个应用程序,可以随时显示连接的Wi-Fi设备的当前ID、信号强度、附近的其他Wi-Fi ID及其信号强度,然后显示GPS位置。这些都可以通过Android的API访问。我想你需要一个API 4或更高版本的Android设备。这是三四年前的事了,所以我只是从我记忆中把它扔掉。
GPS定位部分是为了使物理和Wi-Fi强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图地图,我可以让谷歌地图同时为我做这件事,因为我可以覆盖他们的地图和全球定位系统的坐标基本上,同时创建距离地图。不过,你仍然需要一张深度图来绘制楼层,我们可以很容易地手工完成,只要找到你是否在两个路由器中间。
我们知道同一楼层的Wi-Fi集线器的信号强度最强,然后可以通过确保不同楼层的Wi-Fi集线器的信号较弱来进行双重检查。这个深度图本质上是Wi-Fi集线器及其各自楼层的列表。
我们不需要他们的位置,因为我们可以最好地将信号强度与我们在设施周围行走时抓取的全球定位系统位置相匹配,并将信号强度抓取到某些集线器。这是一些简单的数学。对于二维平面位置,从顶部往下看,我们有一堆这样的物体:
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
}
然后,当我们ping客户端设备并希望最佳匹配它时,它会返回如下对象:
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.
}
然后,我们可以很容易地将ClientPosition与使用上述两个对象创建的2D地图进行最佳匹配。
以上内容非常简单,我认为深度图更简单。
理想情况下,您可能希望尝试并点击包含两种不同无线技术的两种不同设备(一些a设备、一些b设备、n、g等),以获得更准确的结果。但我发现,准确度并不是什么大不了的事,你将在5英尺(1.5英尺)以内
1. 开始连接无线网络()密码() 连接到指定无线网络。 示例: 光环板启动后,开始连接到无线网络“Maker-guest”。 2. 网络已连接? 如果网络已连接,报告条件成立。 示例: 光环板启动后,开始连接到无线网络“Maker-guest”。等网络连接成功后,所有LED灯亮起绿色。 3. 识别()语音()秒钟 识别指定语言(汉语或英语)语音指定时间。 示例: 光环板启动后,识别汉语语音3秒钟
可进行Wi-Fi连接的各种相关设定。 Wi-Fi 轻触方格,即可停用Wi-Fi功能。 接入点 会显示已保存或搜索到的接入点。曾经连接过1次的接入点,下次起会自动连接。 若轻触已保存的接入点,可进行连接测试或详细设定。 A ) 正在搜索接入点 B ) 加密 此接入点设定了加密。若要连接,需输入接入点设定的WEP密钥/WPA密钥。 C ) 接入点的信号强度 以无信号及3个等级的强度显示。 若已保存多个
Wi-Fi模块能够在平板电脑、手机和模块间建立无线Wi-Fi连接,可结合云服务实现IoT功能。 净重量:25.7g 体积:48×48×14mm 参数 无线标准:IEEE 802.11b/g/n(HT20) 频带范围:2412~2462MHz 工作模式:STA/AP/STA+AP 通信柜离:10m(空旷环境下) 工作电压:DC 5V 工作电流:200mA FCC ID:2AH9Q-NU001WF 抗
光环板连接Wi-Fi。 启用上传模式 点击启用上传模式。 连接网络 1. 添加事件类积木 当光环板启动时,Wi-Fi类积木 开始连接无线网络()密码(),输入附近Wi-Fi的名称和密码。 2. 网络连接成功后,我们需要一个信号来告诉我们网络连接成功。添加控制类积木 等待(),拖入Wi-Fi类积木 网络已连接?,添加灯光类积木 显示(),让灯环亮起指定图案。 下载代码
扬声器和麦克风 播放音符 播放声音 录制 文字转语音 摄像头 表情测试 图片转文字 相框 拍摄图片
问题内容: 我正在研究通过多个Android设备之间的Wi-Fi Direct连接进行广播的可能性。我创建了一个简单的消息广播应用程序来测试它是否有效,但是到目前为止,我还无法广播消息。当我尝试发送数据包时,出现 SocketException (网络无法访问): 这是我的代码的本质: 有谁知道在 Android 设备上通过Wi-Fi Direct广播是否真的有效?如果它可以正常工作,我在做什么错