MQTT コネクションの確立

MQTT プロトコルを使ってサーバーとやりとりするには、MQTT プロトコルによるコネクションを確立する必要があります。コネクションを取得する流れは、こちら のシーケンス図をご覧ください。

コネクションを確立するにはデフォルトの MQTT ブローカーに接続して、API の実行に使用するための接続情報を取得後、取得した MQTT ブローカーに接続します。API が実行できるのは、デフォルトのブローカーではなく新しく接続した方の MQTT ブローカーです。これらは、外部ライブラリー を使って実装できます。

コネクションを確立するには、以下の処理を順に行います。

デフォルト MQTT ブローカーへの接続

まずはデフォルト MQTT ブローカーに接続します。

  • ホスト名:mqtt-jp.kii.com
  • ポート番号:1883(TCP 接続)、8883(SSL/TLS 接続)、12470(WebSocket 接続)、12473(WebSocket SSL/TLS 接続)

通常、Thing からは、ポート番号 8883 を使用し、SSL/TLS で接続します。WebSocket は Web アプリからの用途を想定しています。

この MQTT ブローカーに以下の条件で接続します。

MQTT の接続パラメーター 指定する値
ユーザー名 type=oauth2&client_id={APP_ID}
パスワード client_secret={APP_KEY}
クライアント ID anonymous

接続時、多くの MQTT ライブラリーでは自動的に CONNECT コマンドの送信と CONNACK コマンドの受信が行われます。

PUBLISH コマンドの送信

デフォルト MQTT ブローカーへの接続後、初期登録 を実行するため、PUBLISH コマンドを送信します。以下の内容で PUBLISH コマンドを送信すると、API の実行に使用する Thing が Thing Interaction Framework に初期登録されます。

  • MQTT トピック名

    p/anonymous/thing-if/apps/{APP_ID}/onboardings

  • ペイロード

    ペイロードには下記のようなテキスト形式のデータを指定します。{VENDOR_THING_ID}{THING_PASSWORD} には、初期登録で使用する Thing の vendorThingID とパスワードを指定します。

    POST
    Content-type: application/vnd.kii.OnboardingWithVendorThingIDByThing+json
    
    {
      "vendorThingID" : "{VENDOR_THING_ID}",
      "thingPassword" : "{THING_PASSWORD}"
    }
    

    このフォーマットは、MQTT プロトコルを HTTPS プロトコルにマッピングするためのもので、Kii Cloud に特有の形式です。フォーマットの詳細は API の実行 をご覧ください。

PUBLISH コマンドの受信

初期登録の結果は、サーバー側からの PUBLISH コマンドとして受信できます。

PUBLISH コマンドで受信される MQTT トピック名は、送信時に指定したものと同じものです。

PUBLISH コマンドは様々な目的で受信するため、サーバー側からの PUBLISH コマンドを受け取った際には、必ず MQTT トピック名をチェックするように実装してください。また、未知の MQTT トピック名を持つ PUBLISH コマンドは、将来の拡張のため無視するように実装してください。

  • MQTT トピック名

    p/anonymous/thing-if/apps/{APP_ID}/onboardings

  • ペイロード

    ペイロードから、以下のようなテキストを受信できます。初期登録の実行結果と、API を処理できる MQTT ブローカーへの接続情報が含まれています。

    200
    Accept-Ranges:bytes
    Age:0
    Cache-Control:max-age=0, no-cache, no-store
    Content-Type:application/json
    Date:Fri, 27 May 2016 05:44:17 GMT
    Connection:keep-alive
    
    {
      "accessToken" : "{ACCESS_TOKEN}",
      "thingID" : "{THING_ID}",
      "mqttEndpoint" : {
        "installationID" : "{INSTALLATION_ID}",
        "username" : "{USERNAME}",
        "password" : "{PASSWORD}",
        "mqttTopic" : "{MQTT_TOPIC}",
        "host" : "{BROKER_HOST}",
        "portTCP" : {PORT_TCP},
        "portSSL" : {PORT_SSL},
        "portWS" : {PORT_WS},
        "portWSS" : {PORT_WSS},
        "ttl" : {MQTT_TTL}
      }
    }
    

この情報を受信した後は、デフォルト MQTT ブローカーへの接続を切断することができます。

デフォルト MQTT ブローカーでの接続では、初期登録以外の操作を実行することはできません。

MQTT ブローカーへの接続

次に、実際に API 呼び出しを受け付けるブローカーに接続します。初期登録の結果得られた MQTT ブローカーへの接続情報を使って、新しい MQTT コネクションを確立します。

接続には以下の情報を利用します。

接続に必要な情報 設定する値
接続先ホスト名 初期登録のレスポンス の "host"
接続先ポート番号 初期登録のレスポンス の "portTCP" (TCP 接続)または "portSSL" (SSL/TLS 接続)
WebSocket 接続用ポート番号 初期登録のレスポンス の "portWS"(TCP 接続)または "portWSS"(SSL/TLS 接続)
CONNECT コマンドの Keep alive timer アプリの実装に合わせて送信(キープアライブタイマー 参照)
CONNECT コマンドの Client identifier 初期登録のレスポンス の "mqttTopic"
CONNECT コマンドの Username 初期登録のレスポンス の "username"
CONNECT コマンドの Password 初期登録のレスポンス の "password"

さらに、通常は 初期登録のレスポンス の "mqttTopic" を SUBSCRIBE コマンドで講読しておきます。これは、プッシュ通知で利用する MQTT トピックで、モバイルアプリからの コマンド の受信を PUBLISH コマンドとして受け取ることができます。プッシュ通知で PUBLISH コマンドを受信した際の実装方法は コマンドの受信 をご覧ください。

キープアライブタイマー

MQTT では、コネクションが切れていないことを確認するために キープアライブタイマー による死活監視の方法が定められています。

MQTT プロトコルでは、CONNECT コマンドで送信した Keep alive timer 値の 1.5 倍の時間以内に、クライアントから何らかのメッセージを送信しないと、コネクションは自動的に切断されます。この時間内にクライアントからのメッセージ送信がない場合、PINGREQ コマンドを送信する必要があります。実装方法は使用する MQTT ライブラリーのドキュメントを参照してください。

MQTT クライアントの実装後は、送信コマンドがない状態でしばらく放置し、その後、コネクションが切れないことを確認しておくことをお勧めします。コネクションが一定時間で切れる場合、PINGREQ コマンドが送信されていない可能性があります。