EMQ XでCoAPとMQTTを相互に変換する

392 2020-11-09 12:31

CoAPとMQTTは、どちらもIoTの分野でよく利用されている軽量な通信プロトコルです。EMQ XはMQTTブローカーですが、CoAPを使って接続することもできます。そのため、あるデバイスがCoAPで送ったメッセージを他のデバイスがMQTTで受信することができ、その逆も可能となっています。今回は、EMQ XでCoAPを有効化する手順について説明します。

はじめに:CoAP <=> MQTTでどのように変換されるか

実際に手順を説明する前に、EMQ XがCoAPとMQTTをどのように相互変換しているかについて説明します。

CoAPとMQTTはどちらもpub/subモデルを使っています。そして、MQTTがトピックでメッセージの行き先を振り分ける一方で、CoAPのURIはRESTの原則に基づいています。EMQ XのCoAPプラグインでは、以下のようにCoAPとMQTTを対応させました。

CoAP MQTT
PUT Publish
GET Subscribe
URIのパス トピック
URIのクエリ client id, username, password

つまり、CoAPにおける

put "coap://host:port/mqtt/$topic?c=$client&u=$username&p=$password"

は、MQTTで$topicというトピックに

  • client ID: $client
  • username: $username
  • password: $password

という接続情報でpublishするのと同等になります($topicにpublishするためには、CoAP側でmqtt/$topicとパスを指定する必要があります。

getの場合も同様で、

get "coap://host:port/mqtt/$topic?c=$client&u=$username&p=$password"

は、

は、MQTTで$topicというトピックに

  • client ID: $client
  • username: $username
  • password: $password

という接続情報でsubscribeするのと同等です。

それでは、実際にやってみましょう。

EMQ Xを起動し、CoAPプラグインを有効化する

EMQ Xのインストール、起動についてはこちらを参照してください。

EMQ Xを起動したらダッシュボードを開きます。デフォルトでは http://localhost:18083 からダッシュボードに接続できます。設定を変更していなければ、

  • username: admin
  • password: password

でログインできます。

ダッシュボードを開いたら、左にあるPluginsをクリックしてCoAPのプラグインを探し、Startでプラグインを立ち上げます。

image.png

MQTTでEMQ Xに接続する

MQTTXでEMQ Xに接続し、トピック coap_to_mqttにsubscribeします。

image.png

CoAPでEMQ Xに接続する

今回はlibcoapを使います。

# リンクからダウンロードもできます  https://github.com/obgm/libcoap/archive/refs/tags/v4.2.1.zip
git clone https://github.com/obgm/libcoap.git
# ↓リンクからダウンロードした場合はunzipしてください
# unzip libcoap-4.2.1.zip

# libcoapのディレクトリに移動
cd libcoap
# stable version (今回はv4.2.1)に切り替え
# ダウンロードリンクを使った場合は不要
git checkout v4.2.1
# Couldn't find 'autoconf'! などのエラーが出た場合は
# 指示に従って対象のpackageをインストールしてください
./autogen.sh
./configure --enable-documentation=no --enable-tests=no
# Package化
make

上記が完了したら、libcoapのexamplesフォルダにあるcoap-clientを使います。

# CoAPクライアントで
# 'hello EMQ X world,  I am CoAP'というメッセージを
# トピック 'coap_to_mqtt' に送ります
./examples/coap-client -m put -e "hello EMQ X world, I am CoAP" "coap://127.0.0.1/mqtt/coap_to_mqtt?c=coap20211&u=tom&p=secret"
# 127.0.0.1はEMQ Xのエンドポイントに置き換えてください

このように、CoAPでメッセージをPUTすると、MQTT Xでメッセージが受信できます。

image.png

今度は、CoAPのGETを使ってsubscribeしてみます。

./examples/coap-client -m get -s 20 "coap://127.0.0.1/mqtt/mqtt_to_coap?c=client1&u=tom&p=secret"

MQTTからメッセージをpublishすると、

image.png

./examples/coap-client -m get -s 20 "coap://127.0.0.1/mqtt/mqtt_to_coap?c=client1&u=tom&p=secret"
hello CoAP, I am MQTT, welcome to EMQ X Wrold!

このように、メッセージがCoAP側に届きます。

おわりに

EMQ Xはほかにも、LwM2M, JT808などのプロトコルをサポートしています。