tuupola / whereami
Wi-Fi 定位服务的通用接口
Requires
- php: ^5.6 || ^7.0
- php-http/client-common: ^1.5
- php-http/httplug: ^1.1
- tuupola/http-factory: ^0.3.0
Requires (Dev)
- monolog/monolog: ^1.22
- overtrue/phplint: ^0.2.0
- php-http/curl-client: ^1.7
- php-http/logger-plugin: ^1.0
- php-http/mock-client: ^1.0
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: ^2.5
- zendframework/zend-diactoros: ^1.4
This package is auto-updated.
Last update: 2024-09-10 04:57:02 UTC
README
Wi-Fi 定位服务的通用 PHP 接口,受 whoami 启发。
安装
使用 Composer 安装库。您还需要选择一个 HTTP 客户端,例如 php-http/curl-client。
$ composer require tuupola/whereami $ composer require php-http/curl-client
如果您不安装 HTTP 客户端,您将收到 No HTTPlug clients found
和 Puli Factory is not available
错误。忽略 Puli 部分,您不需要它。只需安装一个 HTTP 客户端即可。
最后,如果您的项目尚未拥有一个,您必须包含一个 PSR-7 实现。一个好的候选是 zendframework/zend-diactoros
。许多框架,如 Slim 和 Expressive,默认已经包含了 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)。有关更多信息,请参阅许可证文件。