ラベル nmcli の投稿を表示しています。 すべての投稿を表示
ラベル nmcli の投稿を表示しています。 すべての投稿を表示

2019-04-02

WiFi APによる中継と、複数Raspberry Piと複数APの登録・接続

 屋内位置情報システム(IPS)を構築する際には、ビーコン信号を Raspberry Pi (以下、RP と呼ぶことがあります)などのワイヤレスの受信機で受信し、さらにそこから WiFi を介してサーバに送るといった状況が発生します。
受信機と有線LAN間を結ぶのモノが WiFiアクセスポイント(以下、AP と呼ぶことがあります)です。
 APは通常、LANケーブルにより有線ハブに接続されていますが、LANケーブルの引き回しが困難なこともあります。その場合、親機のAPのみをLANケーブルで有線ハブに接続し、子機APは親機APへの中継器として使用します。

 今回、中国TP-LINK社の TL-WR802N(写真)を使用し、どのように中継器を構成ができるのかテストしてみました。ちなみに、この製品の電力要件は 5V/1A で、Micro USBケーブルを介してモバイルバッテリと接続して稼働するため、LANケーブルの敷設と電源供給が難しい屋外でのテストで威力を発揮します。
 あるAP と RP 等のデバイスの間隔が離れすぎてしまいAPがデバイスのWiFi信号を十分な強度で拾えないような場合、他のAPを中継器として使用します。
屋外でのIPSテスト。Raspberry Pi (RP) と TL-WR802N、共にモバイルバッテリだけで1日は十分稼働する。

 また、本稿の後半では、多数の RPと AP を効率的に登録及び切り替えする方法について考えます。

WiFi の中継タイプ

 TL-WR802N は以下のいずれの中継タイプであっても、子機AP2~4を経由して親機AP1に接続することができました。ただ、設定時にはブラウザから接続できなくなったりすることも多く、モードを変更するとそれまで行った設定が飛んだりで、癖がある製品であるように思いました。
 尚、上の写真のように障害物の無い環境では、AP間は70m程度の距離があっても電波を送受信できました。未検証ですが、下表の直列型にすれば70m×5で350mはWiFi通信できるものと推定されます。

WiFi中継タイプ イメージ
直列型
スター型
折衷型
注:通常、AP1 は有線ハブに接続され、RPを社内LANに接続する。

NetworkManager の nmcli による WiFi接続と管理

 小社では Raspberry Pi のネットワークインタフェース設定には NetworkManager を採用したため、ここでは NetworkManager による WiFiアクセスポイント(AP)接続の登録方法と切替方法についてご紹介します。
 ※屋内位置情報システム(IPS)で RP などの受信機と APを多数運用する場合、一括管理できる仕組みも併せて考慮する必要が出てきます。

Wifi 接続の登録方法

 NetworkManager を使って WiFi AP (SSID) を登録する方法は以下の 3 とおりがあります。 尚、以下、AP と SSID はほぼ同義に使用されていることがあります。

  1. GNOME を使う(GUI)

     GNOME が利用できる環境では、GUI によりAP(SSID)を設定できます。NetworkManager インストール時に GNOME をインストールしなかった場合は、以下のコマンドを実行することにより、GNOME をインストールします。
    sudo apt-get install network-manager-gnome
    コマンド実行後に Raspberry Pi を再起動すると、画面上部に以下のアイコンが表示されるようになります。

     新規に接続を作成する場合は、上記の NetworkManager アイコンをクリックします。現在の接続状態と、利用可能な AP の一覧が表示されますので、その中から接続したい AP を選択します。

     たとえば、tpctp1 に接続したい場合は、以下のように選択します。
     利用可能一覧に AP が表示されていない場合は、その他のネットワークを選択すると、さらに接続可能な AP が表示されますので、そのなかから選んで接続します。


     この要領で接続をすると、多くの場合は AP の DHCP 機能により IP が割り振られることになります。
     固定 IP を振り直したい場合は、NetworkManager アイコンを右クリックし、「接続を編集する...」メニュー項目を選ぶと、登録済の接続情報の一覧が表示されますので、そのなかから変更対象の接続を編集します。


  2. nmcli コマンドを使う

     GNOME を使用しない場合は、nmcli コマンドで接続管理ができます。
     基本的には以下のシナリオで作業を行います。

    1. 既存の AP に接続要求

      以下のコマンドを実行することにより、任意の AP に接続
      nmcli d wifi connect SSID password PASSWORD
      (赤字部分が指定したい SSID とパスワード)
      上記の指定情報をもとに接続が試行されます。接続に成功すると接続設定ファイルが /etc/NetworkManager/system-connections/ ディレクトリ配下に作成されます。
    2. 上記で作成された接続ファイルに固定 IP アドレス、および DNS サーバの IP アドレスを設定

      以下のコマンドを実行することにより、1. で作成された接続設定ファイルに固定 IP アドレスと DNS サーバの固定 IP アドレスが登録されます。
      nmcli connection mod SSID 802-11-wireless-security.key-mgmt wpa-psk 802-11-wireless-security.psk PASSWORD ipv4.method manual ipv4.addresses "192.168.3.10/24" ipv4.gateway "192.168.3.1" ipv4.dns "192.168.3.100"
      赤字部分が編集対象となる SSID とそのパスワード )
      ここでは、固定IP アドレスとして 192.168.3.10、デフォルトゲートウェイが 192.168.3.1、DNS サーバが 192.168.3.100 であることを想定しています。
    3. 再接続による変更内容の反映

      接続設定ファイルを書き換えが終わったら、一度接続を停止し、再度接続することにより、変更内容を反映させます。
      nmcli connection down SSID
      nmcli connection up SSID

  3. シェルスクリプトで一括登録する

    使用する Raspberri Pi(RP) 端末と WiFiアクセスポイント(AP) の台数が少数であれば、GNOME で簡単に設定を行えますが、その数が数十台になると GNOME で一台一台、設定および管理するのは時間的、労力的に厳しくなります。

     そこで前述の nmcli コマンドにより、自動接続および接続ファイル生成を繰り返し、複数の Raspberry Pi に複数の AP を登録するシェルスクリプトを作成して実行するようにします。

    以下のシナリオで作業を行います。

    1. 事前に登録対象の SSID と パスワードを格納した設定用のファイルを準備

      ここでは、タブ区切りで SSID およびパスワードの組み合わせを記述したファイル(ssid.txt)を用意します。
      たとえば、このように記述します。
      ssid.txt
      tpctp1    111111
      tpctp2    222222
      tpctp3    333333
      

    2. 一括 SSID 登録シェルスクリプト (tpccon.sh) を準備

      事前に、引数として渡す Raspberry Pi の固定 IP アドレス、デフォルトゲートウェイ、DNS サーバの IP アドレスを記述しておきます。
      以下の 4~6 行目の ip、gateway、dns 変数の内容を任意のものに書き換えます。

      tpccon.sh
      #!/bin/sh
      
      ip="192.168.3.10"
      gateway="192.168.3.1"
      dns="192.168.3.100"
      
      sh delcon.sh
      sh _subcon.sh $ip $gateway $dns

    3. 既存の接続ファイルを削除するためのシェルスクリプト(delcon.sh)

      すでに登録済の接続ファイルが存在する場合、接続コマンドを実行する度に、「MySSID 1」、「MySSID 2」、「MySSID 3」のような同じ SSID に番号が付番されたファイルが生成されてしまいます。

      このため、後々の接続管理を容易にするために、事前に既存の接続ファイルを削除するためのシェルスクリプト(delcon.sh)を用意します。
      前述の ssid.txt ファイルに登録されている SSID を順に読み込み、その名前がついている接続を削除します。

      delcon.sh
      #!/bin/sh
      
      # delete access point files
      
      DATA=`cat ssid.txt`
      
      while read line
      do
          ssid=${line% *}
          sudo nmcli connection delete $ssid
          sudo nmcli connection delete "$ssid 1"
          sudo nmcli connection delete "$ssid 2"
          sudo nmcli connection delete "$ssid 3"
          sudo nmcli connection delete "$ssid 4"
          sudo nmcli connection delete "$ssid 5"
      done << FILE
      $DATA
      FILE

      このサンプルスクリプトでは、1~5 までの冗長な接続ファイルが存在する可能性を考慮して固定で 5 まで強制的に削除するようにしています。存在している接続ファイルの一覧を取得して、それらを全て削除するようにすると良いのですが、今回は手抜きをしました。

    4. SSID を自動登録するためのシェルスクリプト(_subcon.sh)

      1. の ssid.txt に指定されている情報を順に読み出し、SSID を登録するシェルスクリプト(_subcon.sh)を作成します。
      このシェルスクリプトは呼び出し元の tpccon.sh の引数を取るため、サブスクリプトとして動作します。このため、便宜的に先頭にアンダスコアを入れてあります。

      _subcon.sh
      
      #!/bin/sh
      
      ip=$1
      gateway=$2
      dns=$3
      
      # version
      ver=`sudo NetworkManager -V | cut -c 1`
      
      # create available access point files
      sudo nmcli d wifi rescan
      
      DATA=`cat ssid.txt`
      
      while read line
      do
          ssid=${line% *}
          pwd=${line#* }
          sudo nmcli d wifi connect $ssid password $pwd
      
      
          if [ $ver -lt 1 ]; then
              sudo nmcli connection mod $ssid 802-11-wireless-security.key-mgmt wpa-psk 802-11-wireless-security.psk $pwd ipv4.method manual ipv4.addresses "$ip/24 $gateway" ipv4.dns "$dns"
          else
              sudo nmcli connection mod $ssid 802-11-wireless-security.key-mgmt wpa-psk 802-11-wireless-security.psk $pwd ipv4.method manual ipv4.addresses "$ip/24" ipv4.gateway "$gateway" ipv4.dns "$dns"
      
          fi
      
          #reload and activate the connection
          sudo nmcli connection down id $ssid
          sudo nmcli connection up id $ssid
      
      done << FILE
      $DATA
      FILE
      

      これで一括 SSID 登録シェルスクリプトの準備が整いました。

    5. 一括 SSID 登録シェルスクリプト (tpccon.sh) を実行

      tpccon.sh を実行することにより、既存接続の削除→接続登録の順で全自動で処理が実行されます。
      sh tpccon.sh
      上記を実行すると、1. で定義した ssid.txt の一番最後に登録されている AP(SSID)に接続されます。
    6. TeraTermによる一括登録
      端末一台を設定するのであれば、ターミナル上で上記のコマンドを実行します。複数台の端末に対し同時に AP 登録したい場合は、TeraTerm などの一括コマンド発行ができるツールを使用して tpccon.sh を実行します。
    7. 登録状況の確認

      登録済みの接続と接続状態を知るには以下のコマンドを実行します。
      nmcli d wifi list

    8. なお、接続ファイルの実体は、/etc/NetworkManager/system-conntections ディレクトリ配下にあります。 以下のように、/etc/NetworkManager/system-conntections に tpctp1、tpctp2、tpctp3 の接続ファイルが正しく作成されていることが確認できます。

      【重要】
      使用する OS のバージョンにより、インストールされる NetworkManager のバージョンが異なることがあり、またこのバージョンの相違によって指定方法も異なるという問題があります。
      このため、一様のコマンド実行では、端末によっては設定ファイルの書き換えができないというトラブルが発生する可能性があります。

      現時点で当方が把握している情報としては以下のものがあります。

      バージョン 0.9.10.0 --- ipv4.addresses オプションに IP アドレスとゲートウェイアドレスをセットにして記述する必要あり
      バージョン 1.6.2.0 --- ipv4.addresses オプションに IP アドレス、 ipv4.gateway オプションにデフォルトゲートウェイアドレスを個別に指定する必要あり

      このため、上記のスクリプトでは、バージョンの番号別にオプション設定が切り替わるように記述してありますので、現時点では NetworkManager のバージョンが混在する環境でも動作するようになっています(今後さらにコマンド仕様が変更される可能性があります)。

Raspberry Pi の接続 

起動時の接続

 電源を投入すると、前回のシャットダウンまで接続されていた AP に接続されます。
このとき、そのAP への接続に失敗すると、NetworkManager によって他の登録済みの AP に自動接続されます。

接続先の変更

 Raspberry Pi 端末の接続先を変更したい場合は nmcli connection up コマンドを使用します。
nmcli connection up tpctp1

 複数の Raspberry Pi の AP(SSID) を一括して変更するには、TeraTerm などの接続ツールを使って複数の Raspberry Pi にログインし、以下のブロードキャスト(一括)コマンドを発行すると良いと思います。
 以下は、接続済みの端末に向けて tpctp2 という接続名の AP に一括接続切替をするためのコマンドです。
sudo nmcli connection up tpctp2
 ※ TeraTerm などのツールを使って接続切替要求を発行する場合は、sudo を付ける必要があります。TeraTerm では接続済みの端末のうちいくつかを選択(限定)して、ブロードキャストコマンドを実行することもできます。

検討課題

 iPhone では WiFi AP 毎に『自動接続』をOFFできますが、これに相当する nmcli コマンドが見当たりません。テストを行っている場合等、特定の AP のみに接続を限定したいことがあると思うのですが...。connection down というコマンドがありますが、これはAP への接続を停するだけで、iPhoneで言うところの「『自動接続』をOFF」にはならないため、電波状況によっては接続が復活してきてしまう模様です。

(亀)