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

NuttX on ESP32: wapi_smpを使ってみる (as of Mar/29/2021)

レポジトリにESP関係のコードがかなり入ったことは知っていたのですが、久しぶりにESP32用にNuttxをビルドしてみたところ、生成されるnuttx.binがEsp32に直接書き込めるbinaryになっていたり、wapi scan などが動作したり、wapi_smpやsta_softapのコンフィグ等多数追加されるなどかなり進展があったので、本稿を挙げてみることにしました。
レポジトリの取得や、基本的な環境設定は、前々回/前回と違いtools/esp32/Makefileがなくなっったようなので、以下の様にしてみました。
ツール類のインストールなど
# 念のため
sudo apt-get update

#nuttx用のツール類のインストール
sudo apt-get install kconfig-frontends

#esp32 idf用のツール類のインストール
sudo apt-get install git automake autoconf cmake build-essential git wget flex bison gperf make  \
    libncurses5-dev python3 python3-pip python3-setuptools python3-serial python3-click \
    python3-cryptography python3-future python3-pyparsing python3-pyelftools python3-libusb1 python3-pip \
    pkg-config unzip ninja-build ccache

#python3をデフォルトにしておく。
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
なおubuntu 18.04ではkconfig-frontendsのパッケージがないので、別途ソースを取得し、ビルド・インストールします。
kconfig-frontendsのビルド(ubuntu 18.04)

cd /usr/src
sudo mkdir kconfig-frontends
chown yousrid kconfig-frontends
git clone https://bitbucket.org/nuttx/tools
cd tools/kconfig-frontends
./configure --disable-shared --prefix=/usr/local
make 
sudo make install
nuttx ソースのクローン
sudo mkdir /usr/src/nuttx-esp32
sudo chown yourid /usr/src/nuttx-esp32
cd /usr/src/nuttx-esp32
git clone https://github.com/apache/incubator-nuttx nuttx
git clone https://github.com/apache/incubator-nuttx-apps apps
esp32ビルド環境の構築
mkdir -p ~/esp
cd ~/esp
git clone -b master --recursive https://github.com/espressif/esp-idf.git
# クローンには数分かかります。
cd esp-idf
./install.sh
# ダウンロードなど、数分かかります。
続いて ~/.bashrc を編集し、ログイン時にesp32のidf環境を読み込むようにしておきます。
. ${HOME}/esp/esp-idf/export.sh
ここで一旦ログアウトするか、. ${HOME}/esp/esp-idf/export.shとしてください。
また、前述の様にnuttx.binがEsp32に直接書き込めるbinaryになったので注意してください。
ビルドは以下の様にします。ビルドするとソースが一部ダウンロードされます。
cd /usr/src/nuttx-esp32/nuttx
tools/configure.sh esp32-devkitc/wapi_smp
ビルドログの最後の方ですが、以下の様になります。
tools/configure.sh esp32-devkitc/wapi_smp
make
#(中略)
CP: nuttx.hex
CP: nuttx.bin
MKIMAGE: ESP32 binary
esptool.py -c esp32 elf2image -fs 4MB -fm dio -ff 40m -o nuttx.bin nuttx
esptool.py v2.9-dev
Generated: nuttx.bin (ESP32 compatible)
前回使用した/usr/local/bin/flash-write-esp32 (sudo chmod +x)スクリプトは以下の様にしてみました。
#!/bin/bash
if [ $# -eq 0 ]; then
  echo usage: $0 /dev/ttyXXXX
  exit 1
else
if [ $# -eq 1 ]; then
  # check if give device is available
  if [ ! -e $1 ]; then
    echo $1 does not exist.
    exit 1
  else
    ser=$1
  fi
else
  echo usage: $0 /dev/ttyXXXX
  exit 1
fi
fi

if which esptool.py; then \

if [ ! -e ~/bootloader.bin ]; then
  echo Not Found ~/bootloader.bin does not exists. : Exiting...
  exit 1
fi
if [ ! -e ~/bootloader.bin ]; then
  echo Not found: ~/partitions.bin does not exists. : Exiting...
  exit 1
fi
if [ ! -e /usr/src/nuttx-esp32/nuttx/nuttx.bin ]; then
  echo Not found: /usr/src/nuttx-esp32/nuttx/nuttx.bin : Exiting...
  exit 1
fi
esptool.py --chip esp32 --port $ser --baud 921600 write_flash 0x1000 ~/bootloader.bin \
0x8000 ~/partitions.bin 0x10000 /usr/src/nuttx-esp32/nuttx/nuttx.bin
else
echo Not found: esptool.py : Exiting...
exit 1
fi
echo OK.
exit 0
なお、/dev/ttyUSBXは接続されるとmodeが0666になるようにしています。(もしくはuserをdialoutに追加)
$ cat /etc/udev/rules.d/99-usb-serial.rules
ACTION=="remove", GOTO="serial_end"
SUBSYSTEM!="tty", GOTO="serial_end"
KERNEL=="ttyUSB*", MODE="0666"
KERNEL=="ttyACM*", MODE="0666"
LABEL="serial_end"
コマンドは以下の様に実行します。
flash-write-esp32 /dev/ttyUSB0
書き込みがすんだら、minicom などで接続して動作確認してみます。
nsh> wapi scan wlan0
bssid / frequency / signal level / ssid
94:e9:ee:AA:BB:CC       2452    -95     XXXXYYYYZZZZ-2G
f8:b7:97:DD:EE:FF       2437    -84     aterm-AABBCC-g
90:2b:d2:AA:BB:CC       2452    -81     UUUUVVVVWWWW-2G
de:a2:66:DD:EE:FF       2437    -75     PS4-AAAABBBBCCCC
cc:1a:fa:AA:BB:CC       2462    -67     F660A-XXXX-G

nsh> wapi psk wlan0 MyPSK 2
nsh> wapi essid wlan0 F660A-XXXX-G 1
nsh> ifconfig
wlan0   Link encap:Ethernet HWaddr 30:ae:a4:aa:bb:cc at UP
        inet addr:10.0.0.2 DRaddr:10.0.0.1 Mask:255.255.255.0

(stat 省略)

nsh> renew wlan0
nsh> ifconfig
wlan0   Link encap:Ethernet HWaddr 30:ae:a4:aa:bb:cc at UP
        inet addr:192.168.2.210 DRaddr:192.168.2.1 Mask:255.255.255.0

(stat 省略)

nsh> ping -c4 1.1.1.1
PING 1.1.1.1 56 bytes of data
No response from 1.1.1.1: icmp_seq=0 time=1000 ms
56 bytes from 1.1.1.1: icmp_seq=1 time=20 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

nsh> ping -c4 www.google.com
PING 172.217.175.228 56 bytes of data
56 bytes from 172.217.175.228: icmp_seq=0 time=20 ms
56 bytes from 172.217.175.228: icmp_seq=1 time=10 ms
56 bytes from 172.217.175.228: icmp_seq=2 time=10 ms
56 bytes from 172.217.175.228: icmp_seq=3 time=10 ms
4 packets transmitted, 4 received, 0% packet loss, time 4040 ms

nsh> wapi show wlan0
wlan0 Configuration:
       IP: 192.168.2.210
  NetMask: 255.255.255.0
Frequency: 2462
     Flag: WAPI_FREQ_AUTO
  Channel: 11
Frequency: 2462
    ESSID: F660A-XXXX-G
     Flag: WAPI_ESSID_ON
     Mode: WAPI_MODE_MANAGED
       AP: cc:1a:fa:aa:bb:cc
  BitRate: 72
     Flag: WAPI_BITRATE_FIXED
  TxPower: 19
     Flag: WAPI_TXPOWER_DBM
    Sense: -59
いい感じになってきましたね。今回のwapi_smpのコンフィグにはtelnetdも入っているようなので外部から接続してみます。
$ telnet 192.168.2.210
Trying 192.168.2.210...
Connected to 192.168.2.210.
Escape character is '^]'.

NuttShell (NSH) NuttX-10.0.1
nsh> help
help usage:  help [-v] []

  .         cd        exec      ifdown    mh        rm        time
  [         cp        exit      ifup      mount     rmdir     true
  ?         cmp       false     kill      mv        set       uname
  arp       dirname   free      ls        mw        sleep     umount
  basename  dd        help      mb        nslookup  source    unset
  break     df        hexdump   mkdir     ps        test      usleep
  cat       echo      ifconfig  mkrd      pwd       telnetd   xd

Builtin Apps:
  getprime  iperf     ostest    renew     smp       wapi
  hello     nsh       ping      sh        taskset
nsh> ps
  PID CPU PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK   STACK   USED  FILLED COMMAND
    0   0   0 FIFO     Kthread N-- Assigned           00000000 002048 000912  44.5%  CPU0 IDLE
    1   1   0 FIFO     Kthread N-- Running            00000000 002048 000608  29.6%  CPU1 IDLE
    3 --- 100 RR       Kthread --- Waiting  Signal    00000000 002128 001216  57.1%  lpwork
    4 --- 100 RR       Task    --- Waiting  Semaphore 00000000 003152 002048  64.9%  init
    5 --- 223 RR       Kthread --- Waiting  Semaphore 00000000 002112 001040  49.2%  rt_timer
    6 --- 253 RR       Kthread --- Waiting  MQ empty  00000000 006736 001936  28.7%  wifi
    7 --- 100 RR       Task    --- Waiting  Semaphore 00000000 002096 000848  40.4%  Telnet daemon 0x3ffe3e20
   13 --- 100 RR       Task    --- Waiting  Signal    00000000 002080 001648  79.2%  ping -c 14400 www.google.com
   14 --- 100 RR       Kthread --- Waiting  Semaphore 00000000 001088 000848  77.9%  telnet_io
   26   0 100 RR       Task    --- Running            00000000 003136 002192  69.8%  Telnet session
nsh> free
                     total       used       free    largest
        Umem:       243168      68864     174304     110608
nsh>
参考までに、3/29現在のサンプルコンフィグは以下の通りになっています。
$ ls boards/xtensa/esp32/esp32-devkitc/configs
aes      leds     mmcsdspi  nsh      ostest  psram   smp       sta_softap  wapi      watchdog
buttons  mcp2515  netnsh    oneshot  pm      random  spiflash  timer       wapi_smp  watcher

$ ls boards/xtensa/esp32/esp32-ethernet-kit/configs
buttons  ethernet  nsh  oneshot  wapi

$ ls boards/xtensa/esp32/esp32-wrover-kit/configs
bmp180  buttons  gpio  leds  nsh  oneshot  wapi
aesやsta_softapなども入っているようです。 なお、長時間動作は今のところpingとtelnetだけですが、6時間ほど経過し動作しています。そのまま動作させて、追記で経過報告したいと思います。
追記:2021/03/30: PING動作中の端末にTelnetでログインし、なにがしかのコマンドを実行しようとしたところ、ハングしてしまいました。まだ不安定であり、長時間動作や実稼働はできないと考えた方がよさそうですが、以前よりはPINGの動作時間は長くなっているので、今後に期待したいところです。
今回は以上です。それでは。

コメント

このブログの人気の投稿

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-