RasPi4+BookwormOSで、WiFiアクセスポイント

参考にしたサイト


RaspberryPiで作品を作る時はいつも、インターネットにつながっていないWiFiルータを用意して、SSHやVNCで接続していました。でも、外に持って行くとWiFiルータがつながりにくくなることがあって、RaspberryPiに直接接続したいなぁと思っていました。そして開発するときはインターネット接続が必要なので、開発と本番の設定を何も変えずにいけるといいなぁと思っていました。そんなとき、上記のサイトで、まさにその方法を知ったのでした。

その方法をおおまかに説明すると、RaspberryPiのWiFiはそのまま、同じWiFiハードウェアで仮想インターフェイスを作成します。そしてその仮想インターフェイスを、RaspberryPiが起動した時に自動生成するようにします。そのとき重要なのは、WiFiハードウェアのMACアドレスと、「iw dev」で確認した「phy#0」などのWi-Fiデバイスの物理インターフェースの番号です。この番号は「phy#1」などに変わることがあるのですが、参考サイトでは特にそのことは書かれていません。この番号が変わると、うまく仮想インターフェイスが生成できませんでした。

具体的には参考サイトの通り「phy#0」を指定してスクリプトを書いたのに、実際には「phy#1」になっていて「phy#0」が存在しないので、スクリプトが機能せず仮想インターフェイスが生成できませんでした。偶然うまくいくこともありましたが、理由がわからず再現できませんでした。何度もOSを焼き直して最初からやり直しても同じでした。


ChatGPTに聞いてみたら、以下のように情報がもらえました。

「phy#0」、「phy#1」などの番号が起動時に変動する理由は、Raspberry PiやLinuxのWi-Fiドライバが物理インターフェースを動的に認識するためです。具体的には、Wi-Fiチップの初期化順序やシステムのデバイス認識順序に依存しています。

phyの番号は、起動中の処理のタイミングによって動的に割り振られるみたいです。ということは、さっきまで上手くいってたのに、開発を進めて行く中で、何か設定を変えたり何かインストールしたりすると、上手くいかなくなる可能性が否めません。

それではとても困るので、なんとか確実にうまくいく方法はないかと試行錯誤していました。そこでChatGPTに相談すると、phyの番号を指定せず、WiFiインターフェイス名「wlan0」で指定するスクリプトを教えてもらえました。

うまく仮想インターフェイスが生成されたら、ネットワークマネージャー(nmcli)のコマンドで、WiFiアクセスポイントをつくります。これはコマンド1つで確実にできるので、とにかく仮想インターフェイスが生成できているるかがポイントになります。


1、「iw dev」で「wlan0」のMACアドレスを確認

iw dev
pi@fukasawa:~ $ iw dev
phy#0
	Unnamed/non-netdev interface
		wdev 0x3
		addr e6:5f:01:65:14:0b
		type P2P-device
		txpower 31.00 dBm
	Interface wlan0
		ifindex 4
		wdev 0x2
		addr e4:5f:01:65:14:0b
		ssid mathrax
		type managed
		channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
		txpower 31.00 dBm

2、WiFi仮想インターフェイス「ap0」を生成するスクリプト

sudo nano /opt/create_virtual_iface.sh
#!/bin/bash

# Wi-Fiインターフェイス名
WIFI_IFACE="wlan0"
# 仮想インターフェイス名
VIRTUAL_IFACE="ap0"
# 仮想インターフェイスのMACアドレス(iw devで確認したwlan0のMACアドレス)
TARGET_MAC="2c:cf:67:4d:16:4e"

# Wi-Fiインターフェイスが存在するか確認
if ip link show "$WIFI_IFACE" &>/dev/null; then
    # 仮想インターフェイスを作成
    sudo iw dev "$WIFI_IFACE" interface add "$VIRTUAL_IFACE" type __ap
    # MACアドレスを設定
    sudo ip link set "$VIRTUAL_IFACE" address "$TARGET_MAC"
    # 仮想インターフェイスを有効化
    sudo ip link set "$VIRTUAL_IFACE" up
    echo "$VIRTUAL_IFACE created and configured successfully."
else
    echo "$WIFI_IFACE not found!"
    exit 1
fi

3、スクリプトに実行権限を与える

sudo chmod +x /opt/create_virtual_iface.sh

4、起動時に自動でスクリプト実行するようにserviceに登録する

sudo nano /etc/systemd/system/create_virtual_iface.service
[Unit]
Description=Create Wi-Fi Virtual Interface
After=network.target

[Service]
ExecStart=/opt/create_virtual_iface.sh
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable create_virtual_iface.service

5、サービスを起動して動作確認

sudo systemctl start create_virtual_iface.service


6、出来たら再起動

7、インターフェイスの確認

iw dev
pi@fukasawa:~ $ iw dev
phy#0
	Unnamed/non-netdev interface
		wdev 0x3
		addr e6:5f:01:65:14:0b
		type P2P-device
		txpower 31.00 dBm
	Interface wlan0
		ifindex 4
		wdev 0x2
		addr e4:5f:01:65:14:0b
		ssid mathrax
		type managed
		channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
		txpower 31.00 dBm
	Interface ap0
		ifindex 3
		wdev 0x1
		addr e4:5f:01:65:14:0b
		channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
		txpower 31.00 dBm

8、ネットワークマネージャーコマンドでアクセスポイント作成

sudo nmcli connection add type wifi ifname ap0 con-name rpi_ap autoconnect yes ssid SSID_NAME 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared ipv4.address 192.168.20.1/24 ipv4.never-default yes wifi-sec.key-mgmt wpa-psk wifi-sec.pairwise ccmp wifi-sec.proto rsn wifi-sec.psk PASSWORD

SSID_NAMEと、PASSWORDは、好きなものに変えてください

9、VNCで確認してみる