Contents

 ゲートウエイの構築

 

ここではRaspberryPi 4を使ったゲートウエイの構築について述べます。preMSMを使ったシステム構築に際して特化した必須情報だけを紹介します。RaspberryPi やNode-REDの基本的な情報は基本情報のページを参照してください。

本学から提供する評価キットのゲートウエイ(RaspberryPi 4)は以下の内容をすべて適用した状態です。

※コンソル―からコマンドラインを打ち込むためには、コピー&ペーストが便利です。しかし、コマンドラインの文字列をコピーできるようにそのままHPの原稿中に記載しますと、HPの自体のワードプレスそのものから警告が出ます。そのため、コマンドを図として表している部分があります。ご不便をおかけしますが、ご了承ください。


1.ハードウエアの追加

通信状態のモニターのために、LED表示機を作成し、取り付けます。写真のように、ユニバーサル基板を使って工作します。

電源OFFを安全に行うためにプッシュスイッチを設けています。

通常はネットワーク経由でゲートウエイにアクセスし、シャットダウンするのですが、このプッシュスイッチを押すことで同等の動作(シャットダウン)を行います。

電源の再投入は、電源を一旦OFFにして、再度ONにしてください。

配線図

 

ピンソケットを9ピンと3ピンにカットして、3×8穴にカットしたユニバーサル基板に左図のように一列ずらして取り付けます。小基板の装着位置が分かりやすいように9ピンの右側はRaspberryPiのポートの端に合わせています。

プッシュスイッチを別に用意した3x4穴にカットしたユニバーサル基板にはんだ付けし、先ほどの基板に取り付けます。そして、赤と緑の2つのLEDを極性に気を付けて抵抗と一緒に取り付けます。

LED 赤
LED 緑
SHUTDOWN ボタン

 

 

 


これで、Raspberry PiのGPIO17で赤LED,GPIO22で緑LEDを操作することができます。

また、GPIO8の状態を見ることでShutdownボタンを押されたかどうかを知ることができます。

今回のpreMSMゲートウェイでは、Raspberry PiにインストールしたNode-REDを使用してこれらのLEDやボタンを取り扱っています。
こちらの記事も参照してください。
 ・LEDの点滅
 ・プッシュボタン

・ハードウエアオプション
ゲートウエイ本体をPoE対応にするために、PoEハットを接続します。
PoEの詳細はリンク先を参照してください。

 

参考)電子回路の工作は
https://sip-sses.net/electronic_circuit_work/
を参考にしてください。

2.システム構成の変更

OS(Raspbian)をインストールした後、最新状態にアップデートし、以下の修正を行います。

参考)OS(Raspbian)をインストールは、
https://sip-sses.net/category/setup/raspberry/
を参考にしてください。

①ディスプレイ設定

通常運転の際には、本体のみで稼働しディスプレイ/キーボード/マウスは接続しません。基本はリモート接続です。ディスプレイを接続せずに電源を入れた場合に、VNC接続で正常に画面が表示されるように下記設定を行います。

/boot/config.txtを編集して

   #hdmi_force_hotplug=1

を有効(先頭の#を取る)にしてください。

 

②Node-REDの自動起動

電源ONと同時にNode-REDが自動で起動するように設定します。

以下のコマンドを実行し、電源ON時にNode-REDの自動起動を許可します。

    $sudo systemctl enable nodered.service

これで、次回の電源ON時から自動でNode-REDが起動します。

電源ON時の自動起動を止める場合は、以下のコマンドを実行してください。

    $sudo systemctl disable nodered.service

電源ON時に自動で起動されるファイルは、

    ~/.node-red/flow_$(hostname).json   通常(hostnameがraspberrypiの場合)は、~/.node-red/flow_raspberrypi.json

がデフォルトです。Node-REDのエディタを引数無しで実行すると作成されます。途中でhostnameを変えた場合などはそれに合わせて、名称の変更をしておかないと空のNode-REDのファイルを起動時に開くことになってしまい、正しく動作しないので注意が必要です。Node-REDの動作を変更する前にバックアップしておくべきファイルもこのファイルになります。

③VNC、SSHの許可

ゲートウエイの保守はネットワーク経由で行います。そのため、VNC, SSHのアクセス許可をします。アクセスを許可する方法はRasbianのGUIを使って行う方法と、ターミナル画面から行う方法の2つがあります。

1) GUIを使う方法

画面の左上にあるラズベリーのマークをクリックするとメニューが表示されます。そのメニューの中から下の方にある「設定」にカーソルを合わせます。すると右側に下位のメニューが表示されます。その中から「Raspberry Piの設定」を選んでクリックします。

 

 

 

すると、左のようなRaspberry Piの設定画面が表示されます。「インターフェース」のタブを選択します。SSHとVNCの有効ボタンを選択し、OKを押せば、設定は完了です。

 

 

 

 

2)ターミナル画面から行う方法

ターミナル画面から行う場合は、ターミナル画面を開いて、以下のコマンドを入力します。

    $ sudo raspi-config

すると、ターミナル画面に左のような設定画面が表示されます。

カーソルキーを使って「3 Interface Options」に赤色の帯を移動させます。Enterキーを押すと下位の画面に移動します。

下の<Select>,<Finish>に移動するには、Tabキーを押せば、赤い帯が下に移動します。終了するには、左右のカーソルキーで<Finish>に赤い帯を合わせて、Enterキーを押します。元のターミナル画面に戻ります。

 

 

下位の画面に、SSHとVNCのEnable/Disableのメニューがありますので、同様にカーソルキーを使って、そこに赤い帯を合わせて、Enterキーを押します。

下の<Select>,<Back>に移動するには、Tabキーを押せば、赤い帯が下に移動します。前の画面に戻るには、左右のカーソルキーで<Back>に赤い帯を合わせて、Enterキーを押します。上位の選択メニューに戻ります。

 

 

 

すると、「許可しますか?」という画面が表示されます。

左の絵は、SSHの許可の画面です。

「はい」が赤くなっていますので、このまま、Enterキーを押します。「許可しました」という画面に変わります。「いいえ」を選ぶには、カーソルキーで右に移動してください。赤い帯が「いいえ」に移動します。

「了解」に赤い帯があることを確認して、Enterキーを押せば設定完了です。最初の設定画面に戻りますので、同じようにVNCも許可してください。

 

④タイムサーバーの設定

ゲートウエイを時刻同期させるネットワーク上位のタイムサーバーを設定します。

■ ゲートウェイのNTPサーバの変更方法

ゲートウェイであるRaspberry Pi 4のNTPサーバを変更する方法を示します。あらかじめ、NTPサーバとして接続したいURLを調べておいてください。ここでは、日本の標準時を決定・維持している国立研究開発法人 情報通信研究機構(NICT)がNTPサービスとして公開しているアドレス(ntp.nict.jp)にアクセスします。

1. 設定ファイル(timesyncd.conf)の修正

timesyncd.confファイルに、NICTのアドレスを書き込みます。まず、元のファイルをコピーしておきます。保管するファイル名はそれぞれで変更してくださって問題ありません。timesyncd.confがある場所は、画面のコピーをご確認ください。

$ sudo cp tymesyncd.conf timesyncd.conf.bak

その後エディタを使ってファイルを書き換えます。

$ sudo nano timesyncd.conf

[Time]の後に、

NTP=ntp.nict.jp

と追記してください。複数ある場合は、スペースを区切り文字として、複数並べてください。一つ目に接続できなかった場合は、2つ目、2つ目に接続できなかった場合は、3つ目と順番に接続を試してくれます。接続できた段階で差の先には行きませんので、接続したい順番に並べるのが良いでしょう。

2.デーモンの再ロードとサービスの再起動

まず、NTPの有効化のコマンドを実行します。

$ sudo timedatectl set-ntp true

その後、デーモンの再ロードを行い、

$ sudo systemctl daemon-reload

最後にtimesyncdサービスの再起動を行い、設定完了です。

$ sudo systemctl restart systemd-timesyncd.service

3.サービスの確認と時刻が合っていることの確認

最後に、サービスが起動しているかの確認を行います。

$ sudo systemctl status systemd-timesyncd.service

Active : active (running)

と緑色になっていればサービスが走っています。また、最後の方に、日付と時間の後に、Synchronized to time serverとあればサーバと時間の同期が取れています。

次に、下記のコマンドを打って、時間を確認します。

$ date

参考ですが、情報通信研究機構の下記アドレスにアクセスすると、時刻が合っているかの確認結果を表示してくれます。

https://www.nict.go.jp/JST/JST5.html

 

3.ソフトの追加

ゲートウェイを構築するために必要なアプリケーションソフトウェアをいくつかインストールします。

① GTKTermのインストール

Raspberry Pi OSやUbuntuなどのLinux系で使用可能なシリアルポートターミナルソフトであるGTKTermをインストールします。センサモジュールのUSB接続やBluetooth接続の確認動作に使用します。GTKtermを使った接続確認は、「IoT側へのデータ転送」を参照ください。

    $ sudo apt install gtkterm

② hostapdのインストール

無線LANのアクセスポイント用のサービスを提供するソフトであるhostapdをインストールします。ゲートウェイの初期設定に使用するAPモード(Access Point Mode)を実現するのに使用します。「5.APモードとCLモードの移行」でhostapdを使ったAPモードの実現を説明します。

    $ sudo apt install hostapd

③ dnsmasqのインストール

小規模ネットワーク向けのDNS/DHCPサーバー機能を提供するソフトであるdnsmasqをインストールします。。ゲートウェイの初期設定に使用するAPモードでDHCPサーバーの機能を使用してIPアドレスを割り振ります。hasapdと合わせて、「5.APモードとCLモードの移行」でdnsmasqを使ったAPモードの実現を説明します。

    $ sudo apt install dnsmasq

④ bluemanのインストール

Bluetooth マネージャーツールである。Bluemanをインストールします。Bluemanを使うことで、センサーモジュールとのBluetooth接続をGUIで行うことができます。bluemanを使ったセンサモジュールの接続は、「IoT側へのデータ転送」を参照ください。

    $ sudo apt install blueman

 

4.センサモジュールとの接続

ゲートウェイとセンサモジュールとの接続に関して、ゲートウェイとしてのGUIを使用しない接続方法が必要になります。GUIを使用しない接続方法により、電源投入時の自動接続が可能になります。センサモジュールとの接続の方法は、「IoT側へのデータ転送」を参照ください。そちらで、GUIを使用しないコマンドレベルの接続に関しても説明しています。

 

5.APモードとCLモードの移行(OS bookwormより前)

ゲートウェイをAccess Point(AP)として使用するか、それともネットワークのClient(CL)として使用するかを切り替える方法を説明します。

① 概要

クイックレファレンスの「Step.3 システム全体の準備」の説明にあるように、ゲートウェイは、APモードとCLモードの2つのモードを持っています。

上の図がAPモードでの接続を表し、下の図がCLモードでの接続を表しています。

APモードでは、ゲートウェイがDHCPで接続してくるデバイスにIPアドレスを割り振り、ゲートウェイとデバイスでネットワークが完結します。

CLモードでは、ゲートウェイは、デバイスの一つとして動作し、他のデバイスと同じようにルーターのDHCP機能を使用してIPアドレスを割り振ってもらって、ネットワークは、ルーターにぶら下がっているデバイス間で構成されます。

通常、ゲートウェイは、CLモードで動作するように設定されています。そのため、「3.ソフト追加」では、アクセスポイントのサービスを提供するhostapdとDHCPサーバーの機能を提供するdnsmasqの2つのソフトをインストールします。

 

② CLモードからAPモードへの移行準備

CLモードからAPモードへの移行のフローを図に示します。APモードで新たに使用するhostapdとdnsmasqの設定を行います。

1) /ect/hostapd/hosapd.confの作成

ディレクトリ/ect/hostapd/にhostapd.confという名のファイルを新規に作成し、以下の記述を追加します。

interface=wlan0
driver=nl80211
hw_mode=g
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
channel=6
ssid=<SSID名>
wpa_passphrase=<パスワード>

ここで、最後の2行の<SSID>と<パスワード>は、APモードでゲートウェイにアクセスする際のID名とパスワードになりますので、各自で記述をお願いします。

2) /ect/dnsmasq.confのバックアップ

/ect/dnsmasq.confファイルを全面変更しますので、バックアップを取ります。

$ sudo mv /ect/dnsmasq.conf /ect/dnsmasq.conf.org
3) /ect/dnsmasq.confの新規作成と追記

新たに、/ect/dnmasq.confを作成し、以下の記述を追記します。

interface=wlan0
dhcp-range=192.168.50.100,192.168.50.255,255.255.255.0,24h

赤字の部分はAPモードでDHCPが割り当てるIPアドレスの範囲とサブネットマスク、最後が、有効時間になります。この例では、APモードで割り当てられるアドレスは、192.168.50.100~192.168.50.255の間になります。サブネットマスクは、255.255.255.0で、有効時間は24Hです。

APモード時に割り当てたいIPアドレス等を設定してください。

4) hostapdの初回のみの設定

初回のみhostapdに関する以下の2つのコマンドを実行してください。


$ sudo systemctl unmask hostapd 
$ sudo systemctl disable hostapd

1つ目のコマンドは、hostapdを起動可能にするためにunmaskするというコマンドです。maskされていると手動でも自動でも起動できません。2つ目のコマンドは、電源投入時の自動起動を禁止するコマンドです。

本ゲートウェイでは、いったんCLモードで立ち上げて、Node-REDで前の電源立ち上げ時の状態を再現するようにしています。すなわち、直前の電源OFF時がCLモードであれば、そのままCLモードに、APモードで電源OFFされていたとしたら、CLモードで立ち上がった後に、APモードに切り替えています。

以上で、CLモードからAPモードへの移行の準備が出来ました。

③ APモードからCLモードへの移行準備

次にAPモードからCLモードへの移行のフローを図に示します。APモードからCLモードに戻る際に、元のCLモードのネットワーク環境に戻るのであれば、次から説明する準備は不要です。④ CLモードからAPモードへの移行処理、⑤ APモードからCLモードへの移行処理に飛んでください。

ここでは、APモードからCLモードに戻る際に、元の環境と異なるネットワーク環境に接続するために必要な内容になります。

1) CLモードでのWiFiのSSIDとパスワードの設定

2つの方法があります。いずれの方法も、/ect/wpa_supplicant/wpa_supplicant.confのファイルの記載を変更します。1つ目の方法は、パスワードが暗号化されますのでお勧めです。2つ目の方法は、エディタでSSIDとパスワードを記載する方法です。

a) コマンドを使用する方法

コマンドラインで以下のコマンドを入力します。

$ sudo sh -c 'wpa_passphrase {SSID} {PASSWORD} >> /ect/wpa_supplicant/wpa_supplicant.conf’

wpa_passphraseというコマンドが、wpa_supplicand.confに記載するフォーマットに変換してくれますので、その結果をwpa_supplicand.confにリダイレクトします。

結果は、以下のような記載が追加されます。

  country=JP
  ctrl_interface=DIR=/var/run/wpa_supplicant   GROUP=netdev
  update_config=1
  network={
          ssid=“SSID"
          #psk=“PASSWORD"
          psk=...(encrypted {PASSWORD})
  }

SSIDとPASSWORDは、各自の環境のものをご使用ください。

b) エディタでファイルを修正する方法

/ect/wpa_supplicant/wpa_supplicant.confをエディタで開き、以下のように記載する方法です。

  country=JP
  ctrl_interface=DIR=/var/run/wpa_supplicant   GROUP=netdev
  update_config=1
  network={
          ssid=“SSID"
          psk=“PASSWORD"
          key_mgmt=WPA-PSK
  }

赤字の部分を追加してください。SSIDとPASSWORDは、各自の環境のものをご使用ください。

2) CLモードでのWiFiのIPアドレスとルーターアドレスの設定

CLモードに戻った際にDHCPによるIPアドレスの割り当てを使用せずに、ネットワーク環境でIPアドレスとルーターのアドレスを指定する場合は、以下の記述の変更/追加をお願いします(もともと指定していた場合は変更で、指定していなくて今回新規に追加する場合は追加です)。

/ect/dhcpcd.confをエディタで開き記載する。

  interface wlan0
  static ip_address=192.168.0.157/24
  static routers=192.168.0.1

赤字のアドレスは例です。各自の環境に合わせて変更してください。

以上で、APモードからCLモードに戻る際の準備が終わりました。クイックリファレンスで紹介しているように、本ゲートウェイでは、CLモードのSSIDやパスワード、IPアドレスやルーターアドレスを入力でき、その記述に合わせてCLモードでの設定を変えています。上記の内容をNode-REDやシェルスクリプトを使ってファイルを変更したうえでCLモードに戻ることで実現しています。

④ CLモードからAPモードへの移行処理

まず、CLモードからAPモードへの移行のための処理を説明します。基本的には、左の図の順番にコマンドを実行していきます。

$ sudo systemctl stop wpa_supplicant
$ sudo systemctl stop dhcpcd
$ sudo ip addr add 192.168.50.1/24 dev wlan0
$ sudo ip route add default via 192.168.50.1
$ sudo systemctl start dnsmasq
$ sudo systemctl start hostapd

1行目と2行目が、それぞれ、wpa_supplicantの停止、dhcpcdの停止を実施しています。3行目と4行目が、上記フローの③APモードでの固定IPを設定に相当します。赤字のアドレスは、各自の環境の値に変更してください。5行目と6行目で、dnsmasqとhosapdを起動しています。

⑤ APモードからCLモードへの移行処理

次に、APモードからCLモードへの移行のための処理を説明します。同様に順番にコマンドを実行していきます。

$ sudo systemctl stop hostapd
$ sudo systemctl stop dnsmasq
$ sudo ip addr flush dev wlan0
$ sudo systemctl start wpa_supplicant
$ sudo systemctl start dhcpcd

CLモードヵらAPモードへの移行と同様に、1行目と2行目が、hostapdとdnsmasqを停止するコマンドです。3行目が、APモードに移行する際に3行目と4行目のコマンドで設定したIPアドレスを消却するためのコマンドです。そのあと、4行目と5行目でそれぞれ、wpa_supplicantとdhcpcdを起動しています。この際に、準備で記載したwpa_supplicant.confとdhcpcd.confの内容が使用されます。

6.mDNS(multicast Domain Name System)の設定

クイックリファレンスで紹介したように、APモードからCLモードに戻った際に、DHCPでIPアドレスを自動的に割り当てられた場合、割り当てられたIPアドレスが簡単にはわからないという課題があります。それを解決するために、hostnameを利用したDNSサービスを使用します。固定IPのネットワークでは不要です。直接IPアドレスを指定してください。

ここまでのゲートウェイの設定をしてきたRaspberry Pi 4であれば、DNSサーバーは起動しています。CLモードで以下のコマンドを打って確認してください。サービスが走っていることを確認できます。

$ systemctl status avahi-daemon.service

以下の絵が実行結果です。緑色のところが、active(running)となっており走っていることがわかります。

ただし、このままでは、DNS機能は動作しません。次に記す処理が必要です。

① /ect/avahi/services/ssh.serviceの新規作成

フォルダ/ect/avahi/services/の下に何もファイルが無いです。そのため、サービスは走っているのですが、何に対してDNSサービスを実施していいのかが不明です。

/ect/avahi/services/ssh.serviceを新規に作成し、以下の内容を記載してください。

② hostnameの変更

DNSサービスでの名称は、$(hostname).localとなります。通常、Raspberry Piのhostnameはraspberrypiですので、hostnameを変更せずにおくと、DNSは、raspberrypi.localの名称をIPアドレスに割り付けます。別の名前にする際には、hostnameを変更する必要があります。

hostnameを変更しない場合は、「③ DNSサービスのリスタート」に飛んでください。

hostnameを変更するためには、2つのファイルを修正する必要があります。

1) /ect/hostnameの修正

エディタを使って、/ect/hostnameを変更します。変更前は、raspberrypiとのみ記載されています。

2) /ect/hostsに追加

エディタを使って、/ect/hostsに追加します。元は、

172.0.1.1             raspberrypi

が記載されていますが、そこに以下を追加しましす。

172.0.1.1             NewHostName

赤字の部分は、変更したいhostnameを記載してください。

このファイルには、ほかにも、127.0.0.1   localhostとかいう記述もあり、localhostが127.0.0.1に振られていることが分かります。

③ DNSサービスのリスタート

以下のコマンドを打って、DNSサービスを再スタートさせます。

$ sudo /ect/init.d/avahi-daemon restart

以上で、mDNSの設定が終了です。

Node-REDにアクセスする際に http://$(hostname).local:1880/でアクセスできるようになりました。

 

7.Node-REDの標準フローのインストール

本HPのダウンロードのページから、フローをダウンロードしインストールします。(ご自身でフローを作成される場合は必要ありません。)
ダウンロードした.zipファイルを解凍して、.jsonファイルを用意してください。

・完全に初期状態に戻す場合は、一旦すべてのフローを削除してから読み込んでください。

 

 

右上の3本線メニューから「読み込み」を選択します。

 

 

 

フローの読み込み画面が開きますので、「読み込むファイルを選択」をクリックします。

 

 

 

ファイル選択画面が開きますので、先ほどダウンロードしたフロー(.jsonファイル)を選んで「開く」ボタンをクリックします。

 

 

 

読み込もうとしているフローが表示された状態です。
この状態で「読み込み」ボタンをクリックします。

 

 

以前のフローが残っている状態から読み込むと、「読み込もうとしているノードのいくつかは、既にワークスペース内に存在しています」というメッセージが表示されることがあります。

この場合は、一旦「コピーを読み込み」として読み込みを完了させ、フロー編集画面で希望の処理に編集してください。

 

8.Node-REDのパスワード設定

Node-REDのフローの画面にアクセスする際には、http://<IP ADD>:1880と入力します。この際、初期設定ではパスワード管理されていません。以下の手順でパスワード制限を行います。

1. 概要

ユーザー名とパスワードは、~/.node-red/settings.jsに記載することで設定ができる。

パスワードは、安全性を高めるためにbcryptアルゴリズムを使用してハッシュ化されているので、あらかじめ、別コマンドでハッシュ化しておく必要があります。

2. パスワードのハッシュ化

パスワードのハッシュ化は、以下のコマンドで行います。

コマンドを入力すると、Passwordの入力を求められるので、入力してリターンキーを押すと、ハッシュ化されたパスワードが画面に返ってきます。このパスワードをコピーして、setting.jsファイルにペーストしてください。

$node-red admin hash-pw [RET]
Password:XXXXXX[RET]
$2a$08$9tHg3MHtmRDRiBlCOL.EiOR0qB3vNjP1eFF2VYouDWrrdOzjwrHdy

3. settings.jsファイルの修正

エディタを使い、~/.node-red/settings.jsファイルを開きます。

ファイルの中ほどに、以下のようなユーザー名とパスワードに関する記述がありますので、行頭のコメントアウトの記述”//”を削除するとともに、ユーザー名と上記で出力させたハッシュ化されたパスワードに記載を変更して、ファイルをセーブしてください。セーブ後、Node-REDを起動することで、ユーザー名とパスワードが有効になります。

<変更前>

//adminAuth: {
// type: "credentials",
// users: [{
// username: "admin",
// password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
// permissions: "*"
// }]
//},

<変更後>

adminAuth: {
type: "credentials",
users: [{
username: "passwd",
password: "$2a$08$9tHg3MHtmRDRiBlCOL.EiOR0qB3vNjP1eFF2VYouDWrrdOzjwrHdy",
permissions: "*"
}]
},