今回はapache2とcgiも組み込んだRaspberryPiのSDイメージの作成手順です。
出来上がったSDカードのイメージからの手順は次回書きます。
以下、web pageはhttpsで接続してますが、クライアント認証はしてないのでLAN内での使用に限定してください。
web pageを外からアクセス可能にするのは、TVのリモコン制御家の外にTVのリモコンを置きっぱなしにしてる程度の危険度ですが、玄関の鍵などを繋ぎこむと玄関の前に鍵をぶら下げてるくらい危険です。
■Raspbianの書き込み(Mac OSX上。Windowsでも構わないがやり方は調べてください)
4GB/class 4以上のSDカードを用意
http://www.raspberrypi.org/downloadsからRaspbian "wheezy"のイメージをダウンロード
SDカードをセットしdfコマンドでmountされているデバイス名を確認。
# df
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk1 466560312 294498768 171549544 64% 36876344 21443693 63% /
devfs 403 403 0 100% 700 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home
/dev/disk4s1 114576 37888 76688 34% 512 0 100% /Volumes/Untitled
ここでは/dev/disk4なので
# diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
# sudo dd if=2013-07-26-wheezy-raspbian.img of=/dev/rdisk4 bs=1m
Password:
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 109.201742 secs (17764054 bytes/sec)
# diskutil eject /dev/rdisk4
SDカードが出来上がったのでRaspberryPiにセットして起動
■sshでのlogin
※以下gateway 192.168.0.1, netmask 255.255.255.0, DHCPで配られたアドレス 192.168.0.27, RaspberryPiに設定する固定アドレス 192.168.0.100として説明する。
HDMIにTVを接続してIP Addressを確認するかdhcp server側で固定IPにすることでRaspberryPiのIPを取得する。
もしくはWiFi routerがDHCPサーバーになっている場合にWiFi接続しているか、自分自身がDHCPサーバーになっているなど、DHCPサーバーとの間にSwitchingHubなどのが入っていないネットワークの構成ならtcpdumpでdhcp/arpのパケットをみてb8:27:eb:xx:xx:xxのMACAddrを引っ掛けてIPアドレスを特定することも可能。
# sudo tcpdump -i en1 'arp[8:4] & 0xffffff00 = 0xb827eb00'
(en1はMacのRaspberryPiと同じLANにつながるポート)
を仕掛けておいてRaspberryPiを起動すると、しばらくして
11:33:47.965431 ARP, Request who-has 192.168.0.1 tell 192.168.0.27, length 46
などとDHCPサーバーが配ったアドレスが拾える。
ssh pi@ 192.168.0.27
The authenticity of host '192.168.0.27 (192.168.0.27)' can't be established.
RSA key fingerprint is xxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
と聞かれるのでyesとし
passwd: raspberry
でlogin
■基本設定 (以下はsshで入っているRaspberryPiのshell)
# sudo su
# passwd
でrootパスワード
# passwd pi
でpiのパスワードを設定
■固定IPへの変更(DNSサーバーとして動作するので固定IPにしないと変化するたびにiPhoneの設定を変える必要がある。sshで入るのにも固定の方がやりやすい)
# cp /etc/network/interfaces /boot
# mv /etc/network/interfaces /etc/network/interfaces.org
# ln -s /boot/interfaces /etc/network/interfaces
とし、interfacesファイルをFAT32のpartitionに移動し/boot/interfacesを編集
これは後からSDカードのFAT32 partiotionをMacでmountしてネットワーク設定を変更出来るようにするため。
/boot/interfaces変更前
iface eth0 inet dhcpの行を削除
/boot/interfaces変更後
iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
を追加
# cp /etc/resolv.conf /boot
# mv /etc/resolv.conf /etc/resolv.conf.org
# ln -s /boot/resolv.conf /etc/resolv.conf
こちらもDNSサーバの指定をFAT32のpartitionに異動し/boot/resolv.conを編集
nameserver 8.8.8.8 (googleのpublic DNS。routerを使う場合は192.168.0.1)
nameserver 8.8.4.4
# vi /boot/server.url
で
webアクセスするためのURLを指定
hogehoge.or.jp
など。
# raspi-config
expand_rootfsを実行。
3.Enable Boot to DesktopをDisable
4 Internationalisation Options
I1 Change Locale
ja_JP.UTF-8 UTF-8 をEnable
Default Languageをja_JP.UTF-8に設定
4 Internationalisation Options
I2 Change Timezone
Asia->Tokyo
8 Advanced Options
A3 Memory Splitを16M
を設定しrebootする。
再度sshでlogin。今度は設定した固定IP
ssh pi@ 192.168.0.100
passwd: 設定したもの
でlogin
この時何度も条件を変えたりしながらloginを繰り返していると
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
などと出てloginできなくなることがあるが、これは~/.ssh/known_hostsに同じIPアドレスの他の公開鍵が登録されているためなので、このファイルを編集して192.168.0.100の行を削除すればlogin出来るようになる。
再びroot権限で作業
# sudo su
■不要なpackageの削除
# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 1804128 1460364 252116 86% /
/dev/root 1804128 1460364 252116 86% /
devtmpfs 216132 0 216132 0% /dev
tmpfs 44880 216 44664 1% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 89740 0 89740 0% /run/shm
/dev/mmcblk0p1 57288 18984 38304 34% /boot
packageのupdate
# apt-get update
# apt-get upgrade
HA1Control daemonに必要なものを追加
# apt-get install libcurl4-openssl-dev libgif-dev telnet ruby1.9.3 dnsmasq gawk apache2 libapache2-mod-php5
不要なものを削除
# apt-get --purge remove xserver* libxdmcp* libxfont* xkb-data alsa-* cups-* dbus plymouth cifs-* samba-* smbclient dphys-swapfile desktop-file-utils libxml2* bind9-host* dnsutils* libbind9-80* libdns88* libisc84* libisccc80* libisccfg82* liblwres80* libxml2* libxml2-dev* libxslt1-dev* libxslt1.1* shared-mime-info* console-setup-linux geoip-database libgeoip1 libtalloc2 libtdb1 libwbclient0 sgml-base xml-core x11-* xbitmaps libxdmcp6 libxcb* libxau* rsync libfont* libfreetype* libqt* lxde-* lxmenu* libmenu* libgnome* gconf* gnome* gsettings* gsfonts hicolor-icon* penguinspuzzle
# apt-get --purge autoremove
aptのcacheを削除
# apt-get clean
上でswapを止めたのでswapファイルを削除
# rm /var/swap
■ntpdの設定
RaspberryPiはバッテリーバックアップのRTCを持っていないのでNICTのntpサーバーを設定、他をコメントアウト
# vi /etc/ntp.conf
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
pool ntp.nict.jp iburst
# vi /etc/default/ntp
NTPD_OPTS='-g -c /etc/ntp.conf'
■ttyとUARTの設定を変更
# vi /etc/inittab
1:2345:respawn:/sbin/getty --noclear 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
...
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
を行頭に#をつけてコメントアウト
UARTをXBee接続用に空けるためconsoleから外すため起動optionを変更するけど、
raspbianのkernelにdefaultで埋め込まれているもので十分なので/boot/cmdline.txtを削除
# rm /boot/cmdline.txt
■SiriProxyのinstall
# gem install bundler
# gem install siriproxy
■HA1Control daemonなどのinstall
# cd /root
# git clone https://github.com/mnakada/ha1control.git
# cd ha1control
# make install
でha1control, ha1accessのinstallとsiriproxy, apache2の各種設定を行う
最後に出来上がった/var/ha1/ha1privateca.crtファイルをiPhoneへメール等で転送しinstallする。
■念のためrestart
# sync
# init 6
数十秒で再起動しているはずなので
ssh pi@ 192.168.0.100
passwd: 設定したもの
で再度login
# ps aux | grep ha1control
root 1669 0.0 0.1 10012 892 ? Ss 14:51 0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
root 1671 0.3 0.4 10140 2364 ? S 14:51 0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
と2つ動いているのが正常(1つはWatchDogDaemon)
# ps aux | grep siriproxy
root 1859 62.3 3.4 23452 17400 ? Sl 14:51 0:08 /usr/local/bin/siriproxy_daemon
こちらは1つ動いているのが正常
# tail -f /var/ha1/siriproxy.log
start : 2013-05-15 14:51:04 +0900
WARN: Unresolved specs during Gem::Specification.reset:
rake (>= 0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
[Info - Configuration] Loading plugins -- If any fail to load, run `siriproxy bundle` (not `bundle install`) to resolve.
[Info - Server] Starting SiriProxy on 0.0.0.0:443...
[Info - Server] SiriProxy up and running.
と待ち受けている状態
■iPhone側の設定
先ほど作成したha1privateca.crtをiPhoneにメール等で転送しinstallする。
設定->Wi-Fi->ネットワークを選択し右側の>マークを選択する。
中のDNSの設定をタップし設定値をRaspberryPiのIPアドレスに変更し閉じる。
まずはweb accessの確認
iPhoneのSafariから
'http://hogehoge.or.jp:47910/' 'https://hogehoge.or.jp:80/'(hogehoge.or.jpは/boot/server.urlファイルに設定した名前)を開いてみる。エラーが出ずにいくつかのアイコンが表示されていれば取り敢えずOK。
次にSiriを起動してみる。
RaspberryPiにloginし
# tail -f /var/ha1/siriproxy.log
を実行した出力に
[Info - Plugin Manager] Plugins loaded: HA1Control
[Info - iPhone] Received Object: LoadAssistant
[Info - iPhone] Received Object: SetRestrictions
[Info - iPhone] Received Object: ClearContext
[Info - iPhone] Received Object: SetBackgroundContext
[Info - iPhone] Received Object: StartSpeechRequest
[Info - iPhone] Received Object: SetRequestOrigin
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
.....
と出てくれば正常に繋がっています。
■リモコンの登録
リモコンを登録する名前を決める。ここでは仮にhogehogeとする
# telnet 127.0.0.1 47900 (RaspberryPiからtenet, security的な懸念もあるのでRaspberryPi自信からしかtelnetを受け付けません)
irrec hogehoge
を実行後すると
Ackと返ってくる
10秒以内にRaspberry piの赤外線受光部に向けてリモコンを送信
正常に受けられれば
irrec hogehoge : OK
と返ってくる
タイムアウトしたりちゃんと記録できなかった場合
irrec hogehoge : Error IR-Remote Record Error
とエラーになるので、再度登録
hogehoge
で登録したリモコンコードを送出するので、正しく反応しているか動作確認する
全てを登録したら
exit
で抜ける
次にwebpageにアイコンを登録する。
# cd /root/ha1control/ha1access
# vi icon.list
hogehoge ほげほげ ha1
などと追加する。
iconを変えたい場合は/root/ha1control/ha1access/icon/以下に適当に作って置く。
# make webpage
を実行すると/var/www/以下のwebpageを更新する。
SiriProxy-HA1Controlのinstall
# cd /root
# git clone https://github.com/mnakada/SiriProxy-HA1Control.git
登録したリモコンコードに対応する部分を編集するので/root/SiriProxy-HA1Control/に展開する
# cd /root/SiriProxy-HA1Control/lib
# vi siriproxy-ha1control.rb
で編集する
listen_for /.../ do
から
request_competed
end
までのひとかたまりを適当にコピーして
listen_forの行に目的の言葉を正規表現で記述
ha1commandの行を送信するリモコンの名前
res = ha1command("hogehoge")
に変更
sayの行は正常終了時の応答、異常終了時の応答をそれぞれ記述する
# cd /root/ha1control/SiriProxyDaemon
# vi config.yml
で18行目の
- name: 'HA1Control'
git: 'git://github.com/mnakada/SiriProxy-HA1Control.git'
を
- name: 'HA1Control'
path: '/root/SiriProxy-HA1Control'
に変更して
# make install
# make restart
# tail -f /var/ha1/siriprxy.log
で
[Info - Server] SiriProxy up and running.
の行がでたらiPhoneのsiriを起動して登録した言葉を話してみてください。
滑舌によっては違う言葉になってしまうので正規表現で適当に解釈を広げて下さい。