LoginSignup
7
7

More than 5 years have passed since last update.

PC で SD カードに書いた情報を元に、Raspberry Pi 自身に自分の Wi-Fi を自動設定をさせるスクリプト

Last updated at Posted at 2015-09-05

背景

始めに

Raspberry Pi でヘンな物をつくって自分で使って遊んでいる間はいいのですが、誰かに提供する時に困ってしまうのが WiFi の設定で 「そちらのネットワーク環境に合わせて WiFi の設定をしてね」と言ってしまうと相手が困ってしまいます。

以前、wpa_cli から wps を使って自動設定する方法を考えたのですが、wps自身があまり知られておらず、wps 対応のモバイルルーターを持っている人もどうやって使うのか知らないようでした。持ってる人も使い方を知らない機能って...

これに懲りて、まず私の周りの方々のリテラシーを具体的に聞き取り調査してみた所、大変興味深い事実が浮き上がってまいりました

  1. PC (Windows) でテキストファイルの読み書きは出来る
  2. 自分のモバイルルーターの 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 で設定するスクリプトを書くだけですね。

スクリプト

上記のスクリプトを実装するとこんな感じになります

addwpa.sh
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 の手前とかに以下のように追加しておけば

/etc/rc.local
# 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 など頂けようものなら将に至福の至りにございます

反省

何事も思い込みって誤解の原因ですね。聞いてみるもんですね。

7
7
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7