Skip to content

CoAP ゲートウェイ

EMQX の CoAP ゲートウェイは、Publish-Subscribe Broker for the CoAP プロトコルに準拠し、標準的なパブリッシュ、サブスクライブ、およびメッセージ受信を実装可能にします。

以下は、接続モードおよびコネクションレスモードでサポートされる機能一覧です。

機能コネクションレスモード接続モード
メッセージパブリッシュ
トピックサブスクライブ
トピックのサブスクライブ解除×
接続の作成×
接続の切断×
ハートビート×
認証×

CoAP ゲートウェイの有効化

EMQX 5 では、CoAP ゲートウェイはダッシュボード、REST API、設定ファイル base.hocon を通じて設定・有効化できます。本節ではダッシュボードを例に操作手順を説明します。

EMQX ダッシュボードの左ナビゲーションメニューから Extensions -> Gateways をクリックします。Gateway ページにて、サポートされているすべてのゲートウェイが一覧表示されます。CoAP を探し、Actions 列の Setup をクリックすると、Initialize CoAP ページに遷移します。

TIP

EMQX をクラスターで稼働させている場合、ダッシュボードや REST API で行った設定はクラスター全体に影響します。特定のノードのみ設定を変更したい場合は、base.hocon にて設定してください。

EMQX CoAP ゲートウェイはコネクションレスモードと接続モードの両方をサポートします。コネクションレスモードではメッセージは一回限りの送信として扱われ、センサーのデータ読み取りや簡単なコマンド送信など短時間のやり取りに適しています。接続モードでは、クライアントはデータ転送開始前にブローカーと接続を確立します。

Connection Requestedfalse または true を選択することで接続モードまたはコネクションレスモードを選択できます。デフォルトは false(コネクションレスモード)です。

接続モードを確認後、設定を続行できます。特にカスタマイズが不要な場合は、以下の3ステップで CoAP ゲートウェイを有効化できます。

  1. Basic Configuration タブで Next をクリックし、すべてのデフォルト設定を受け入れます。
  2. Listeners タブに遷移し、EMQX がポート 5683 で UDP リスナーを事前設定しています。再度 Next をクリックして設定を確定します。
  3. Enable ボタンをクリックして CoAP ゲートウェイを有効化します。

ゲートウェイの有効化が完了すると、Gateways ページに戻り、CoAP ゲートウェイのステータスが Enabled と表示されます。

CoAP ゲートウェイ有効化

上記の設定は REST API でも行えます。

例:

bash
curl -X 'PUT' 'http://127.0.0.1:18083/api/v5/gateways/coap' \
  -u <your-application-key>:<your-security-key> \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "coap",
  "enable": true,
  "mountpoint": "coap/",
  "connection_required": false,
  "listeners": [
    {
      "type": "udp",
      "name": "default",
      "bind": "5683",
      "max_conn_rate": 1000,
      "max_connections": 1024000
    }
  ]
}'

REST API の詳細は REST API - Gateway を参照してください。

カスタマイズが必要な場合やリスナーの追加、認証ルールの追加を行いたい場合は、CoAP ゲートウェイのカスタマイズ セクションを参照してください。

CoAP ゲートウェイは UDP および DTLS タイプリスナーのみをサポートしています。設定可能なパラメータの完全な一覧は Gateway Configuration - Listeners をご覧ください。

CoAP クライアントとの連携

クライアントライブラリ

CoAP ゲートウェイを構築した後、CoAP クライアントツールを使って接続テストを行い、正常に動作することを確認できます。以下は推奨される CoAP クライアントツールです。

パブリッシュ/サブスクライブ

CoAP ゲートウェイは Publish-Subscribe Broker for the CoAP 標準で定義された URI パスとメソッドを使用します。

詳細なパラメータは メッセージパブリッシュトピックサブスクライブトピックのサブスクライブ解除 を参照してください。

CoAP ゲートウェイのカスタマイズ

デフォルト設定に加え、EMQX はさまざまな設定オプションを提供し、特定のビジネス要件に柔軟に対応可能です。本節では Gateways ページ上の各フィールドについて詳しく解説します。以下のスクリーンショット下の説明を参照してください。

image-20230420152920254
  • Connection Required: コネクションレスモードまたは接続モードの有効化を設定します。デフォルトは false(コネクションレスモード)。選択肢は false(コネクションレスモード)、true(接続モード)。

  • Notification Message Type: 配信する CoAP メッセージのタイプを設定します。デフォルトは qos。選択肢は以下の通りです。

    • qos: 受信メッセージの QoS レベルに応じて CoAP 通知のアックが必要か判断します。
      • QoS 0 の場合、クライアントからのアックは不要
      • QoS 1/2 の場合、クライアントからのアックが必要
    • con: CoAP 通知はクライアントによるアックが必要
    • non: CoAP 通知はクライアントによるアック不要
  • Heartbeat: Connection Requiredtrue の場合のみ必要。接続維持のための最小ハートビート間隔を設定します。デフォルトは 30 秒。

  • Enable Statistics: ゲートウェイによる統計収集とレポートを許可するか設定します。デフォルトは true。選択肢は truefalse

  • Subscriber QoS: サブスクライブ要求のデフォルト QoS レベルを設定します。デフォルトは coap。選択肢は以下の通りです。

    • coap: Notification Message Type の設定に従い QoS レベルを決定
      • アック不要の場合は QoS 0
      • アック必要の場合は QoS 1
    • qos0, qos1, qos2
  • Publish QoS: パブリッシュ要求のデフォルト QoS レベルを設定します。デフォルトは coap。選択肢は coapqos0qos1qos2

  • MountPoint: パブリッシュやサブスクライブ時にすべてのトピックに接頭辞として付与される文字列を設定します。これにより異なるプロトコル間でのメッセージルーティングの分離が可能です。例: CoAP

    注意: このトピックプレフィックスはゲートウェイが管理するため、CoAP クライアントはパブリッシュやサブスクライブ時に明示的にこのプレフィックスを付ける必要はありません。

リスナーの追加

デフォルトで、名前が default の UDP リスナーがポート 5683 に設定されており、最大 1,024,000 の同時接続をサポートしています。Settings をクリックすると詳細設定が可能で、Delete でリスナーを削除、Add Listener で新規リスナーを追加できます。

coap-advanced-conf

Add Listener をクリックすると Add Listener ページが開き、以下の設定を行えます。

基本設定

  • Name: リスナーの一意識別子を設定します。
  • Type: プロトコルタイプを選択します。CoAP では udp または dtls を選べます。
  • Bind: リスナーが受け付けるポート番号を設定します。
  • MountPoint(任意): パブリッシュやサブスクライブ時にすべてのトピックに接頭辞として付与される文字列を設定し、異なるプロトコル間のメッセージルーティング分離を実現します。

リスナー設定

  • Max Connections: リスナーが処理可能な最大同時接続数を設定します。デフォルトは 1024000。
  • Max Connection Rate: リスナーが1秒あたりに受け入れる新規接続の最大レートを設定します。デフォルトは 1000。

UDP 設定

  • ActiveN: ソケットの {active, N} オプションを設定します。これはソケットが積極的に処理可能な受信パケット数を意味します。詳細は Erlang Documentation - setopts/2 を参照してください。
  • Buffer: 受信および送信パケットを格納するバッファサイズを KB 単位で設定します。
  • Receive Buffer: 受信バッファサイズを KB 単位で設定します。
  • Send Buffer: 送信バッファサイズを KB 単位で設定します。
  • SO_REUSEADDR: ローカルでのポート番号の再利用を許可するか設定します。

DTLS 設定(DTLS リスナーのみ)

TLS Verify の有効化をトグルスイッチで設定可能です。ただし、その前に関連する TLS CertTLS KeyCA Cert の情報をファイル内容の入力または Select File ボタンでアップロードして設定する必要があります。詳細は Enable SSL/TLS Connection を参照してください。

認証の設定

クライアント ID、ユーザー名、パスワードはクライアントの Create Connection リクエストで提供されます。CoAP ゲートウェイは以下の認証方式をサポートしています。

本節ではダッシュボードを例に認証設定方法を説明します。

Gateways ページで CoAP を探し、Actions 列の Setup をクリック後、Authentication タブに入ります。

Create Authentication をクリックし、MechanismPassword-Based または JWT を選択し、必要に応じて Backend を選択します。

認証方式の詳細な設定方法は、本節冒頭に記載の各ページを参照してください。

ダッシュボードのほか、REST API による認証設定も可能です。例えば、CoAP ゲートウェイ用に組み込みデータベース認証を作成する場合、以下のコードを使用します。

bash
curl -X 'POST' \
  'http://127.0.0.1:18083/api/v5/gateway/coap/authentication' \
  -u <your-application-key>:<your-security-key> \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "backend": "built_in_database",
  "mechanism": "password_based",
  "password_hash_algorithm": {
    "name": "sha256",
    "salt_position": "suffix"
  },
  "user_id_type": "username"
}'

TIP

MQTT プロトコルとは異なり、ゲートウェイは認証方式の作成のみをサポートし、認証方式のリスト(または認証チェーン)はサポートしません。認証方式が有効化されていない場合、すべての CoAP クライアントのログインが許可されます。

リファレンス:CoAP クライアントガイド

Create Connection

Connection Mode でのみ利用可能です。

このインターフェースは CoAP ゲートウェイへのクライアント接続を作成するために使用します。CoAP ゲートウェイの認証が有効な場合、このリクエストで提供された clientidusernamepassword を検証し、不正ユーザーを防止します。

リクエストパラメータ:

  • メソッド: POST
  • URI: mqtt/connection{?QueryString*}QueryString は以下の通りです。
    • clientid: 必須パラメータ、UTF-8 文字列。ゲートウェイはこの文字列を接続の一意識別子として使用します。
    • username: 任意パラメータ、UTF-8 文字列。接続認証に使用。
    • password: 任意パラメータ、UTF-8 文字列。接続認証に使用。
  • ペイロード: 空

レスポンス:

  • ステータスコード:
    • 2.01: 接続作成成功。この接続用のトークン文字列がメッセージボディに返されます。
    • 4.00: 不正なリクエスト。詳細なエラー情報がメッセージボディに返されます。
    • 4.01: 認可失敗。リクエスト形式は正しいが認可に失敗。
  • ペイロード: ステータスコードが 2.01 の場合は Token、それ以外は ErrorMessage
    • Token: 以降のリクエストで使用するトークン文字列。
    • ErrorMessage: エラー説明メッセージ。

libcoap を例に示します。

bash
# clientid 123、username admin、password public で接続リクエストを送信。
# 返却されたトークンは 3404490787
coap-client -m post -e "" "coap://127.0.0.1/mqtt/connection?clientid=123&username=admin&password=public"

3404490787

TIP

接続が正常に作成された後、ダッシュボード、REST API、CLI を使って CoAP ゲートウェイのクライアント一覧を確認できます。

Close Connection

Connection Mode でのみ利用可能です。

このインターフェースは CoAP 接続を切断するために使用します。

リクエストパラメータ:

  • メソッド: DELETE
  • URI: mqtt/connection{?QueryString*}QueryString は以下の通りです。
    • clientid: 必須パラメータ、UTF-8 文字列。ゲートウェイはこの文字列を接続の一意識別子として使用します。
    • token: 必須パラメータ。Create Connection リクエストで返されたトークン文字列を使用。
  • ペイロード: 空

レスポンス:

  • ステータスコード:
    • 2.01: 接続切断成功。
    • 4.00: 不正なリクエスト。詳細なエラー情報がメッセージボディに返されます。
    • 4.01: 認可失敗。リクエスト形式は正しいが認可に失敗。
  • ペイロード: ステータスコードが 2.01 の場合は Token、それ以外は ErrorMessage

例:

bash
coap-client -m delete -e "" "coap://127.0.0.1/mqtt/connection?clientid=123&token=3404490787"

Heartbeat

Connection Mode でのみ利用可能です。

このインターフェースは CoAP クライアントとゲートウェイ間の接続維持に使用します。ハートビートが期限切れになると、ゲートウェイはセッションとサブスクリプションを削除し、クライアントのすべてのリソースを解放します。

リクエストパラメータ:

  • メソッド: PUT
  • URI: mqtt/connection{?QueryString*}QueryString は以下の通りです。
    • clientid: 必須パラメータ、UTF-8 文字列。ゲートウェイはこの文字列を接続の一意識別子として使用します。
    • token: 必須パラメータ。Create Connection リクエストで返されたトークン文字列を使用。
  • ペイロード: 空

レスポンス:

  • ステータスコード:
    • 2.01: 接続維持成功。
    • 4.00: 不正なリクエスト。詳細なエラー情報がメッセージボディに返されます。
    • 4.01: 認可失敗。リクエスト形式は正しいが認可に失敗。
  • ペイロード: ステータスコードが 2.01 の場合は Token、それ以外は ErrorMessage

例:

bash
coap-client -m put -e "" "coap://127.0.0.1/mqtt/connection?clientid=123&token=3404490787"

TIP

ハートビート間隔は CoAP ゲートウェイの heartbeat オプションで決定され、デフォルトは 30 秒です。

メッセージパブリッシュ

このインターフェースは CoAP クライアントが指定したトピックにメッセージを送信するために使用します。Connection Mode が有効な場合は追加の識別情報を含める必要があります。

リクエストパラメータ:

  • メソッド: POST

  • URI: ps/{+topic}{?QueryString*}

    • {+topic} はパブリッシュするメッセージのトピックです。例:coap/test にパブリッシュする場合、URI は ps/coap/test となります。
    • {?QueryString} はリクエストパラメータで以下を含みます。
      • clientid: Connection Mode では必須、Connectionless Mode では任意。
      • token: Connection Mode のみ必須。
      • retain(任意): リテインメッセージとしてパブリッシュするかどうか。ブール値で、デフォルトは false
      • qos: メッセージの QoS。MQTT クライアントがメッセージを受信する際の QoS レベルを示します。値は 012 のいずれか。
      • expiry: メッセージの有効期限(秒単位)。デフォルトは 0(期限なし)。
  • ペイロード: メッセージペイロード

レスポンス:

  • ステータスコード:
    • 2.04: パブリッシュ成功
    • 4.00: 不正リクエスト。詳細なエラー情報がメッセージボディに返されます。
    • 4.01: 認可失敗。リクエスト形式は正しいが認可に失敗。
  • ペイロード: ステータスコードが 2.04 の場合は空、その他は ErrorMessage

例:Connectionless Mode でメッセージをパブリッシュする場合

bash
coap-client -m post -e "Hi, this is libcoap" "coap://127.0.0.1/ps/coap/test"

または、Connection Modeclientidtoken を付与してパブリッシュする場合

bash
coap-client -m post -e "Hi, this is libcoap" "coap://127.0.0.1/ps/coap/test?clientid=123&token=3404490787"

トピックサブスクライブ

このインターフェースは CoAP クライアントがトピックをサブスクライブするために使用します。Connection Mode が有効な場合は追加の識別情報を含める必要があります。

リクエストパラメータ:

  • メソッド: GET

  • オプション: observer0 に設定

  • URI: ps/{+topic}{?QueryString*}

    • {+topic} はサブスクライブするトピックです。例:coap/test にサブスクライブする場合、URI は ps/coap/test となります。
    • {?QueryString} はリクエストパラメータで以下を含みます。
      • clientid: Connection Mode では必須、Connectionless Mode では任意。
      • token: Connection Mode のみ必須。
      • qos: サブスクライブの QoS。ゲートウェイが CoAP クライアントにメッセージを配信する際の MessageType(CON または NON)を示します。値は以下の通り。
        • 0: NON メッセージで配信
        • 1 または 2: CON メッセージで配信
  • ペイロード: 空

レスポンス:

  • ステータスコード:
    • 2.05: サブスクライブ成功
    • 4.00: 不正リクエスト。詳細なエラー情報がメッセージボディに返されます。
    • 4.01: 認可失敗。リクエスト形式は正しいが認可に失敗。
  • ペイロード: ステータスコードが 2.05 の場合は空、その他は ErrorMessage

例:Connectionless Modecoap/test をサブスクライブする場合

bash
coap-client -m get -s 60 -O 6,0x00 -o - -T "obstoken" "coap://127.0.0.1/ps/coap/test"

または、Connection Modeclientidtoken を付与してサブスクライブする場合

bash
coap-client -m get -s 60 -O 6,0x00 -o - -T "obstoken" "coap://127.0.0.1/ps/coap/test?clientid=123&token=3404490787"

トピックのサブスクライブ解除

このインターフェースは CoAP クライアントがトピックのサブスクライブを解除するために使用します。

現状の実装では、サブスクライブ解除操作は Connection Mode のみ利用可能です。

リクエストパラメータ:

  • メソッド: GET

  • URI: ps/{+topic}{?QueryString*}

    • {+topic} はサブスクライブ解除するトピックです。例:coap/test のサブスクライブを解除する場合、URI は ps/coap/test となります。
    • {?QueryString} はリクエストパラメータで以下を含みます。
      • clientid: Connection Mode では必須、Connectionless Mode では任意。
      • token: Connection Mode のみ必須。
  • ペイロード: 空

レスポンス:

  • ステータスコード:
    • 2.07: サブスクライブ解除成功
    • 4.00: 不正リクエスト。詳細なエラー情報がメッセージボディに返されます。
    • 4.01: 認可失敗。リクエスト形式は正しいが認可に失敗。
  • ペイロード: ステータスコードが 2.07 の場合は空、その他は ErrorMessage

例:Connection Modecoap/test のサブスクライブを解除する場合

bash
coap-client -m get -O 6,0x01 "coap://127.0.0.1/ps/coap/test?clientid=123&token=3404490787"

パラメータ名の短縮

メッセージサイズ削減のため、CoAP ゲートウェイは短縮パラメータ名をサポートしています。

例えば、clientid=barxc=bar と書くことができます。サポートされる短縮パラメータ名は以下の通りです。

パラメータ名短縮名
clientidc
usernameu
passwordp
tokent
qosq
retainr