使用Wi-Fi技术为您的追踪器启用地理定位
1. 从The Things Network获取Wi-Fi信息
-
步骤1. 我们按照Seeed Studio Wiki提供的分步教程,建立追踪器与The Things Network (TTN)之间的连接
-
步骤2. 从解析的有效载荷中提取必要的MAC地址、RSSI(接收信号强度指示)和时间戳,因为这些数据将在后续步骤中用于Wi-Fi地理定位。

2. 通过位置服务提供商提供的API发出位置请求
推荐的地理定位服务提供商:
1. Google Geolocation
2. 百度地图
2.1 Google Geolocation
要利用Google Geolocation通过Wi-Fi获取位置信息,我们需要获得Google Geolocation API的访问权限。上面还概述了利用Geolocation API的各种方法。
一旦我们获得了API,我们就可以向Google发送请求来解析我们的WIFI信息。在这里,我们使用Python代码将WIFI信息转换为坐标数据。
步骤1. 使用pip命令安装'googlemaps':
pip install -U googlemaps
步骤 2. 使用 Python 发送解析请求,您需要在代码中的 api_key
变量中填入您获得的 API 密钥。
import googlemaps
from googlemaps import exceptions
param = {
"considerIp": "false",
"wifiAccessPoints": [
{
"macAddress": "9A:BB:99:12:1B:61",
"signalStrength": -50,
"signalToNoiseRatio": 0
},
{
"macAddress": "14:DE:39:A6:20:C9",
"signalStrength": -46,
"signalToNoiseRatio": 0
},
{
"macAddress": "C8:D7:19:92:69:6E",
"signalStrength": -85,
"signalToNoiseRatio": 0
}
]
}
_GEOLOCATION_BASE_URL = "https://www.googleapis.com"
def _geolocation_extract(response):
"""
Mimics the exception handling logic in ``client._get_body``, but
for geolocation which uses a different response format.
"""
body = response.json()
if response.status_code in (200, 404):
return body
try:
error = body["error"]["errors"][0]["reason"]
except KeyError:
error = None
if response.status_code == 403:
raise exceptions._OverQueryLimit(response.status_code, error)
else:
raise exceptions.ApiError(response.status_code, error)
def geolocate(client, home_mobile_country_code=None,
home_mobile_network_code=None, radio_type=None, carrier=None,
consider_ip=None, cell_towers=None, wifi_access_points=None):
"""
The Google Maps Geolocation API returns a location and accuracy
radius based on information about cell towers and WiFi nodes given.
See https://developers.google.com/maps/documentation/geolocation/intro
for more info, including more detail for each parameter below.
:param home_mobile_country_code: The mobile country code (MCC) for
the device's home network.
:type home_mobile_country_code: string
:param home_mobile_network_code: The mobile network code (MCC) for
the device's home network.
:type home_mobile_network_code: string
:param radio_type: The mobile radio type. Supported values are
lte, gsm, cdma, and wcdma. While this field is optional, it
should be included if a value is available, for more accurate
results.
:type radio_type: string
:param carrier: The carrier name.
:type carrier: string
:param consider_ip: Specifies whether to fall back to IP geolocation
if wifi and cell tower signals are not available. Note that the
IP address in the request header may not be the IP of the device.
:type consider_ip: bool
:param cell_towers: A list of cell tower dicts. See
https://developers.google.com/maps/documentation/geolocation/intro#cell_tower_object
for more detail.
:type cell_towers: list of dicts
:param wifi_access_points: A list of WiFi access point dicts. See
https://developers.google.com/maps/documentation/geolocation/intro#wifi_access_point_object
for more detail.
:type wifi_access_points: list of dicts
"""
params = {}
if home_mobile_country_code is not None:
params["homeMobileCountryCode"] = home_mobile_country_code
if home_mobile_network_code is not None:
params["homeMobileNetworkCode"] = home_mobile_network_code
if radio_type is not None:
params["radioType"] = radio_type
if carrier is not None:
params["carrier"] = carrier
if consider_ip is not None:
params["considerIp"] = consider_ip
if cell_towers is not None:
params["cellTowers"] = cell_towers
if wifi_access_points is not None:
params["wifiAccessPoints"] = wifi_access_points
return client._request("/geolocation/v1/geolocate", {}, # No GET params
base_url=_GEOLOCATION_BASE_URL,
extract_body=_geolocation_extract,
post_json=params)
if __name__ == '__main__':
# Replace with your API key
api_key = 'YOUR_API_KEY'
# Create a Google Maps client
gmaps = googlemaps.Client(key=api_key)
# Call the geolocate function
result = geolocate(
gmaps,
wifi_access_points=param["wifiAccessPoints"],
consider_ip=param["considerIp"]
)
# Print the result
print(result)
Step 3. After completing the above steps, you will be able to obtain the Tracker's location information!
{'location': {'lat': 22.5769055, 'lng': 113.9222236}, 'accuracy': 20}
如果您没有运行条件,可以轻松运行我们创建的 Colab notebook !
2.2 百度地图
在本教程中,我们选择使用百度地图开放平台提供的智能硬件定位服务来对我们获取的 Wi-Fi 信息进行位置分析。不同位置服务提供商的接入方式可能有所不同,这里我们使用的是 IP 白名单认证。具体的接入流程是定义我们需要解析的数据包,然后向 API 服务地址发起 POST 请求。以下是我们定义的 JSON 数据包。

接下来,我们导航到 JSON 文件所在的目录,打开终端,并输入请求命令:
curl -X POST -H "Content-Type: application/json" -d @request.json https://api.map.baidu.com/locapi/v2
然后我们可以接收返回的解析数据:

3. 在地图上显示位置
最后一步是将解析的坐标输入到地图中以显示位置。这里,我们使用 Google Maps 链接:https://www.google.com/maps/

您可以在地图的搜索栏中输入解析的坐标来查看地图上的具体位置。