IoTで使うPython入門Step2-MQTT (1) Brokerをたてる

 工場や実験室で製造装置や実験装置が正常に働いているかどうかなどは、例えば温度を測定しているとあるていど判断できます。そのためには、24時間365日その温度を監視しなければなりません。今では、クラウド・サービスを利用するのが得策です。もちろん費用はかかりますが、信頼性は高いです。

 しかし、最初からクラウドを利用するというのは敷居が高いです。このStep2シリーズでは、IoTの通信プロトコルでいちばん利用の多いMQTTを利用します。温度のデータは数バイトです。この少ない容量のデータを送るのに特化しています。TCP/IP上で動作するので、汎用性も高いです。

MQTT Brokerを用意

 MQTTの仕組みは簡単です。センサ・データを送信(発行)するのがPublisher、データを受け取って、別のクライアントからの要求に従ってデータを送信するのがBrokerです。複数のPublisherがBrokerを取り巻いているイメージです。Brokerからデータを受け取るのがSubscriverです。通常Brokerはクラウド・サービスが実施していますが、ここではラズパイを使います。

 ラズパイのOSはマルチタスク・マルチユーザの機能をもっていますから、

  • 今利用しているラズパイにBrokerをインストールして動かしている状態で
  • 同じラズパイで温度を収集してPublisherの立場でデータを自分自身で動いているBrokerにMQTTでメッセージを送り
  • 同じラズパイで別途Subscriverを動かして、MQTTで受信した温度が設定以上だったらアラートを出す

ということができます。が、たぶん、混乱します。
 そこで、別途ラズパイでBrokerを作ります。一番安価なのは、ラズパイZeroです。最初は5ドルでしたが、入手が困難で、現在は3モデル目のRaspberry Pi Zero WHの入手性がよいです。秋月電子通商では2,160円(税込)、スイッチサイエンスでは1,814  (税込)、ピンヘッダのはんだ付けしていないRaspberry Pi Zero Wは1,296 円 (税込)です。WとWHのモデルは、Wi-Fiが使えます。
 もちろん、古いモデルで、だれも使っていないラズパイが入手できればそれでもかまいません。

必要なソフトウェア

 mosquittoが必要です。普通にsudo apt-get install mosquittoでインストールできます。ここでは、MQTT Brokerが動くラズパイ上でデータの可視化をします。そうしないと、MQTT通信のデータの流れが見えないからです。

 可視化とmosquittoのために、Node-REDを使います。2018年春までは、Node-REDは、ラズパイのプログラム・メニューに存在してて、クリックするだけで動き、同時にmosquittoも動き出しました。
 執筆時点のラズパイの最新版は2018-10-09です。その前の2018-06-27からNode-REDがOSのインストール時には入らなくなりました。そして、Node-REDをインストールしてもそれまで同時に動いていたmosquittoはインストールされていません。
 とはいえ、簡単にインストールできます。準備完了までは2ステップです。

Step1

 Raspberry Pi Zero Wを用意しました。ピンヘッダをはんだ付けしていますが、しなくても今回の用途には支障はありません。2018-10-09版のOSをインストールしてマシンを立ち上げます。最初は、キーボード、マウス、HDMIディスプレイをつなぐと作業が楽です(コラム参照)。mosquittoが動くようになれば、必要なのは電源だけです。

 OSがインストールできたら、ターミナルで最初に次の二つを実行します。

sudo apt-get update
sudo apt-get upgrade -y

 メイン・メニューのPreferencesから、Recommended Softwareを選びます。コラムのように、OSがインストールされた直後にセットアップ・ウィザードが動き、japanを選び順調にいけば、日本語環境がインストールされますが、無視したので、英語のメッセージが表示されています。

 Node-REDにチェックし、OKを押すと、インストールが始まります。

 数分かかります。

 終了したら、メインメニューのProgrammingを選ぶとNode-REDが登録されています。

 Webブラウザを立ち上げて、node-red raspberry updateと検索欄に入力して出てくるNode-RED日本ユーザー会のページに書かれているupdate-nodejs-and-nodered をターミナルに貼り付けてリターンで動かします。

 20分ほどで最新版になります。このアップデートをしておかないと、Node-REDの一部のメニューが出てこず、利用上不便です。

 メイン・メニューの-ProgrammingのNode-REDを選んで起動します。動き始めます。

Step2

 MQTTサーバのmosquittoをインストールします。

sudo apt-get install mosquitto

 起動は、mosquittoですが、インストールした時点で起動しています。systemctlによってサービスに登録されているので、リブートしても自動で起動します。動作の確認コマンドです。

service mosquitto status

Step3

 電源だけをつないだRaspberry Pi Zero Wで、Node-REDを起動する方法を実行します。上記の起動画面の中に書かれています。 電源が入ったときに自動でスタートします。一度実行すればOKです。

sudo systemctl enable nodered.service

 トラブルがあって、mosquittoが止まったりしたときは、sshでログインして再起動を試すことができます(コラム参照)。
 24時間365日動かすためには、

  • トラブルが起こったときの解析のためにログを取る
  • 止まっていたら再起動をかける設定もしくはスクリプトを用意する

などが必要ですが、省略します。

コラム sshの起動

 もしリモートでログインするときは、セキュアなsshを使います。ラズパイのメイン・メニューからPreferences-Raspberry pi Configurationを開きます。interfaceのタブにあるSSHのEnabledをチェックしてOKを押します。押した時点で有効になります。

 PCからTeratermを起動し、ラズパイのIPアドレスを入れてsshでアクセスします。Node-REDの終了はnode-red-stop、開始はnode-red-startです。したがって、sshでつながったら、

node-red-start
mosquitto

で必要なプログラムが動き始めます。動いているプロセスは、ps -axで知ることができます。

 リブート後もsshは有効ですが、パスワードがデフォルトだというアラート画面が出ます。これは、世界中にみんながデフォルトのパスワードを知っているので、sshを使っている意味がないので、パスワードを変更してねという意味です。

コラム Raspberry Pi Zero Wのセットアップ

 Raspberry Pi ZeroにはマイクロUSBコネクタが二つあり、一つは信号用、一つは電源用です。電源の電流はそれほど多くなく、PCのUSBの500mAでも足ります。が、ちょっと心配なので1Aぐらいの電源を使います。

 OSのインストールをするには、ダウンロードして書き込みのすんだマイクロSDメモリ、OTGのUSBハブ、ミニHDMIケーブル(もしくは変換コネクタ)、キーボード、マウスを用意します。

 OSが立ち上がったらセットアップが始まりますが、キャンセルします。キャンセルすると、ユーザ名はpi、パスワードはraspberryです。

 画面右上にネットワークの矢印2本に×がついています。マウスを載せるとアクセス・ポイントが表示されるので、いずれかを選択します。

 パスフレーズを聞いてくるので、入力します。

 数秒後、矢印は無線のアイコンに変わるので、アイコンの上にマウスをもっていきます。

 DHCPサーバからIPアドレスが振られています。これを固定アドレスに変更します。無線のアイコンを右クリックすると出てくる項目の中から、Wireleass & Wired Network Settingsを選びます。

 Configureの右の項目にwlan0を出します。Automatically configure empty optionsのチェックを外し、Applyボタンを押します。

 DHCPサーバのリースIPアドレスを外れた固定IPアドレスとしたい値とゲートウェイ(Router)、DNSサーバのアドレス(今のルータはDNSを中継してくれる)を入れ、Disable IPv6にチェックを入れます。Applyをクリックし、Closeをクリックします。

 リブートします。固定IPアドレスになりました。