WiFi アクセス ポイントから位置情報を検索する

WiFi アクセス ポイントから位置情報 (緯度経度) を検索するには、
Google Maps Geolocation API を使用します。

まず、APIキーを取得します。
次に、サンプルを試します。

$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"

下記のような位置情報が返ってきます。
米国のGoogle本社のそばですね。

{ 
  "location": {
  "lat": 37.4248297,
  "lng": -122.07346549999998
 },
 "accuracy": 1145.0
}

Python コードを作成します。
作成したコードは Github で公開しました。

サンプルのMACアドレスで、実行します。

$ python geo_wifi.py 01:23:45:67:89:AB 01:23:45:67:89:AC

35.4437078 139.6380256 4093.0

Chromeブラウザに地図が表示されます。
なぜか、横浜市役所です。
20160621_geolocation

本番
家で拾えるWifiのMACアドレスを試すと、
う〜ん自宅の近くが表示されますね。(^^;

参考
Wi-FiのMACアドレスはもはや住所と考えるしかない
linux のコマンドラインから、wi-fi の情報をつかって位置情報を得る

MAC airport コマンド

MAC には WiFi の管理を行う airport というコマンドがあります。

実体はここ
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport

airport scan

SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
AirPortxxxx **** -36  1       Y  JP WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) 
L02F_xxxx **** -37  40      Y  -- WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) 
BUFFALO-xxxx **** -79  6       Y  -- WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 
aterm-xxxx **** -84  4       Y  JP WPA(PSK/AES/AES) WPA2(PSK/AES/AES) 

参考
airport – the Little Known Command Line Wireless Utility
Managing WIFI connections using the Mac OSX terminal command line

MAC の Python で Chrome を開く

Python で Chrome を開くには、Selenium と ChromeDriver を使用します。
Selenium は、ブラウザを自動化するツールです。WebDriver API を有しています。
ChromeDriver は、Chrome ブラウザのために WebDriver のプロトコルを実装するスタンドアロンサーバーです。

インストール
Selenium のインストール

$ pip install selenium

ChromeDriver のインストール
chromedriver_mac32.zip をダウンロードする。
解凍した chromedriver をbin ディレクトリに置く。

$ wget http://chromedriver.storage.googleapis.com/2.22/chromedriver_mac32.zip
$ unzip chromedriver_mac32.zip
$ cp chromedriver /usr/local/bin/ 

確認
test.py

import time
from selenium import webdriver
driver = webdriver.Chrome('/usr/local/bin/chromedriver')
driver.get('http://www.google.com/xhtml');
time.sleep(5) # Let the user actually see something!
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see something!
driver.quit()

下記のような 「ChromeDriver」 の検索画面が表示される
20160620_chrome_driver

MAC Book Air の 有線LAN

MAC Book Air で有線LANを使うには、変換アダプタが必要です。
いくつか試してみました。

(1) Apple Thunderbolt – Ethernetアダプタ
Apple 純正なので、ケーブルを挿すだけで、つながります。

(2) USB – Ethernet アダプタ
(2−1) BUFFALO LUA3-U2-ATX
ケーブルを挿すだけで、つながりました。

(2−2) BUFFALO LUA4-U3-AGT
USB3.0 対応、Giga イーサ 対応です。
MAC用のドライバー をインストールしたら、 つながりました。

init.d と systemd

Linux にてサービスデーモンを新設するには、起動スクリプトとして、
/etc/init.d/skeleton を元に /etc/init.d/hoge を作成します。

サービスデーモンを起動しようとすると、

$ sudo /etc/init.d/hoge start

下記の警告が出ます。

'systemctl daemon-reload' recommended.

systemctl とは、service manager で systemd の一部です。

Linux 全体の傾向として、 /etc/init.d/hoge でサービスを起動するのは廃止され、 systemd を使うようになっていました。
Debian や Raspbian では、jessie から systemd に移行しています。

なぜsystemdなのか
Jessie での既存 init システムから新しい標準 init システムへのアップグレードについて

例えば、ssh は、従来は起動スクリプトが使用されていましたが。

/etc/init.d/ssh 

systemd の環境では、定義ファイルが使用されます。

/lib/systemd/system/ssh.service

サービスデーモンを新設する場合も、
下位互換として、従来の起動スクリプトが使用できますが。

/etc/init.d/hoge

新しい流儀では、定義ファイルを作成するようです。

/etc/systemd/system/hoge.service

Raspbian jessieでSystemdを使った自動起動

ラズパイ Open JTalk

20160610_openjtalk

Open JTalk は、入力された日本語テキストに基づいて自由な音声を生成する HMM テキスト音声合成システムです。

インストール

$ sudo apt-get install open-jtalk
$ sudo apt-get install open-jtalk-mecab-naist-jdic 
$ sudo apt-get install hts-voice-nitech-jp-atr503-m001

確認

$ echo "こんにちは" | open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow /tmp/jtalk.wav
$ aplay /tmp/jtalk.wav

女性の声の設定
MMDAgent は、音声インタラクションシステム構築ツールキットです。

インストール

$ cd /tmp
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
$ unzip MMDAgent_Example-1.6.zip
$ sudo cp -R ./MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/

確認
-m オプションを MMDAgent にします

$ echo "こんにちは" | open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic  -ow /tmp/jtalk.wav
$ aplay /tmp/jtalk.wav

参考
Raspberry piで日本語音声合成(Open JTalk)を試してみる。

ラズパイ 無線LANアクセスポイント化

20160610_wlan_ap

ラズパイを 無線LANアクセスポイント 化します。

準備するもの
無線LANの親機になるドングル
BUFFALO WLI-UC-GNM を使用しました

手順は大きく4つです
(1) 無線LANを固定IPアドレスにする
(2) DHCPサーバーの構築
(3) アクセスポイントデーモンの構築
(4) イーサネットと無線LANのルーティングの設定

無線LANのIPアドレスを 192.168.42.1 にして、192.168.42.10 から 192.168.42.50 まで配布するようにします。
有線LAN側のゲートウェイが 192.168.1.1 とします。

作成や変更したファイルは Github で公開しています

(1) 無線LANを固定IPアドレスにする
/etc/network/interfaces を変更する

# 下記のようにコメントにする
#allow-hotplug wlan0
#iface wlan0 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#allow-hotplug wlan1
#iface wlan1 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

# 下記を追加する
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
gateway 192.168.1.1

(2) DHCPサーバーの構築
DHCP サーバーとして isc-dhcp-server をインストールする

$ sudo apt-get install isc-dhcp-server

/etc/dhcp/dhcpd.conf を変更する

# 下記のようにコメントにする
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;

# 下記のコメントを外す
#authoritative;
authoritative;

# 下記を追加する
subnet 192.168.42.0 netmask 255.255.255.0 {
  range 192.168.42.10 192.168.42.50;
  option broadcast-address 192.168.42.255;
  option routers 192.168.42.1;
  default-lease-time 600;
  max-lease-time 7200;
  option domain-name "local";
  option domain-name-servers 8.8.8.8,8.8.4.4;
}

/etc/default/isc-dhcp-server を変更する

# 下記のように変更する
#INTERFACES=""
INTERFACES="wlan0"

(3) アクセスポイントデーモンの構築
hostapd をインストールする

$ sudo apt-get install hostapd

/etc/default/hostapd を変更する

# 下記のように変更する
#DAEMON_CONF=""
DAEMON_CONF="/etc/hostapd/hostapd.conf"

/etc/hostapd/hostapd.conf を作成する

interface=wlan0
driver=nl80211
ssid=fablab_raspi
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=0456649009
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

(4) イーサネットと無線LANのルーティングの設定
/etc/sysctl.conf を変更する

# 下記のコメントを外す
#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

iptables コマンドで /etc/iptables.ipv4.nat を作成する

$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

/etc/network/interfaces を変更する

# 下記を追加する
pre-up iptables-restore < /etc/iptables.ipv4.nat

確認
再起動する

$ sudo reboot

dhcpd が起動している

$ ps auxw | grep dhcpd
root       649  0.0  0.8  10476  7928 ?        Ss   23:06   0:00 /usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid wlan0

hostapd が起動している

$  ps auxw | grep hostapd
root       692  0.2  0.3   5920  2996 ?        Ss   23:06   0:01 /usr/sbin/hostapd -B -P /run/hostapd.pid /etc/hostapd/hostapd.conf

dhcpd のポートが開いている

$ sudo netstat -ap | grep dhcpd
udp     0   0 *:bootps          *:*         651/dhcpd       
udp     0   0 *:20899           *:*         651/dhcpd       
udp6   0   0 [::]:60482        [::]:*       651/dhcpd       
raw     0   0 *:icmp              *:*    7   651/dhcpd       

無線LANのIPアドレスが 192.168.42.1 になっている

$ ifconfig
wlan0     Link encap:Ethernet  HWaddr cc:e1:d5:3e:33:87  
  inet addr:192.168.42.1  Bcast:192.168.42.255  Mask:255.255.255.0
  inet6 addr: fe80::3640:cb77:8e64:6f8a/64 Scope:Link

ルーティングが設定されている

$ sudo iptables -L
...
Chain FORWARD (policy ACCEPT)
target     prot opt source      destination         
ACCEPT   all  --  anywhere    anywhere   state RELATED,ESTABLISHED
ACCEPT   all  --  anywhere    anywhere            
...

参考
How to Set up a Raspberry Pi as a Wireless Access Point
Raspberry Piのアクセスポイント化 & ルータ化がうまくいかない時はこの通りにやればおk
Raspberry Piの無線LANアクセスポイント化

ラズパイ WebIOPi

WebIOPi は、ラズパイの GPIO をWEBブラウザから制御できるフレームワークです。
本来は、RaspberryPi 1 です。
RaspberryPi 2 に対応するためのパッチが公開されています。

インストール

$ cd /tmp
$ wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
$ tar xvzf WebIOPi-0.7.1.tar.gz
$ cd WebIOPi-0.7.1

RaspberryPi 2 用に変更する

$ wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch
$ patch -p1 -i webiopi-pi2bplus.patch

ビルドする

$ sudo ./setup.sh
 ...
Do you want to access WebIOPi over Internet ? [y/n] <== y
 ...
WebIOPi successfully installed
 ...

起動スクリプトを設定する

$ cd /tmp
$ wget https://raw.githubusercontent.com/neuralassembly/raspi/master/webiopi.service
$ sudo mv webiopi.service /etc/systemd/system/

起動

$ sudo systemctl start webiopi

確認
WEBブラウザで下記にアクセスする

http://raspberrypi.local:8000/ 

認証画面が表示されるので、
ユーザー名は「webiopi」パスワードは「raspberry」を入力する。
20160606_webiopi_auth

WebIOPi Main Menu が表示されれば、OKです。
20160606_webiopi_main

前回の方法 では、26ピンしか表示されないが、今回は、40ピンが表示されます。
20160608_webiopi_40pin

GPIOにLEDをつけて、オンオフしてみる。

参考
「Raspberry Piで学ぶ電子工作」補足情報
p.227:WebIOPiのバージョンとインストール

ラズパイ WebIOPi (非推奨)

WebIOPi は、ラズパイの GPIO をWEBブラウザから制御できるフレームワークです。
本来は、RaspberryPi 1 です。
RaspberryPi 2 に対応するためには、若干の変更が必要です。

この方法はなく パッチを使う方法 をお勧めします。

ダウンロード
公式サイトからダウンロードする
6月時点の最新版は 0.7.1 です。

インストール

$ tar xvzf WebIOPi-0.7.1.tar.gz
$ cd WebIOPi-0.7.1

RaspberryPi 2 用に変更する

$ nano python/native/cpuinfo.c
if (strcmp(hardware, "BCM2708") == 0)
⬇︎
if (strcmp(hardware, "BCM2709") == 0)

RaspberryPi 2 用に変更する

$ nano python/native/gpio.c
#define BCM2708_PERI_BASE 0x20000000
⬇︎
#define BCM2708_PERI_BASE 0x3f000000

ビルドする

$ sudo ./setup.sh
...
Do you want to access WebIOPi over Internet ? [y/n] <== y
...
WebIOPi successfully installed
...

サービスデーモンをリロードする

$ sudo systemctl daemon-reload

起動

$ sudo /etc/init.d/webiopi start

確認
WEBブラウザで下記にアクセスする

http://raspberrypi.local:8000/ 

認証画面が表示されるので、
ユーザー名は「webiopi」パスワードは「raspberry」を入力する。
20160606_webiopi_auth

WebIOPi Main Menu が表示されれば、OKです。
20160606_webiopi_main

GPIO Header をクリックすると、ピン配置が表示される。
RaspberryPi 2 では 40ピンあるが、RaspberryPi 1 の 26ピンしか表示されない。
20160606_webiopi_gpio_header

GPIOにLEDをつけて、オンオフしてみる。

参考
第30回「WebIOPiでIoT!(1)導入&Lチカ編〜ブラウザからGPIOを操作しよう」

ラズパイ 音楽再生 (omxplayer)

OMXPlayer は、ラズパイのためのコマンドラインのプレーヤーです。
これは、XBMC Raspberry PI に実装のためのテストベッドとして開発されました。
ラズパイの公式サイトでも紹介されています。
PLAYING AUDIO ON THE RASPBERRY PI

インストールされているかの確認

$ which omxplayer

/usr/bin/omxplayer

使い方

$ omxplayer example.mp3

Audio codec mp3 channels 2 samplerate 44100 bitspersample 16
Subtitle count: 0, state: off, index: 1, delay: 0
have a nice day

キー入力で制御します。
停止/再開: Space か p
終了: q

参考
フリー音源 Mp3juices,cc