スキップしてメイン コンテンツに移動

NuttX on ESP32: wapiを使ってみる (as of Jan/2021)

注意:2021/03/29現在、wapi scan などが動作するようになっています。また、ビルド時点で esp32に書き込みできるnuttx.binが生成されますので、ご注意ください。

ビルドしてみてわかったことですが、2021年1月時点では、esp32向けのwifiはまだ初期段階の様子でwapiコマンドもクライアントモードで一部動作するもののステーションモード・APモードでは動作確認ができませんでした。また、どこかでスリープが入るのか、長時間のwifi接続の確認ができていません。とはいえ、wifiがやっと動作するようになりつつあるので、今回はwapiの設定をしてみることにしました。
ところで、wapiとは何かというと、ローレベルのwifiルーチン群でifconfigやwlconfigに対してインターフェースを提供するCのルーチン群だということだそうですが、nuttxのesp32ではコマンドラインにも対応しているので、以下、早速設定していきたいと思います。
なお、レポジトリやビルド環境のセットアップは前回と同じく、masterをクローンしてビルドしていますので、参考にしてください。
まず初めにコンフィグを読み込みます。
cd /usr/src/nuttx-master/nuttx
tools/configure.sh esp32-devkitc/wapi
追記: 2021/03/29現在、renewコマンドはwapiコンフィグに既に含まれているので、以下不要です。
つづいて、設定を一部変更します。まず初めに、dhcpc renewコマンド(renew)をビルドするようにしておきます。
make menuconfig

# /を入力してサーチモードに入り、以下を検索してenalbeしてください。
CONFIG_SYSTEM_DHCPC_RENEW
基本的にwapiのコンフィグはこれだけです。つづいて前回( https://benedicam-te.blogspot.com/2021/01/nuttx-on-esp32-board-build-environment.html ) と同じように以下の様にします。
make -jX

# 2021/03/29追記: nuttx.binはbuild時点でesp32に書き込まれる状態で生成されますので、以下2行はコメント化しました。
# rm nuttx.bin
# esptool.py --chip esp32 elf2image --flash_mode dio --flash_size 4MB -o ./nuttx.bin nuttx

# ttyUSB0は環境に合わせて下さい。
sudo chmod 666 /dev/ttyUSB0
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 write_flash 0x1000 \
           ~/bootloader.bin 0x8000 ~/partitions.bin 0x10000 nuttx.bin
なお、筆者の場合、/usr/local/binにflash-write-esp32という名前で、上述をshellコマンドにして使っています。
$ flash-write-esp32

esptool.py v2.9-dev
esptool.py v2.9-dev
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, Coding Scheme None
Crystal is 40MHz
(中略)
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

$ cat /usr/local/bin/flash-write-esp32
#!/bin/sh
cd /usr/src/nuttx-master/nuttx
rm nuttx.bin
esptool.py --chip esp32 elf2image --flash_mode dio --flash_size 4MB -o ./nuttx.bin nuttx
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 write_flash 0x1000 ~/bootloader.bin \
0x8000 ~/partitions.bin 0x10000 nuttx.bin

バイナリーをesp32にロードさせたら、つづいて接続・設定します。
minicom -D /dev/ttyUSB0

Welcome to minicom 2.8

OPTIONS: I18n
Port /dev/ttyUSB0, 01:34:00

Press CTRL-A Z for help on special keys

# パスフレーズを先に入力
nsh> wapi psk wlan0 MyPassPhrase 2 
# 続いてルータなどのAPのESSIDを入力
nsh> wapi essid wlan0 MyESSID 1
I (381593) wifi:mode : sta (30:ae:ww:xx:yy:zz)
I (381594) wifi:enable tsf
I (381595) wifi:Set ps type: 0

I (381718) wifi:new:<11,0>, old:<1,0>, ap:<255,255>, sta:<11,0>, prof:1
I (381720) wifi:state: init -> auth (b0)
I (381724) wifi:state: auth -> assoc (0)
I (381729) wifi:state: assoc -> run (10)
I (381744) wifi:connected with MyESSID, aid = 1, channel 11, BW20, bssid = cc:1a:ww:xx:yy:zz
I (381744) wifi:security: WPA2-PSK, phy: bgn, rssi: -58
I (381823) wifi:pm start, type: 0

I (381824) wifi:AP's beacon interval = 102400 us, DTIM period = 1
# dhcpにてアドレスを取得
nsh> renew wlan0
# 動作確認
nsh> ping -c4 1.1.1.1
PING 1.1.1.1 56 bytes of data
W (518016) wifi:idx:0 (ifx:0, cc:1a:fa:c3:01:74), tid:0, ssn:0, winSize:64
No response from 1.1.1.1: icmp_seq=0 time=1000 ms
56 bytes from 1.1.1.1: icmp_seq=1 time=10 ms
56 bytes from 1.1.1.1: icmp_seq=2 time=10 ms
56 bytes from 1.1.1.1: icmp_seq=3 time=10 ms
4 packets transmitted, 3 received, 25% packet loss, time 4040 ms
なお、esp32-devkitc/wapiのデフォルトコンフィグレーションでは、設定をesp32のフラッシュに保存するようになっていてるのですが、コンフィグがコラプトするなどして読み込めず、esp32が正常に起動できない症状になることがありました。この場合、一旦、
CONFIG_ESP32_WIFI_SAVE_PARAM
を、disableにして、
CONFIG_DEV_ZERO
を、enableにしてビルドし、起動させ
dd if=/dev/zero of=/dev/esp32flash bs=1024 count 64
などとして、フラッシュをクリアさせて、再度ビルド・ロードさせると復帰できました。
まだ開発途上という感じですが、これからが楽しみですね。今回は以上です。それでは。

コメント

  1. Thanks for the update. I really appreciate the efforts you have made for this blog.
    All the best !!!

    JTAG

    返信削除

コメントを投稿

このブログの人気の投稿

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかもしれませ

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-