マツド・サイエンス研究所

Raspberry Pi Zero Wを買った アクセスポイント化に成功

先日 (7月18日)、Raspberry Pi Zero Wが、やっと技適を取得し、販売が開始された。早速購入。7月21日に届いたので、約一週間。

その間、Rasbianのデスクトップ版やCUI版を試すが、この辺の話はネット上にも多数載っているので、特に報告することはない。

その後、USBケーブルだけで Raspberry Pi Zero W をセットアップする方法と、それを使って、無線アクセスポイント・ルーター化することに成功した。この2つは一寸特殊な使い方なので、これらを紹介する。

前半:USBケーブルだけで Raspberry Pi Zero W をセットアップ

私は、母艦に Windows10マシンを使ったが、UbuntuでもMACでも使えるらしい。(Ubuntuは確認済み。MACについては、私がMACを持っていないので未確認)

まず、https://www.raspberrypi.org/downloads/raspbian/ から、2017-07-05-raspbian-jessie-lite.zipをダウンロード。

これを解凍して得た 2017-07-05-raspbian-jessie-lite.img を Win32DiskImager を使って、microSDに書き込む。

microSDは、8GB以上が推奨されているようだが、2GBでも動いた。

Windows10が microSD を識別すると boot ドライブが見つかるが、このなかに

・ssh と言う名の空ファイルを作る

・cmdline.txt を次のようにする

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/raspi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles

・config.txt の最後に下行を追加

dtoverlay=dwc2

Windows10側としては、

RPI Driver OTG:URLからドライバーをダウンロードして解凍しておく

・iTunes もしくは、Bonjour Print Services (Windows)をダウンロードしてインストしておく

最初の接続

・先ほど作った microSD を Raspberry Pi Zero W に挿入

・USBケーブルで、母艦PCとRaspberry Pi Zero Wを接続

・Windows10側のコントロールパネルのデバイスマネージャーのCOMの項目に「USBシリアルデバイス(COM6)」が増えている(COMの番号は、異なる場合があるので注意)

・「USBシリアルデバイス(COM6)」を右クリックし、ドライバーソフトウェアの更新

・「コンピューターを参照して、ドライバーソフトウェアを検索します」で、先ほどダウンロード・解凍しておいた RPI Driver をインスト

・デバイスマネジャーのネットワークアダプターに「USB EthernetRNDIS Gadget」が追加される

・しかし、エラーが出ている(どうも、1回目にエラーが出るのは、共通らしい)

2回目の接続

・Windows10 の再起動

・デバイスマネジャーのネットワークアダプターに「USB EthernetRNDIS Gadget」が追加される

・ Raspberry Pi Zero W に接続しても、今度はエラーなし

・Puttyjp.exe や TeraTerm で、raspberrypi.local を SSH 接続できる。

・デフォルトでは、IDは pi パスワードは raspberry

・このままでは、Raspberry Pi Zeroからインターネットをアクセスできない

Raspberry Pi Zeroからインターネットをアクセス

・Windows10側「コントロールパネル」「ネットワークとインターネット」「ネットワークと共有センター」

・Wifi(xxx:貴方が接続しているWifiのSSID)をクリック「プロパティ」「共有タブ」「インターネットのほかのユーザーに、このコンピューターのインターネット接続をとおしての接続を許可する」を選択

・「コントロールパネル」以下のダイアログを「OK」ボタンなどで全て消す

・しばらくすると、Raspberry Pi Zero Wからインターネットをアクセスできるようになる

・sudo apt-get install で、Apache2をインストールすると、母艦のWindows10から http://raspberrypi.local でアクセスできるようになる

後半:アクセスポイント化

これは、Raspberry Pi 3に内蔵の WiFiを使った無線LANアクセスポイント化 hostapd + isc-dhcp-server編を参考にしたが、Raspberry Pi Zero W にアレンジしている

$ sudo apt-get install hostapd isc-dhcp-server

/etc/network/interfaces を次のようにする

source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
iface eth0 inet manual
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.123.234
netmask 255.255.255.0
network 192.168.123.0
broadcast 192.168.123.255
allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

/etc/dhcpcd.conf を次のようにする

hostname
clientid
persistent
option rapid_commit
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
option ntp_servers
require dhcp_server_identifier
slaac private
nohook lookup-hostname
denyinterfaces wlan0

$ sudo service dhcpcd restart
$ sudo ifdown wlan0; sudo ifup wlan0

/etc/dhcp/dhcpd.conf を次のようにする

ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
subnet 192.168.123.0 netmask 255.255.255.0 {
range 192.168.123.100 192.168.123.120;
option routers 192.168.123.234;
option broadcast-address 192.168.123.255;
option domain-name local_pi_dns;
option domain-name-servers 8.8.8.8 4.4.4.4;
default-lease-time 600;
max-lease-time 7200;
}

なお、「8.8.8.8 4.4.4.4」を「192.168.137.1」にすると、母艦 Windows10 のドメインサーバーの設定を引き継ぐようである

/etc/default/isc-dhcp-server を次のようにする

INTERFACES="wlan0"
$ sudo bash -c "zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz > /etc/hostapd/hostapd.conf"

/etc/hostapd/hostapd.confは長いので、変更点のみ記す

「# driver=hostap」を「driver=nl80211」に

「ssid=test」を「ssid=WIFISSID」に

「#wpa=1」を「wpa=2」に

「#wpa_passphrase=secret passphrase」を「wpa_passphrase=PASSWORD」

(さすがに SSID と パスワードは書き換えてね)

/etc/default/hostapd を次のようにする

DAEMON_CONF="/etc/hostapd/hostapd.conf"

/etc/sysctl.conf を次のようにする

net.ipv4.ip_forward=1
net.ipv6.conf.all.disable_ipv6 = 1

/etc/rc.local を次のようにする

_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
iptables-restore < /etc/iptables.ipv4.nat
exit 0

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

とやって、再起動

これで、アクセスポイント化ができた

アクセスポイント化して、どうするの?

これを説明したのが、2つ目の絵。

例えば、出先で、仲間だけでネットを組みたい場合。

図のようにアクセスすれば、Raspberry Pi Zero W にファイルサーバーを立てておけば、ファイルの共有化ができる。

ファイルサーバーが無くても、フォルダーを共有化しておけば、仲間内だけで、ファイルの共有も可能だ。

この場合、パスワードさえ破られなければ、仲間以外からファイルを守ることができる。外から中には入って来れないが、中から外をアクセスすることは可能なので、Googleでの検索やLine、メールなどは普通に使える。

まあ、正直、ファイルの共有くらいなら、外部のクラウドサービスを使った方が早いのだが、むしろ、Apache2やNode.jpを使って、WebSocketを駆使したチャットや対戦ゲームやチェックリストの方が効果があるだろう。

チャットや対戦ゲームやチェックリストのオリジナルなプログラムを作って、仲間内だけで使う。

この場合、山奥とか離れ小島とか、インターネットにアクセスする方法がない場所でも、(もちろんインターネットアクセスはできないが)仲間内でのチャットや対戦ゲームやチェックリストを使うことができる。

一番やってみたいのは、最後のチェックリストなんだよね。

WebSocketを駆使して、誰が何を何時何分に作業し、チェックしたのかを、メンバー全員にリアルタイムで配信して、作業効率を上げるんだ・・

2017.08.05 誤記があったので、少し修正

注意

ブログのコンテンツの内、「告知」など時期よって情報価値が無くなるのは除いてある。また、コンテンツに付いたコメントは書き込み者に著作権があるものと判断し、ここに持ってきていないので、コメントを見るときは、元々のブログコンテンツを参照してもらいたい。

その他、ブログ発表後、コメントなどの内容を反映するなど、内容を変更しているものもあるので、注意してほしい。