WiFiのみのインストールとAP/STAの作成

概要

  • Raspberry Pi 3 B+ を使ったWifiのみでOS(Liteバージョン)をインストールする方法の確認
  • Wifi1ポートで、AP/STA接続する方法。

Raspberry Pi 3 B+ を使ったWifiのみでOSをインストールする方法の確認

これは比較的簡単に出来ました。母艦はUbuntuです。

  • OSイメージをSDに焼く
    • 下記の順番でSDを作成して下さい。
      1. Raspberry Pi Imager を上げる
      2. Raspberry Pi OS(other) を選び
      3. Raspberry Pi OS Lite(32-bit)を選ぶ。
      4. 書き込むSDを選択して書き込みを開始。
  • 一度SDカードを抜き、サイド挿入すると、boot と rootのドライブが認識される。
  • Wifiを有効にする為に、
    • bootの直下に、”wpa_supplicant.conf”を作成。
    • SSIDとPSKは環境に合わせて指定して下さい。
/boot/wpa_supplicant.conf

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
     key_mgmt=WPA-PSK
     ssid="XXXXXXXXXX"
     psk="YYYYYYYYYY"
}
  • SSHを有効にする為に、
    • bootの直下に ssh というファイルネームのファイルを作成
    • 中は空でOK。
    • Boot時に”ssh”というファイルの有無を確認してSSHの有効無効を行っている様です。
  • 出来上がったSDをRaspberry Pi(今回は3b+)に挿入して電源ON。
  • モニターを接続していればモニターでReadyを確認。接続していなければLEDを頼りにReadyを判断。今回は、約3分位でReadyになりました。
  • PC側から SSHを実行。”ssh pi@raspberry.local” パスワードは、”raspberry” です。

後はUpdateとUpgradeを行えば完了です。この時点でSDカードの容量を確認すると下記の様になりました。約1.3Gの消費です。今回は32GのSDカードを使用しましたが10%も使っていません。さすが、Lite です。

Wifi1ポートで、AP/STA接続する方法

Raspberry Piから見た各機器への繋がり方を簡単に説明するとこんな感じ。

  • STA接続 : ルータを親機に子機としてRaspberry PiやPCがつながった状態
  • AP接続  : Raspberry Piが親機となりルータを通さずにとPC等と直接つながる

スマホでRaspberry Piを HttpServer等使ったWeb画面でコントロールする場合、通常STA接続で行っています。しかし、外で何かの測定を行う等ネット環境が無い場合、STA接続することが出来ません。その様な場合は、AP接続を使う事になります。Raspberry PIのWifiデバイスは1つなので、どちらかの接続を選択すると他方は使用出来ない様に思えます。AP接続だけではSSHが使えない為プログラム開発の能率が良くありません。この様な場合、多分有線またはWifiを追加してそちらをSTA用とし母艦となるPCと接続するのが一般的と思っていました。ところが、Webで1つのWifiで切り替えてAP/STA接続する方法について説明しているページを見つけました。”AP-STA mode” によると、Raspberry PiのWifiディバイスは、アクセスポイント(AP)とワイヤレスクライアント/ステーション(STA)の同時操作をサポートしていて1つのWifi機器でWi-Fi AP / STA同時実行することが出来る様です。

必要なソフトのインストール

現在、OSのインストールが終了した時点で、STA接続。先ずはAP接続するために必要はソフトをインストールします。必要はソフトは、hostapd と dnsmasq です。


sudo apt install hostapd
sudo apt install dnsmasq

dhcpcd.confの設定

AP-STA mode”によると、wlan0のコピーを作ってそれと切り替えながら、AP/STA接続を行うと有ります。先ずは、wlan0のコピー、”uap0” を /etc/dhcpcd.conf に追加します。/etc/dhcpcd.conf をエディタで開き最後に下記を追加します。

/etc/dhcpcd.conf

# RaspAP uap0 configuration
interface uap0
static ip_address=192.168.2.1/24
nohook wpa_supplicant
  • static ip_address=192.168.2.1/24 : 
    • 現在使用しているルーターが、192.168.3.1/24 なのでそれを避けています。環境に合わせて変更して下さい。
  • nohook wpa_supplicant: 
    • wpa_supplicantが、wlan0 を指しているようで、これで wlan0と一緒に動くなとなる様です。

hostapd.confの設定

hostapdの設定ファイルです。これちょっと難しいです。保存場所は、/etc/hostapd/hostapd.conf

/etc/hostapd/hostapd.conf

# RaspAP wireless client AP mode
interface=uap0
driver=nl80211
hw_mode=g
channel=1
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
ssid=raspi-ap
wpa_passphrase=12345678
wpa_pairwise=CCMP
country_code=JP
  1. 注釈
  2. uap0についての記述
  3. ドライバーの指定。
  4. 利用する周波数帯。
    • b:IEEE 802.11b
    • g:IEEE 802.11g
    • a:IEEE 802.11a
  5. 使用するチャンネル。すでにWifiを使っているようでしたら、nmcli で空いているチャンネルを確認
  6. ieee80211nを有効
  7. wmm_enabledを有効
  8.  
  9. 認証アルゴリズム
    • 0: 暗号化なし
    • 1: WPA
    • 2: WEP
    • 3: 両方
  10. WPAのバージョンを設定
    • 1: WPA
    • 2: WPA2
    • 3: 両方
  11. 利用する共有鍵認証の方式
  12. 使用するSSID。今回は、”raspi-ap”と指定
  13. 接続する際のパスワード。8文字以上必要。今回は、”12345678”と指定
  14.  
  15. 国指定

ネットの環境によって指定値が変わります。nmcliを使いながら指定して下さい。このファイルをhostapdで使用する事を定義するために、/etc/default/hostapd を編集する必要が有ります。エディタでファイルを開いて下さい。

/etc/default/hostapd

# Defaults for hostapd initscript
#
# WARNING: The DAEMON_CONF setting has been deprecated and will be removed
#          in future package releases.
#
# See /usr/share/doc/hostapd/README.Debian for information about alternative
# methods of managing hostapd.
#
# Uncomment and set DAEMON_CONF to the absolute path of a hostapd configuration
# file and hostapd will be started during system boot. An example configuration
# file can be found at /usr/share/doc/hostapd/examples/hostapd.conf.gz
#
#DAEMON_CONF=""

# Additional daemon options to be appended to hostapd command:-
#       -d   show more debug messages (-dd for even more)
#       -K   include key data in debug messages
#       -t   include timestamps in some debug messages
#
# Note that -B (daemon mode) and -P (pidfile) options are automatically
# configured by the init.d script and must not be added to DAEMON_OPTS.
#
#DAEMON_OPTS=""

13行目の、#DAEMON_CONF=”” を DAEMON_CONF=”/etc/hostapd/hostapd.conf” と変更して保存。

また、hostapd はMASKされているので起動出来るようにunmaskし、起動時に自動で起動する様にします。


sudo systemctl unmask hostapd
sudo systemctl enable hostapd

dnsmasq.confの設定

dnsmasqの設定ファイルです。/etc/dnsmasq.confに有るのですが、これをバックアップし、新たにファイルを作ります。


sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org
sudo nano /etc/dnsmasq.conf

新たなファイルの内容は、

/etc/dnsmasq.conf

interface=lo,uap0               # Use interfaces lo and uap0
no-dhcp-interface=lo,wlan0
bind-interfaces
dhcp-range=192.168.2.2,192.168.2.255,12h

これで設定は終了です。

起動時uap0の追加と実行

AP-STA mode”によると、uap0を起動時に追加と実行する必要が有るようです。実際の作業内容を以下に示します。


iw dev wlan0 interface add uap0 type __ap
ifconfig uap0 up
  • 1行目、wlan0にuap0を type ap として追加。
  • 2行目、uap0 の起動。

各サービスの起動順番

これで全ての準備が出来たのですが各サービの実行順を間違えると起動しません。

  • uap0の追加とhostapd
    • hostapdはAP接続用ソフトですから、uap0が出来た後に実行する必要が有ります。
  • dnsmasq
    • これは、AP接続に対するネームサーバですので、hostapd の後に実行。
  • uap0の追加
    • OS立ち上げ時に自動で実行したいので、rc.local にスクリプトを追加

これらを元に /etc/rc.local を編集。下記は rc.local の一部です。rc.local の if と exit0の間にコードを追加します。

/etc/rc.local

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
sudo systemctl stop dnsmasq
sudo systemctl stop hostapd
sudo iw dev wlan0 interface add uap0 type __ap
sudo ifconfig uap0 up
sudo systemctl restart hostapd
sudo systemctl restart dnsmasq

exit 0
  • dnsmasq と hostapdを止める
  • uap0を追加して実行
  • hostapdを先に実行して次にdnsmasqを実行。

これで設定は終了です。Raspberry Piをリブートして下さい。

検証

立ち上がったら、確認を行います。正しく設定されていれば、SSHの接続が可能です。PCからSSHでRaspberry Pi に接続して下さい。ネットの構成を確認する為に ifconfig を行って下さい。

  • wlan0 : IPアドレスが、192.16.8.3.12。これはルータに接続している。(STA接続)
  • uap0  : IPアドレスが、192.168.2.1。こちらはAP接続。

SSHか動いていることから、wlan0は正しく動いている事が分かります。uap0の確認はスマホで行いました。スマホでWifiを検索する画面に行くと

  • 左: SSIDで指定した、”raspi-ap”を見つけている事が分かります。これを選択すると
  • 中: アクセスポイントのパスワードを聞かれます。指定した、”12345678” を入力すると
  • 右: アクセスポイントにつながった事が分かります。

これではつながった実感がわかないので、”まずは、Hello HTTP(01)” で使用した HPにアクセスすると ”Hello HTTP”と表示するPythonプログラムを実行して見ましょう。使用するプログラムは以下の通り。

hello.py

from http.server import HTTPServer, SimpleHTTPRequestHandler

class MyHandler(SimpleHTTPRequestHandler):
            
    def do_GET(self):

        self.send_response(200)
        self.send_header('Content-type', "text/html")
        self.end_headers()
        self.wfile.write("<h1>Hello HTTP!</h1> \n".encode())

host = ''
port = 8080
httpd = HTTPServer((host, port), MyHandler)
print('serving at port', port)
httpd.serve_forever()
  • このプログラムを、”hello.py”としてホームディレクトリに保存。
  • ターミナルから、”python3 hello.py” と実行して下さい。
  • スマホがAP接続している状態でブラウザを上げる。
  • ブラウザのURL欄に、”192.168.2.1:8080”と入力。
  • ブラウザに、”Hello HTTP”と表示されます。

感想

このAP/STA接続。かなり便利です。1つのWifiで出来るのですから大したものです。今回一番苦労したのは、hostapd.conf の作成です。何処まで設計しなければいけないのかパラメータの数と意味が分からず苦労しました。上手く接続出来ない時は、hostapd.confの設定を見直すと良いかも知れません。