NANOPI NEO3 Wifi追加して、WiFI/LAN接続可能にする

## NanoPi NEO3にWifi追加する際、苦労した件、問題の症状と解決策
目的の設定が完成するまでに様々な苦労がありました。Raspiをはじめ、その他SBCの設定に苦労される方にとっても役立つかと思い記載します。
主に次のような問題が発生し、様々な方法をネットの情報を元に試しました。

* **起動後にWifi接続できない**
WPA_Supplicant.confの確認と、WPA_Supplicantサービスの無効化で解決、恐らく起動時には、wifi デバイスが認識されていないためと思われます。
*  **起動後 iwconfig を見ると、SSIDが設定されていない**
Raspiでは、簡単に同じ環境を構築できるが、Nano Piで出来ないのは、恐らく、Wifiが内蔵ではなく。外付けUSB WiFiのためのと思われます。wpa_supplicantサービスの開始時には、wlan0が認識されていないことが原因と思われます。
* **自動起動時LANが接続されていないとWiFi接続できない、LANケーブルを接続するとWifiが接続できるが、LANケーブルを切断するとWiFiも切れる**
router gwがwlan0に設定されないため、wlan0は起動しているが、接続できない状態になっていると思われます。起動後、手動でwpa_supplicantを実行するとwifi接続できます。例えば:

```ruby:qiita.rb
sudo killall wpa_supplicant
sudo wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf
```

* **LANはstatic ipになるが、Wifiにstatic ipアドレスを指定できない**
 /etc/network/interfaces.d/wlan0 にstaticを記載しても反映されない。
* dhcpcdをやめてNetworkManagerで設定しようとしたができなかった 

## ゴール
NanoPi NEO3には、Gigabit LANが搭載されていますが、Wifiを追加して、LAN/WiFiどちらからも接続するようにして、デバイスをバッテリパックでも稼働できるネットワークカメラ化します。

WiFiは、USB2.0 Pinを使って接続します。Wifi アダプタは、KIMWOOD 2022を使いました。

## USB2.0 PINとWifi アダプタを接続
WiFiには、Realtek Semiconductor Corp. USB3.0 802.11ac 1200M Adapterを搭載した、Wifi アダプタを使います。

https://www.amazon.co.jp/gp/product/B09W5RKVJ6/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&th=1

こちらのWiFi アダプタも動作しました。
![wifi-adpt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/c6b6e1ea-73cc-e4b1-634d-867b85e58037.jpeg)

![NanoPi_NEO3-layout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/1328f1e6-31

USB2.0ピンとWifi ドングルを接続するためのUSBケーブルを作成する必要があります。

USB2.0
| Pin# | Name  |
|:-----------|:------------:|
| 1 | GND  |
| 3 | DP1  |
| 5 | DM1  |
| 7 | 5V  |

https://www.amazon.co.jp/gp/product/B08H22QJ6X/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

接続は、次のようになります。
![SUB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/c454280b-8bfe-5993-d57a-04b49714b46d.jpeg)

## NanoPi NEO3インストール
## OSイメージのダウンロード
rk3328-sd-freiendlycore-lite-focal-6.1-arm64-20231129.omz.gzを下記のサイトからダウンロードし、起動用のMicro SDカードを作成します。

https://drive.google.com/drive/folders/1rUHZ9d2rYl4MoLqVVbGDFCYZ25vsGOMi

USBカーブル、下が試作で上は量産用に作ったものです。

![USB-Cable.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568972/8c776c05-2829-7930-668b-08b20e1e6e5a.jpeg)


### PCからの接続
作成したMicro SDカードを挿入し、DHCPサーバのある環境にLANケーブルを接続後、NanoPi NEO3を起動します。

接続したipアドレスを探し、PuttyからSSHで接続します。デフォルトのID/パスワードは、pi/piです。
* Angry IP Scanner, Putty をインストールしておくと便利です。


### 初期設定
アップデートの適用と、よく使うモジュールをインストールします。
```ruby:qiita.rb

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install libudev-dev libv4l-dev libjpeg8 libjpeg8-dev 
sudo apt-get install libusb-1.0-0-dev freeglut3-dev
sudo apt-get install usbutils

```
タイムゾーン設定、ntp、ホスト名の設定
```ruby:qiita.rb
sudo timedatectl set-timezone Asia/Tokyo

sudo systemctl status systemd-timesyncd.service
sudo vi /etc/systemd/timesyncd.conf
// NTP=行を編集
[Time]
NTP=ntp.nict.jp
//サービスの再開
sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd.service

// ホスト名の設定
sudo vi /etc/hostname
sudo vi /etc/hosts
```

OS バージョンの確認
```ruby:qiita.rb
cat /etc/os-release

NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

### DHCPCDの導入と設定
dhcpcd をインストールして、Static ipをLANおよびWifiに設定します。
例: LAN側 192.168.1.251, WiFi側 192.168.3.144
```ruby:qiita.rb

sudo apt install dhcpcd5

sudo vi /etc/dhcpcd.conf
# static 以下を追記
interface eth0
static ip_address=192.168.1.251
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

interface wlan0
static ip_address=192.168.3.144
static routers=192.168.3.1
static domain_name_servers=192.168.3.1

```

:::note warn
重要
dhcpcd.confにwlan0を記載してもwlan0は設定されません。/etc/network/interfaces.d/wlan0 を作成してください。
:::
```ruby:qiita.rb
sudo vi /etc/network/interfaces.d/wlan0
//以下を記載
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
  address 192.168.3.144
  netmask 255.255.255.0
  gateway 192.168.3.1
  wpa-conf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

```

### wpa_suppliacntの設定
/etc/wpa_supplicant/wpa_supplicant-wlan0.confを作成編集して、Wifi接続のための設定を行います。例:

```ruby:qiita.rb
sudo vi /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

//以下を記載
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
    ssid="mySSID"
#    psk="12345678"
     psk=password-encrypted
     proto=WPA RSN       
     key_mgmt=WPA-PSK WPA-EAP
}

```
pskの暗号化は、以下のコマンドで得ることができます。例:
```ruby:qiita.rb
sudo wpa_passphrase mySSID 12345678
```
wpa_supplicantサービスを無効にします。wlan0用のwpa_supplicantを起動後少し待ってから開始するように後で設定します。

```ruby:qiita.rb
sudo systemctl stop wpa_supplicant
sudo systemctl disable wpa_supplicant
```
一旦、再起動してLANがstatic ipで接続されることを確認してください。
```ruby:qiita.rb
sudo reboot
```
## Wifi接続の設定
再起動後、sshで接続できたら、USB2.0 pinにWifiアダプタを接続します。
lsusbコマンドで正しく認識されていることを確認してください。

:::note warn
警告
認識されない、sshが切断されるなどの場合は、USBケーブル配線の間違いの可能性があります。
:::

```ruby:qiita.rb
sudo lsusb
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 0bda:b812 Realtek Semiconductor Corp. USB3.0 802.11ac 1200M Adapter
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

```

wpa_supplicantの起動
```ruby:qiita.rb
sudo wpa_supplicant -u -W -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
```
:::note warn
重要
ドライバエラーの場合、以下のようなエラーが表示されます。
wpa_supplicant.conf failed to add supported operating classes IE

-Dwextの代わりに、-Dnl80211 として試してください。
:::

怒らく、この時点で、PC側からping 192.168.3.144 (WiFi 側ipアドレス )への接続が確認できると思います。

wlan0用 wpa_supplicantサービスの編集

```ruby:qiita.rb
sudo vi /lib/systemd/system/wpa_supplicant@.service

// 以下の行を編集
ExecStart=/sbin/wpa_supplicant -u -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -W -Dwext -i%I

// nl80211の場合
ExecStart=/sbin/wpa_supplicant -u -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -W -Dnl80211 -i%I
```

実行と確認、正常に実行されることを確認します。
```ruby:qiita.rb
sudo systemctl start wpa_supplicant@wlan0
sudo systemctl status wpa_supplicant@wlan0

```

## wlan0用 wpa_supplicantの自動起動の設定
wifi-start.serviceの作成と登録

```ruby:qiita.rb
sudo vi /lib/systemd/system/wifi-start.service
//以下を記載
[Unit]
Description=Wireless Network Start

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/bash /opt/wifi-start/wifi-start.sh

[Install]
WantedBy=multi-user.target

```
自動機能の設定
```ruby:qiita.rb
sudo systemctl enable wifi-start.service
```

wifi-start.shの作成
```ruby:qiita.rb
sudo mkdir /opt
sudo mkdir /opt/wifi-start
sudo vi /opt/wifi-start/wifi-start.sh

//以下を記載
#!/bin/bash

sleep 20
systemctl start wpa_supplicant@wlan0
```

:::note info
これらの設定スクリプトを下記Githubにアップしました。
https://github.com/Taisuke-S/wifi-start-master
:::


以上で設定が完了です。再起動してすべての接続を確認してください。
LANのみで起動、WIFiのみで起動、WiFi/LANで起動、LANを切断...など各種組み合わせを確認してください。

```ruby:qiita.rb
sudo reboot
```

:::note info
あとがき
出来てしまえば、設定は単純ですが、ここに行きつくまで1カ月ほど試行錯誤しました。同じ問題に遭遇した方のお役に立てれば幸いです。
:::