tokuhirom's Blog

linux のコマンドラインから、wi-fi の情報をつかって位置情報を得る

表題の件につきまして、解説します。

firefox などの web browser は geo location API を提供していますが、この位置情報のデータをコマンドラインからとる方法というのが、すんなりとした方法で提供されているものがちょっとみあたりませんでした。

これができると、自分の note pc の中で cron をうごかしておいて、何時から何時までのあいだにどこにいたかを記録するとかできておもしろそう。ライフログ!!!

というわけでやってみようとおもったのだが、存外情報がすくなくてこまった。

結論からもうしますと、iwlist コマンドをつかうと wi-fi のアクセスポイントを scan してくれるので、この出力をつかいましょう。

iwlist wlan0 scan

とかうつといいですね。

で、これでえた mac address をもとに、
http://ks0608.hatenablog.com/entry/2012/01/24/134052 こちらのエントリにのっているように、データをつくって google の API をたたけば OK です。

use strict;
use warnings;
use utf8;
use 5.010000;
use autodie;
use JSON;
use LWP::UserAgent;
use Encode;
use Data::Dumper;

local $Data::Dumper::Indent = 1;
local $Data::Dumper::Terse = 1;

my $interface = shift @ARGV || "wlan0";
my @addresses = grep {$_} split /\n/, `iwlist $interface scan|grep Address|awk '{print \$5}'`;

my $query = encode_json(
    {
        version => '1.1.0',
        host => 'maps.google.com',
        request_address => JSON::true,
        address_language => 'ja_JP',
        wifi_towers => [
            map {
                +{
                    mac_address => $_,
                    signal_strength => 8,
                    age => 0,
                }
            } @addresses
        ]
    }
);

my $ua = LWP::UserAgent->new;
my $res = $ua->post('http://www.google.com/loc/json', Content => $query);
$res->is_success or die $res->status_line;
my $res_str = Dumper(decode_json($res->content));
$res_str =~ s/\\x\{([0-9a-fA-F]+)\}/chr(hex($1))/ge;
warn $res_str;

はい。簡単でした!

[追記]
http://unknownplace.org/memo/2012/07/21/1/
osx でのやりかたを typo さんがかいてました。