tuupola/whereami

Wi-Fi 定位服务的通用接口

0.4.1 2017-12-06 13:25 UTC

This package is auto-updated.

Last update: 2024-09-10 04:57:02 UTC


README

Latest Version Software License Build StatusCoverage

Wi-Fi 定位服务的通用 PHP 接口,受 whoami 启发。

Whereami

安装

使用 Composer 安装库。您还需要选择一个 HTTP 客户端,例如 php-http/curl-client

$ composer require tuupola/whereami
$ composer require php-http/curl-client

如果您不安装 HTTP 客户端,您将收到 No HTTPlug clients foundPuli Factory is not available 错误。忽略 Puli 部分,您不需要它。只需安装一个 HTTP 客户端即可。

最后,如果您的项目尚未拥有一个,您必须包含一个 PSR-7 实现。一个好的候选是 zendframework/zend-diactoros。许多框架,如 SlimExpressive,默认已经包含了 PSR-7,因此这部分不是必需的。

$ composer require zendframework/zend-diactoros

使用方法

当前位置

要找到当前计算机的位置,您必须提供 Wi-Fi 定位服务提供商,以及可选的 Wi-Fi 网络扫描仪。在 macOS 上,您可以使用 AirportScanner,它不需要任何额外设置。在基于 Linux 的系统上,您可以使用 IwlistScanner,运行它需要 root 权限。以下示例使用 Mozilla Location Service

require __DIR__ . "/vendor/autoload.php";

use Whereami\Provider\MozillaProvider;
use Whereami\Scanner\AirportScanner;
use Whereami\Whereami;

$provider = new MozillaProvider("your-api-key-here");
$scanner = new AirportScanner;
$locator = new Whereami($provider, $scanner);

$location = $locator->whereami();

/*
Array
(
    [latitude] => 1.355989
    [longitude] => 103.992365
    [accuracy] =>  65
)
*/

提示!如上所述,提供扫描仪是可选的。如果没有提供扫描仪,系统将尝试自动检测。这样,相同的代码应该在 macOS 和 *NIX 系统中都能工作。

require __DIR__ . "/vendor/autoload.php";

use Whereami\Provider\MozillaProvider;
use Whereami\Whereami;

$provider = new MozillaProvider("your-api-key-here");
$locator = new Whereami($provider);

$location = $locator->whereami();

第三方位置

有时定位第三方位置很有用。例如,您可能有一些需要跟踪位置的物联网设备。您可以通过调用 $locator->whereis($networks) 方法,并传递网络信息作为参数来定位这些设备。

require __DIR__ . "/vendor/autoload.php";

use Whereami\Provider\MozillaProvider;
use Whereami\Whereami;

$provider = new MozillaProvider("your-api-key-here");
$locator = new Whereami($provider);

$networks[] = [
    "name" => "#WiFi@Changi",
    "address" => "64:d8:14:72:60:0c",
    "signal" => -90,
    "channel" => 149,
];

$networks[] = [
    "name" => "#WiFi@Changi",
    "address" => "10:bd:18:5f:e9:83",
    "signal" => -70,
    "channel" => 6,
];

$location = $locator->whereis($networks);

/*
Array
(
    [latitude] => 1.3558172
    [longitude] => 103.9915859
    [accuracy] => 38
)
*/

提供商

组合提供商

此提供商使用 Combain CPS API。它需要一个 API 密钥,但他们为开发者提供了 免费评估账户

use Whereami\Provider\CombainProvider;

$provider = new CombainProvider("your-api-key-here");

谷歌地理位置提供商

此提供商使用 谷歌地图地理位置 API。您需要一个 API 密钥。免费使用的有一些 限制

use Whereami\Provider\GoogleProvider;

$provider = new GoogleProvider("your-api-key-here");

谷歌浏览器位置提供商

此提供商使用旧的未经记录的浏览器位置 API。它不需要 API 密钥。

use Whereami\Provider\BrowserlocationProvider;

$provider = new BrowserlocationProvider(null);

火狐提供商

此提供商使用 Mozilla Location Service (MLS)。它需要一个 API 密钥,但您可以在开发时使用 test 密钥。

use Whereami\Provider\MozillaProvider;

$provider = new MozillaProvider("your-api-key-here");

无线电细胞提供商

此提供商使用 Radiocells 网络地理位置服务 API。免费使用,不需要 API 密钥。

use Whereami\Provider\RadiocellsProvider;

$provider = new RadiocellsProvider(null);

无线提供商

此提供者使用Unwired Labs LocationAPI。需要API密钥,但您可以注册免费开发者账户

use Whereami\Provider\UnwiredProvider;

$provider = new UnwiredProvider("your-api-key-here");

扫描器

扫描器扫描周围的Wi-Fi网络,并将结果作为数组返回。然后将此数组提供给使用网络数据检索地理位置的提供者。

机场扫描器

这是macOS的默认扫描器。它使用Apple80211框架中的airport命令行工具。可以通过构造函数传递自定义命令。这是可选的,例如,如果您的airport二进制文件位于非标准位置,则应使用它。

use Whereami\Scanner\AirportScanner;

$scanner = new AirportScanner("/tmp/airport  --scan 2>&1");

带有Sudo的iwlist

这是Linux和其他*NIX基于系统的默认扫描器。它使用iwlist命令行工具。由于需要root权限才能运行,因此此扫描器的设置稍微复杂一些。

有几种方法可以解决这个问题。默认方法是通过编辑/etc/sudoers文件,授予您的web服务器运行sudo iwlist而不输入密码的权限。

$ sudo visudo

然后添加以下内容到文件末尾。

apache ALL=(ALL) NOPASSWD: /sbin/iwlist

编辑文件后保存并退出。确保您可以用web服务器用户运行该命令。

$ sudo su apache
$ /sbin/iwlist scan

如果可以看到扫描结果,则可以进行。

use Whereami\Scanner\IwlistScanner;

$scanner = new IwlistScanner;

无Sudo的iwlist

如果您不想以root权限授予web服务器运行iwlist的权限,则可以设置一个root cronjob,将扫描结果写入文本文件。

$ sudo crontab -e

将以下行添加到crontab中。这将每10分钟运行一次扫描。

*/10 * * * * /sbin/iwlist scan > /tmp/iwlist.txt

编辑文件后保存并退出。等待10分钟以确保您的cron条目正常工作。

$ cat /tmp/iwlist.txt

如果可以看到扫描结果,则可以进行。但是,您必须使用自定义命令,该命令使用cronjob的输出。

use Whereami\Scanner\IwlistScanner;

$scanner = new IwlistScanner("cat /tmp/iwlist.txt");

适配器

某些操作系统有用于确定当前位置的命令行工具。适配器为这些工具提供接口。如果您无法访问任何外部地理定位提供者,则可以使用适配器进行开发。

require __DIR__ . "/vendor/autoload.php";

use Whereami\Adapter\CoreLocationAdapter;
use Whereami\Whereami;

$adapter = new CoreLocationAdapter;
$locator = new Whereami($adapter);

$location = $locator->whereami();

请注意,适配器始终返回当前机器的位置。它们不能用于确定第三方位置。尝试这样做将触发PHP警告。

Corelocation

此适配器使用macOS的CoreLocationCLI工具。内部使用Core Location服务。使用Homebrew安装它。

$ brew install corelocationcli
use Whereami\Adapter\CoreLocationAdapter;

$adapter = new CoreLocationAdapter;

LocateMe

此适配器使用macOS的LocateMe工具。内部使用Core Location服务。使用Homebrew安装它。

$ brew install locateme
use Whereami\Adapter\LocateMeAdapter;

$adapter = new LocateMeAdapter;

测试

您可以在手动或自动更改代码时运行测试。自动测试需要entr运行。

$ make test
$ brew install entr
$ make watch

贡献

有关详细信息,请参阅CONTRIBUTING

安全性

如果您发现任何与安全相关的问题,请通过电子邮件tuupola@appelsiini.net发送,而不是使用问题跟踪器。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件