背景
始めに
Raspberry Pi でヘンな物をつくって自分で使って遊んでいる間はいいのですが、誰かに提供する時に困ってしまうのが WiFi の設定で 「そちらのネットワーク環境に合わせて WiFi の設定をしてね」と言ってしまうと相手が困ってしまいます。
以前、wpa_cli から wps を使って自動設定する方法を考えたのですが、wps自身があまり知られておらず、wps 対応のモバイルルーターを持っている人もどうやって使うのか知らないようでした。持ってる人も使い方を知らない機能って...
これに懲りて、まず私の周りの方々のリテラシーを具体的に聞き取り調査してみた所、大変興味深い事実が浮き上がってまいりました
- PC (Windows) でテキストファイルの読み書きは出来る
- 自分のモバイルルーターの SSID とか wpa key とかを調べることができる
前者については、まあそうかなと思っていたのですが予想外だったのが後者で、 意味は分からないんだけど人に聞けば分かるとの事。なるほど、こういう問題解決の方法もあるんですね、盲点でした
ソリューション
だったら解決策は実に簡単で、
「
1. Raspberry Pi の SD カードを抜いて PC に挿してね
2. そしたら boot って名前のドライブが見えるから、そこに addwpa.txt ってファイルを作って
3. 一行目に SSID の値を、二行目に wpa の key の値だけ書いて、それ以外なにもかかないで
4. 書いたら、その SD カードを PC から抜いて Raspberry Pi に挿して起動して
」 というお願いは通じるので、後は Raspberry Pi の起動時にそこから読んで wpa_cli で設定するスクリプトを書くだけですね。
スクリプト
上記のスクリプトを実装するとこんな感じになります
addwpafile=/boot/addwpa.txt #wpa追加定義ファイル
if [ -e $addwpafile ]; then #wpa追加定義ファイルがあれば
ssid=`head -n 1 $addwpafile`
psk=`tail -n 1 $addwpafile`
if [ -n "$ssid" -a -n "$psk" ]; then #両方とも長さが0でなければ
# wpa_supplicant.conf の末尾に network 定義を追加
nn=`wpa_cli add_network | tail -n 1` # 追加した network number
wpa_cli set_network $nn ssid \"$ssid\"
wpa_cli set_network $nn psk \"$psk\"
wpa_cli enable_network $nn
wpa_cli save_config
# wpa追加定義ファイル の削除
rm $addwpafile
fi
fi
※2016.09.09 追記
これだと改行コードの違いのせいで Windows に SD カードを挿して書いた addwpa.txt ファイルを正しく処理できません。
github のほうには addwpa.txt を読む前に nkf (懐かしい!)で改行コードを Linux のものに揃えるようにした fix と、nkf のインストールスクリプト(という程たいそうなものでもないのですが)を置いています
※追記終わり
これを適当な場所(/home/pi とか)に置いて、それから /etc/rc.local の末尾の exit 0 の手前とかに以下のように追加しておけば
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
# add wpa start
/home/pi/addwpa.sh
exit 0
起動時に addwpa.txt の存在をチェックしてあれば wpa_cli で追加し、成功したら addwpa.txt を削除します
future works
とりあえず私の当座の目的は達成できているのですが、なにかありましたらgithubにプロジェクトをあげておきましたので、issue レポートをいただければ幸いです。もし「修正しといたよ」という pull requests など頂けようものなら将に至福の至りにございます
反省
何事も思い込みって誤解の原因ですね。聞いてみるもんですね。