【ラズパイ x IoTネットワーク】MQTTをローカルネットワーク間で通信してみる


2020/09/09

MQTTとはIoTやM2Mで利用される通信プロトコルの一つです。

MQTTは多数のデバイスの間で短いメッセージを頻繁に送受信することを想定して利用されています。このプロトコルの特徴としてあげられるのが、比較対象とされるHTTPよりも軽量でシンプルな電文仕様に設計されているため、ネットワークの通信速度・転送量も抑えられ、処理時間も消費電力も少なくすむことが可能とされています。

一般に、メッセージ送信をおこなう方をパブリッシャー、受信する方をサブスクライバーと呼んで区別していますが、あくまでもパブリッシャーとサブスクライバーは、通信の送信側と受信側という見方であり、どちらもMQTTクライアントとされています。よってMQTTクライアント間で直接通信が行われるわけではなく、ブローカーと呼ばれるMQTTサーバーを介して通信が行われ、このサーバーに接続されたMQTTネットワーク内での通信を可能とします。このネットワークを共有するクライアント間で、多対多通信の対応が実現し、通常パブリッシャーから発行されるメッセージはトピックを呼ばれる文をつけて発信され、パブリッシャーは興味のあるトピックを購読することができます。

さて、今回はnode.js環境でMQTT事始的に利用するための最も基本的な利用手順を解説します。


やり方

この記事では、ラズパイをMQTTクライアントにして、パソコン側に構築したブローカー(MQTTサーバー)を介して通信してみます。

まず最初にラズパイとパソコンをお互いにLANネットワークにつなげておきましょう。というのはMQTTはHTTPと同じアプリケーション層に属しており、それ以下のTCP/IPまでは共通であるおかげで、通常のインターネットルータに接続する感覚でMQTTが利用できるようになるためです。

パソコン側のブローカーの導入

最初にパソコン側をMQTTサーバーとして利用できるように設定します。

ブローカーには
mosquittoというアプリケーションをデーモンとして立ち上げておきます。

            $ sudo apt install mosquitto -y
$ sudo systemctl start mosquitto
        
これだけでパソコン側がMQTTサーバーとして立ち上がりました。

ラズパイ側をサブスクライバーに設定

ラズパイにmqtt.jsを導入します。これはnode.jsで動くMQTTクライアント用のライブラリです。

            $ npm i mqtt -s
        
パッケージがインストールされたらサブスクライバー側から、ブローカーに接続してみましょう。以下のコードをsubscrive.jsとして編集し、作業フォルダのルートにでも保存しておきます。

ちなみにMQTTサーバーのアドレスは、パソコンの現在のIPアドレス値
192.168.0.200だった場合、mqtt://192.168.0.200というような名前になっています。

            const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://192.168.0.200');
const topic = 'hoge/piyo/fuga';

client.on('connect', function() {
    console.log('subscriber connected.');
});

client.subscribe(topic, function(err, granted) {
    console.log('subscriber subscribed.');
});

client.on('message', function(topic_, message) {
    console.log('subscriber received topic:', topic_, 'message:', message.toString());
});
        
それではこのプログラムを実行し、サブスクライバー側はこのままメッセージ待ち状態で待機させておきます。

            $ node subscrive.js
subscriber connected.
subscriber subscribed.
        

パソコン側からメッセージ送信

本来ならもう一台MQTTクライアント機を設けてパブリッシャーとし、そのクライアントからメッセージを送信することが期待されますが、今回はMQTTのテスト程度ですので、パソコン側にもクライアント設定させて、そこからメッセージを送信させてみます。

クライアントとサーバーは物理的に分けておく必要はなく、今回のようにパブリッシャー兼ブローカーという設定でも問題なく動作します。

それでは以下のようにmqtt.jsをパソコン環境側にもインストールします。

            $ npm i mqtt -s
        
メッセージ送信側には、以下のようなコードをpubish.jsとして編集して保存します。

            const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://192.168.0.200');

const message = 'SAY HELLO TO MQTT';
const topic = 'hoge/piyo/fuga'

client.on('connect', function() {
    console.log('publisher connected.');
    client.publish(topic, message);
    console.log('send topic:', topic, ', message:', message);
});
        
早速このプログラムを実行してみます。

            $ node pubish.js
publisher connected.
send topic: hoge/piyo/fuga , message: SAY HELLO TO MQTT
        
とメッセージが送信されました。

ラズパイ側でメッセージ受信

サブスクライバー側にメッセージが到達すると、

            subscriber received topic: hoge/piyo/fuga , message: SAY HELLO TO MQTT
        
というようにメッセージが正常に受け取っていたら成功です。


まとめ

今回は最も単純なMQTTネットワークの構築方法を説明しました。

次回以降では、MQTT利用した応用的な話題も少しづつ取り入れて解説していきましょう。

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。