概要
Raspberry Pi 3/4/zero wに搭載されているwifiモジュールは、クライアントとしてwifiに接続することも、アクセスポイント(AP)として他の機器からRaspberry piに接続することもできます。
アクセスポイントとして起動すれば、キーボードやモニタを用意せずにスマホからSSH接続して設定を行うことができます。
ここでは、AP⇔wifiのそれぞれのモードを相互に切り替える手順を記載します。
以前同じ手順を説明する以下の記事を書いたのですが、より適切と思われる手順を確認したので再度投稿しています。
以下、
- wifi=Raspberry Pi以外のアクセスポイント
- AP=Raspberry PiのwifiモジュールをAPとして動作させるもの
という意味で書いています。(若干ニュアンスが不正確ですがご容赦ください)
セットアップ
今回検証した環境
項目 | 内容 |
---|---|
ハード | Raspberry Pi 4 |
OS | Raspbian GNU/Linux 10 (buster) |
hostapd(APとして動作させるデーモン)とdnsmasq(簡易DHCPサーバ)をインストール。
sudo apt install hostapd dnsmasq
hostapdの設定
APとして動作させる場合の設定を記します。
interface=wlan0
driver=nl80211
ssid=<SSID名>
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=<パスワード>
rsn_pairwise=CCMP
dnsmasq(DHCPサーバの設定)
interface=wlan0
dhcp-range=172.24.1.100,172.24.1.200,255.255.255.0,1h
hostapdのサービスを有効化します。ただし、自動起動されたくないので、disableにします。
sudo systemctl unmask hostapd
sudo systemctl disable hostapd
wpa_supplicantの設定
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="<wifiのSSID名>"
psk="<wifiパスワード>"
}
この設定をした状態で以下コマンドを実行すると、wifiに接続します。
sudo systemctl restart dhcpcd
蛇足:
wifiへの接続を行うサービスはwpa_supplicantですが、wpa_supplicantがwifiに接続するよう設定を行っているのはdhcpcdです。
この処理は/lib/dhcpcd/dhcpcd-hooks/10-wpa_supplicantというシェルスクリプトがdhcpcdが起動するとき一緒に起動することで実現されています。
dhcpcd自体はDHCPのクライアントなのに、wifi接続の設定をやっているという、モジュール化という観点で言えば看過し難い設計になっています。
wifi→APへの切り替え
wpa_supplicantとdhcpcdを停止します。
sudo systemctl stop wpa_supplicant
sudo systemctl stop dhcpcd
固定IPをipコマンドで設定します。この方法なら設定ファイルを編集せずにすみます。
sudo ip addr add 172.24.1.1
sudo ip route add default via 172.24.1.1
DHCPサーバを起動します。
sudo systemctl start dnsmasq
hostapdを起動します。
sudo systemctl start hostapd
以上でその他の機器から、hostapd.confにて設定したSSIDに対して接続可能となります。
AP→wifi
hostapdを停止。
sudo systemctl stop hostapd
dnsmasqを停止
sudo systemctl stop dnsmasq
固定IP設定を削除
sudo ip addr flush dev wlan0
wpa_supplicantを起動
sudo systemctl start wpa_supplicant
dhcpcdを起動
sudo systemctl start dhcpcd