EMQ XでCoAPとMQTTを相互に変換する
596 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
でプラグインを立ち上げます。
MQTTでEMQ Xに接続する
MQTTXでEMQ Xに接続し、トピック coap_to_mqtt
にsubscribeします。
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でメッセージが受信できます。
今度は、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すると、
./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などのプロトコルをサポートしています。