このトピックでは、MQTT クライアントを使用して Message Queuing Telemetry Transport(MQTT)接続を確立する方法について説明します。
背景情報
MQTT クライアントを使用して MQTT CONNECT メッセージを送信する場合は、次の点に注意してください。
- デバイス証明書(ProductKey、DeviceName、DeviceSecret)または ProductKey、DeviceName、ClientID、DeviceToken の組み合わせを使用して複数の物理デバイスを IoT Platform に接続する場合、MQTT クライアントはオンラインとオフラインを繰り返し切り替える可能性があります。新しいデバイスが IoT Platform に検証リクエストを送信すると、元のデバイスは強制的にオフラインになります。デバイスがオフラインになると、デバイスは自動的に接続の再確立を試みます。
- MQTT 接続モードでは、Link SDK は、デバイスが切断された後、自動的に接続の再確立を試みます。 Log Service を使用して、デバイスの動作に関する情報を表示できます。
MQTT クライアントを IoT Platform に接続する
- 通信セキュリティを確保するために、Transport Layer Security(TLS)を使用して、IoT Platform とデバイス間で送信されるデータを暗号化する必要があります。重要 2022 年 8 月 2 日以降、新しいデバイスは暗号化されていない TCP チャネルを介して IoT Platform に接続できなくなりました。この制限により、IoT Platform とビジネスのセキュリティが確保されます。この制限は、既存の Alibaba Cloud アカウントのデバイスには適用されません。できるだけ早く、IoT Platform に接続するデバイスに対して TLS 暗号化を有効にすることをお勧めします。
- Link SDK には TLS 暗号化機能が統合されています。この機能を設定する必要はありません。
- 独自のデバイス側 SDK を開発する場合は、ルート証明書をダウンロードします。ルート証明書の使用方法については、「認証局(CA)証明書」をご参照ください。重要 ルート証明書は、2028 年 1 月 28 日 12:00:00 まで有効です。ルート証明書の有効期限が切れると、証明書を使用して認証局(CA)サーバーを検証できなくなります。TLS 暗号化が有効になっているすべてのデバイスがルート証明書を更新できるようにしてください。
- MQTT クライアントをサーバーに接続します。接続方法の詳細については、GitHub にアクセスしてください。MQTT プロトコルの詳細については、「MQTT 公式ドキュメント」をご参照ください。説明 Alibaba Cloud は、サードパーティのコードに対するテクニカルサポートを提供していません。
- MQTT 接続を確立します。
デバイス側 SDK を使用してデバイスを IoT Platform に接続することをお勧めします。 C 用 SDK を使用してデバイスを IoT Platform に接続する場合は、「MQTT 経由の接続」をご参照ください。デバイス SDK を使用してデバイスを接続する場合は、パラメーターを設定します。次の表にパラメーターを示します。
パラメーター 説明 Endpoint MQTT クライアントを接続するパブリックインスタンスまたは Enterprise Edition インスタンスのエンドポイント。サポートされているエンドポイントの詳細については、「インスタンスのエンドポイントを管理する 可変ヘッダー:Keep Alive CONNECT メッセージには Keep Alive パラメーターを含める必要があります。キープアライブ期間は 30 ~ 1,200 秒です。300 秒を超えるキープアライブ期間を設定することをお勧めします。ネットワーク接続が不安定な場合は、より長いキープアライブ期間を設定することをお勧めします。Keep Alive パラメーターの値がこの範囲内にない場合、IoT Platform は接続を拒否します。 詳細については、「MQTT キープアライブメカニズム」をご参照ください。
MQTT CONNECT メッセージのパラメーター デバイスごとの一意の証明書検証と製品ごとの事前登録済み一意の証明書検証:デバイス証明書(ProductKey、DeviceName、DeviceSecret)を使用してデバイスを IoT Platform に接続します。 mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|" mqttUsername: deviceName+"&"+productKey mqttPassword: sign_hmac(deviceSecret,content)- mqttClientId:拡張パラメーターは縦棒(
| |)の間に配置されます。 - clientId:クライアントの ID。ビジネス要件に基づいてクライアント ID を指定できます。クライアント ID は 64 文字を超えることはできません。デバイスの MAC アドレスまたはシリアル番号(SN)をクライアント ID として使用することをお勧めします。
- securemode:現在のセキュリティモード。有効な値:2(直接 TLS 接続)および 3(直接 TCP 接続)。
- signmethod:署名アルゴリズム。有効な値:hmacmd5、hmacsha1、hmacsha256、sha256。デフォルト値:hmacmd5。
- timestamp:現在の時刻(ミリ秒単位)。このパラメーターはオプションです。
- mqttPassword:パスワード。計算方法:サーバーに送信されるパラメーターをアルファベット順にソートし、指定された署名アルゴリズムに基づいてパラメーターを暗号化します。署名計算の例の詳細については、「MQTT 接続の署名を作成する例」をご参照ください。
- content:サーバーに送信されるパラメーターで構成される連結文字列。これらのパラメーターには、productKey、deviceName、timestamp、clientId が含まれます。パラメーターはアルファベット順にソートされ、デリミタなしで連結されます。重要 productKey と deviceName は必須です。timestamp と clientId はオプションです。timestamp または clientId パラメーターを設定する場合、パラメーター値は mqttClientId パラメーターに指定された値と同じである必要があります。
例:
次の値が指定されています:
clientId=12345, deviceName=device, productKey=pk, timestamp=789, signmethod=hmacsha1, deviceSecret=secret。次のコードは、TCP 経由で送信される MQTT CONNECT メッセージのパラメーターを示しています。mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789| mqttUsername=device&pk mqttPassword=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();暗号化されたパスワードは、バイナリ文字列から変換された 16 進数文字列です。次のコードに結果を示します。
FAFD82A3D602B37FB0FA8B7892F24A477F85****MQTT 署名パラメーターの取得方法の詳細については、「認証用の MQTT パラメーターを取得するにはどうすればよいですか?」をご参照ください。
事前登録不要の製品ごとの一意の証明書検証:ProductKey、DeviceName、ClientID、DeviceToken を使用してデバイスを IoT Platform に接続します。 mqttClientId: clientId+"|securemode=-2,authType=connwl|" mqttUsername: deviceName+"&"+productKey mqttPassword: deviceToken- mqttClientId:拡張パラメーターは縦棒(
| |)の間に配置されます。 - clientId、deviceToken:デバイスが動的に登録されたときに取得される ClientID と DeviceToken。詳細については、「MQTT ベースの動的登録」をご参照ください。
- securemode:現在のセキュリティモード。事前登録不要の製品ごとの一意の証明書検証を使用する場合は、値を -2 に設定します。
- authType:検証方法。事前登録不要の製品ごとの一意の証明書検証を使用する場合は、値を connwl に設定します。
- mqttClientId:拡張パラメーターは縦棒(
例
オープンソースの MQTT クライアントを使用して IoT Platform に接続する方法の詳細については、次のトピックをご参照ください。
MQTT キープアライブメカニズム
キープアライブ期間中、デバイスは ping リクエストを含む少なくとも 1 つのメッセージを送信する必要があります。
キープアライブ期間の有効な値:30 ~ 1,200 秒。キープアライブ期間は 300 秒を超える値に設定することをお勧めします。
IoT Platform が CONNECT メッセージへの応答として CONNACK メッセージを送信すると、タイマーが開始されます。IoT Platform が PUBLISH、SUBSCRIBE、PING、または PUBACK メッセージを受信すると、タイマーがリセットされます。 IoT Platform は 30 秒ごとに MQTT 接続のハートビートをチェックします。ハートビートチェックの待機時間は、デバイスが IoT Platform に接続した時点から次のハートビートチェックが実行される時点までの期間です。最大タイムアウト期間は、次の式を使用して計算されます:ハートビート間隔 × 1.5 + ハートビートチェックの待機時間。サーバーが最大タイムアウト期間内にデバイスからメッセージを受信しない場合、サーバーはデバイスとの接続を終了します。