RaspberrypiをWifiアクセスポイントにする。（スタンドアローン）


# はじめに
Web地図、ベクトルタイルサーバーを立てるため、ラズベリーパイのWifiアクセスポイント化を試しました。今回は、ラズベリーパイの情報にアクセスすることを目的にしますので、インターネットへの接続はないスタンドアローンな形になりますが、実験してみました。

# 私の環境
* Raspberry Pi 400 (キーボードのやつ)
    * Raspbian GNU/Linux 11 (bullseye), release 11
* Raspberry Pi 3B
    *  Raspbian GNU/Linux 10 (buster)
* 手元のPCはwindows 10で、Windows PowerShellからSSH接続しました。（wifiとLANケーブルのどちらも準備してありました。）

# 手順
## Step 0 
### プライベートなIPアドレスを決めておく
企業のLAN、家庭用のネットワークなどのプライベートネットワークに予約されているIPアドレスは以下の様なものだったと思います。この範囲で、Raspberry Piのアドレスと、DHCPで配布するアドレス範囲を決めておきます。
* 10.0.0.0 ～ 10.255.255.255　（24ビット）
* 172.16.0.0 ～ 173.31.255.255　（20ビット）
* 192.168.0.0 ～ 192.168.255.255　（16ビット）

今回は、とりあえず、以下の様にしてみたいと思います。172シリーズにしたのはデフォルトだと192なので、少し変えて試してみたいということが理由です。
* ラズパイ： 172.16.0.1
* DHCP範囲： 172.16.0.2 ～ 172.16.0.100

### ネットワークの名前など
SSIDとパスワードも決めておきます。
* SSID：**UNVT**
* パスワード： **password**　（※ここにメモするようにはこのパスワードにしておきますが、実際は違います。）

### チェック
ifconfigでwlan0があることを確認（以下はRaspberrypi 3Bの例）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b93ad4f8-5866-2a95-2487-361fa131a4f3.png)



## Step 1
LANケーブルでパソコンとつなぐ。電源オン。そして、Windows PowershellからSSH接続。（自分のメモ：wifiでなくてLANケーブルでつなぐときは pi@host名.local とする。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/d6aee613-0bfe-10a1-c424-fef104a614cb.png)


## Step 2 
hostapd と dnsmasqをインストールする。
（/etc/wpa_supplicant/wpa_supplicant.confを編集して自宅のwifiにつながるようにしておきましょう。忘れてたので編集してから再起動して、実行しました。）
```bash
sudo apt install hostapd dnsmasq
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/fcce8b22-eb96-97d2-39ba-4b29769ff9f6.png)

## Step 3
DHCPサーバーの設定をします。/etc/dnsmasq.confを編集します。私はviで編集します。catコマンドでdnsmasq.confを読むと、コメントアウトしてある状態でいろいろ書いてあります。今回は interface=wlan0とdhcp-rangeの指定をすることにします。

```bash
sudo vi /etc/dnsmasq.conf
```
見えにくいですが、元々のファイルの、106行目と163行目にinterfaceとdhcp-range（サブネットを使うパターン）が書いてあります。それに習って書きました。

```conf:dnsmasq.conf
interface=wlan0
dhcp-range=172.16.0.2,172.16.0.100,255.255.255.0,12h
```
私は106行目の下と、163行目の下に書きましたが、一番下にまとめて書いた方があとで楽かもしれませんね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/dcefa52e-f4b8-2d67-3dfe-0cd07eecb904.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/6b07309c-6ed5-0dc4-280b-7a3a41bde06d.png)

以下のページを見比べると、local wireless DNS domainと、ルーターに帯するAliasの設定もしています。
https://github.com/yuiseki/vector-tile-builder/blob/main/conf/etc/dnsmasq.conf

~~私の環境も考えて、以下の様な2行も追加しておくことにします。~~
(上手くいかなかったのでとりあえず追加しないでやることにします。)

```conf:dnsmasq.conf
domain=wlan
address=/raspberrypi400/172.16.0.1
```

## Step 4. 
DHCPクライアントの設定をします。 dhcpcd.confを編集します。

```bash
sudo vi /etc/dhcpcd.conf
```
以下を追加しておきます。
```conf:dhcpcd.conf
interface wlan0
static ip_address=172.16.0.1/24
```

https://github.com/yuiseki/vector-tile-builder/blob/main/conf/etc/dhcpcd.conf を見比べると、nohook wpa_supplicantがないのですが、これはなんだろうと考えました。このファイルで指定している wifi にはつながっておきたいので、nohookはなしでいこうと思います。（あとで気づきましたが、ここのnohookがないとうまくいきません。）

## Step 5 
hostapdの設定を作成します。/etc/hostapd/hostapd.conf にファイルを作ります。以下のページも見ながら内容を決めていきます。
参考　https://github.com/yuiseki/vector-tile-builder/blob/main/conf/etc/hostapd/hostapd.conf


以下の様に書きました。最初の2行はなくても大丈夫でした。また、チャンネルは適切な範囲で変えても大丈夫です。なお、私は現在米国在住なのでカントリーコードはJPではありません。
```conf:hostapd.conf
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=wlan0
driver=nl80211
country_code=US
ssid=UNVT
hw_mode=g
channel=11
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
```

その後、

```
sudo vi /etc/default/hostapd
```

として、DAEMON_CONF="/etc/hostapd/hostapd.conf"　を一行追加しておきます。

## Step 6. hostapdサービスの調整
ここで、hostapd.serviceの状態を確認すると、maskedになっていました。このままだと動かないので、アンマスクに変更しておきます。

```bash
systemctl status hostapd.service
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/4cbd0384-55b9-9dff-463b-682f9a7f8434.png)

```bash
systemctl unmask hostapd.service
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/bce5e32d-8f41-bfa0-adb8-b7a478c36c3f.png)

そのあとにサービスをスタート（start）します。止める(stop)ことも出来ます。状態を確認するにはstatusで見られますが、エラーの詳細などを見たいときにはjournalctl -xe を使うと便利です。
```bash
sudo systemctl start hostapd.service
sudo systemctl stop hostapd.service
sudo systemctl status hostapd.service
journalctl -xe
```

しかし、wlan0: Could not connect to kernel driver　のメッセージが出てきているので調整が必要です。次のステップで詳しく書きます。


なお、サービスをenableにしておくと、ラズベリーパイの起動時からサービスがスタート出来ます。
```
sudo systemctl enable hostapd.service
```

## step 7
前のステップまでで本当は大丈夫なはずですが、私の場合はWifiスポットが立ち上がりませんでした。wlan0: Could not connect to kernel driver　のメッセージが出てきているので調整が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/2ff93b5e-3adb-0e1b-c233-6df43e76b472.png)

**結果を先にいうと、どうやらRaspberry Piをwifi(wlan0)で自宅インターネットに接続しておくと、そちらがもう使われてしまっているのか、自分でWifiポイントになれないということのようです。**
/etc/wpa_supplicant/wpa_supplicant.conf のwifi接続情報を削除しても上手く行きますし、/etc/dhcpcd.confのところに、nohook wpa_supplicantを追加しても上手くいきます。
ただし、注意が必要で、ラズベリーパイをwifiネットワークから切り離してしまうと、sshをするときにLANケーブルでPCとつないでやるか(hostname.local)、またはRaspberrypiのwifiスポットに接続してからsshをするかのどちらかになると思います。（もともとラズベリーパイに直接キーボードをつないで操作していたり、LANケーブルでつないで操作している場合は心配ない。）


### 調整の記録
以下、念のため、エラーを解決するために試したことをメモしておきます。ipv4の調整などはもしかしたら影響したかもしれません。

* sudo vi /etc/hostapd/hostapd.conf で設定をいじってみます。
    * チャンネルを変えてもダメ
    * driver=nl80211をdriver=nl80211dに変えてみた。　-->　だめ

しばらくするとエラーメッセージが変わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/0ca8e83d-ab91-afe0-cb5d-ed5fa61e209f.png)
journalctl -xe　で見てみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/7e11fd40-6486-1b18-34fc-b2285c9aa7e9.png)

* 再起動してみました。　-->　だめ
* sudo update-rc.d hostapd enable　-->　だめ

このあたりをいじってみました。　-->　だめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/d66397d9-8568-6cff-a7dc-9cae6ab27325.png)

まだダメです。IPアドレス関係でしょうか。ここをなんとかしたい。
Nov 27 07:20:58 raspberrypi3b kernel: ieee80211 phy0: brcmf_cfg80211_stop_ap: setting AP mode failed -52
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/85cbb8a2-2d05-46a8-b248-ff27149c7c84.png)


Wifiの設定ファイルを編集してwifiを使わなくしてみました。 → 上手くいった。

## step 8
結果を観察してみます。上手く立ち上がったときのサービスのステータスは以下の感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/9b616a58-2029-b44e-b72a-19fd506a9c37.png)

パソコンからもwifiポイントが見られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/2d6be5e3-6686-0225-b68d-6a16f1d676d5.png)

接続してみると、以下の様にプロパティが見られますが、IPアドレスの割り振りなど、思った通りに行っていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/f8150f63-b785-9c50-916c-593787fa1885.png)

# まとめ
今回は、RaspberrypiをWifiアクセスポイント（インターネットなし）にすることを試し、ある程度上手くいきました。これにより、Raspberrypi での地図サーバー作成に一歩近づきました。

今後、ラズベリーパイ側でウェブサーバーを立ち上げ、コンテンツにアクセスできるか試して見ようと思います。

# 謝辞
以下に示す参考ページをはじめ、先行された皆様の経験に学ばせていただきました。感謝します。

# 参考にしたページ
https://www.mikan-tech.net/entry/raspi-wifi-ap
http://herb.h.kobe-u.ac.jp/raspiinfo/raspiAP.html
https://github.com/yuiseki/vector-tile-builder