arpコマンドを利用してJetsonのIPアドレスを検索する(Windows)

2020.09.14

カフェチームの山本です。

現在、機械学習のモデルを動かすため、NVIDIA製のJetson Xavier NXを利用しています。Jetsonをセットアップし、カフェのネットワークに接続して利用するのですが、設置した後にsshなどで接続するために、IPアドレスが必要です(特に、SDカードをコピーして別のJetsonで起動した際、IPアドレスを再度確認する必要がありますが、わざわざ外付けディスプレイや、キーボードなどを用意するのは面倒です)。

今回は、ARP(とping)を利用して、ネットワークに接続されているJetsonのIPアドレスを調べるスクリプトを作成しました。これによって、新しく接続したJetsonのIPアドレスを、外付けディスプレイなどがなくても検索できます。(後述のフィルタリングの部分を変えれば、JetsonではなくRaspberry Piなどを調べることも可能です)。

作成したスクリプト

PowerShellで書いたスクリプトは以下のとおりです。これをJetsonが接続しているのと同じネットワークで接続したWindowsマシンで実行すれば、結果を得られます。

# ネットワークの全アドレスにpingを実行し、
# ARPのテーブルに項目を追加する
for ($i=0; $i -lt 256; $i++){
    ping -w 1 -n 1 192.168.0.$i
}

echo "---- Jetson list -----------"

arp -a | findstr "70-66 48-b0"
# 70-66: wireless interface
# 48-b0: wired interface

Read-Host "press ENTER to close"

それぞれのコマンドの意図や意味について、説明します。

ネットワークの全IPアドレスに対してpingを実行

何もしない状態で、arpコマンドを実行すると、デバイスがネットワークには接続されていても、結果に表示されない場合があります。これを解消するため、for文を利用して、ネットワーク内の全てのIPアドレスに対してpingを実行します。これによって、実際に通信を行ったデバイスへのIPアドレスを、ARPが表示するようになります。

-wはタイムアウトまでの秒数、-nは実行する回数を指定するオプションです。(これを256回実行するため、およそ4分程度かかります。接続されているデバイスが多く、すぐにpingに応答する場合は、もう少し時間が短くてすみます。)

「192.168.0.$i」の部分は、お使いのネットワークに合わせて適宜変更してください。また、サブネットマスクが"255.255.255.0"でない場合は、for内の「256」や「192.168.0.$i」の部分も適宜変更する必要があります。

ARPテーブルの表示

arp -a を実行すると、以下のようにARPテーブル(IPアドレスとMACアドレスの対応表)が表示されます。

例)実行結果

インターネット アドレス 物理アドレス           種類
  192.168.0.1           b0-4e-26-9f-21-a0     動的
  192.168.0.148         2c-fd-a1-83-76-78     動的

MACアドレスを利用した候補の絞り込み(フィルタリング)

接続されているデバイスが多いと、ARPテーブルに表示される項目が多く、どれがJetsonだかわかりにくいめ、findstrで絞り込みました。

今回は、Jetsonの無線・有線インタフェースのどちらも表示するようにするため、findstrの引数を"70-66 48-b0"とすることで、ORの条件で検索しています。70-66が無線、48-b0が有線です。

実行結果

以下のように、ネットワークに接続したJetsonのIPアドレスが出力されました。(右の箇所文字化けしていますが、arp -aの結果では「動的」が出力されていました)

まとめ

pingとARPを利用して、ネットワークに接続されたJetson Xavier NXのIPアドレスを調べるスクリプトを作成しました。

参考にさせていただいたページ

同じLAN内に接続したRaspberry PiのIPアドレスを調べる - Qiita