このトピックでは、Node.js 向け AMQP SDK を使用して Alibaba Cloud IoT Platform に接続し、サーバーサイドサブスクリプションでメッセージを受信する方法について説明します。
前提条件
トピックのメッセージをサブスクライブするコンシューマーグループの ID を取得します。
DEFAULT_GROUP という名前のデフォルトのコンシューマーグループを使用するか、IoT Platform コンソールでコンシューマーグループを作成できます。詳細については、「コンシューマーグループを管理する」をご参照ください。
コンシューマーグループを使用して、トピックのメッセージをサブスクライブできます。詳細については、「AMQP サーバー側サブスクリプションを設定する」をご参照ください。
開発環境のセットアップ
Node.js 8.0.0 以降が必要です。
SDK のダウンロードとインストール
Node.js AMQP SDK には、rhea ライブラリの使用を推奨します。rhea にアクセスしてライブラリをダウンロードし、ドキュメントをご確認ください。
この例では、npm install rhea コマンドを使用して rhea ライブラリをインストールします。
手順
-
Windows または Linux システムで、Node.jsをダウンロードしてインストールします。このトピックでは、Windows 10 (64 ビット) システムと node-v14.15.1-x64.msi インストールパッケージを例として使用します。
-
インストール後、コマンドラインインターフェイスを開き、次のコマンドを実行して Node.js のバージョンを確認します。
node --versionインストールが成功すると、次のようにバージョン番号が返されます。
v14.15.1 -
サンプルコードを格納するために、amqp.js などの JavaScript ファイルを作成します。
以下の表に従ってパラメーターを修正します。
重要有効なパラメーター値を指定してください。そうでない場合、AMQP クライアントは IoT Platform への接続に失敗します。
const container = require('rhea'); const crypto = require('crypto'); // AccessKey ペアを公開すると、アカウントのセキュリティが損なわれる可能性があります。 // このコードはデモンストレーションのみを目的としています。ここでは環境変数から AccessKey ペアを取得します。 var accessKey = process.env['ALIBABA_CLOUD_ACCESS_KEY_ID']; var accessSecret = process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET']; // 接続を作成します。 var connection = container.connect({ // エンドポイント。詳細は、AMQP クライアントの接続に関するドキュメントをご参照ください。 'host': '${YourHost}', 'port': 5671, 'transport':'tls', 'reconnect':true, 'idle_time_out':60000, // ユーザー名の形式。詳細は、AMQP クライアントの接続に関するドキュメントをご参照ください。 'username':'${YourClientId}|authMode=aksign,signMethod=hmacsha1,timestamp=1573489088171,authId=' + accessKey + ',iotInstanceId=${YourIotInstanceId},consumerGroupId=${YourConsumerGroupId}|', // 署名を計算します。パスワード形式の詳細は、AMQP クライアントの接続に関するドキュメントをご参照ください。 'password': hmacSha1(accessSecret, 'authId='+ accessKey +'×tamp=1573489088171'), }); // レシーバーリンクを作成します。 var receiver = connection.open_receiver(); // クラウドからプッシュされたメッセージを受信するためのコールバック関数。 container.on('message', function (context) { var msg = context.message; var messageId = msg.message_id; var topic = msg.application_properties.topic; var content = Buffer.from(msg.body.content).toString(); // 内容を出力します。 console.log(content); // ACK を送信します。コールバック関数に時間のかかる操作を含めないでください。 context.delivery.accept(); }); // パスワード署名を計算します。 function hmacSha1(key, context) { return Buffer.from(crypto.createHmac('sha1', key).update(context).digest()) .toString('base64'); }パラメーター
例
説明
host
iot-cn-***.amqp.iothub.aliyuncs.com
AMQP エンドポイント。
AMQP エンドポイント (
${YourHost}) については、「インスタンスエンドポイントの表示と設定」をご参照ください。username
'test |authMode=aksign,signMethod=hmacsha1,timestamp=1573489088171,authId=LTAI****************,iotInstanceId=,consumerGroupId=DEFAULT_GROUP|'
IoT Platform への接続に使用する認証情報。この文字列には、次のパラメーターが含まれます。
-
${YourClientId}:クライアント ID に置き換えます。最大 64 文字のカスタム ID を定義できます。AMQP クライアントを実行するサーバーの UUID、MAC アドレス、IP アドレスなどの一意の識別子を使用することを推奨します。AMQP クライアントが接続すると、IoT Platform コンソールでこのパラメーターを確認できます。 インスタンスのコンソールで、に移動します。 タブで、対象のコンシューマーグループの横にある[表示]をクリックします。 [コンシューマーグループ詳細] ページには、クライアントの識別に役立つクライアント ID が表示されます。
-
${YourAccessKeyId}と${YourAccessKeySecret}:ご自身の AccessKey ID と AccessKey Secret に置き換えます。これらを取得するには、IoT Platform コンソールにログインし、右上のプロフィール画像にポインターを合わせ、[AccessKey 管理] をクリックします。
説明RAM ユーザーを使用する場合、AliyunIOTFullAccess ポリシーを RAM ユーザーにアタッチする必要があります。そうしないと、接続は失敗します。詳細については、「RAM ユーザーアクセス」をご参照ください。
-
${YourIotInstanceId}:インスタンス ID に置き換えます。IoT Platform コンソールにログインします。インスタンスの [概要] タブでインスタンス ID を確認できます。
重要[概要] タブが利用できないか、またはインスタンスに ID がない場合は、ユーザー名文字列から
iotInstanceId=${YourIotInstanceId}パラメーターを削除します。 -
${YourConsumerGroupId}:コンシューマーグループ ID に置き換えます。コンシューマーグループ ID を確認するには、IoT Platform コンソールにログインします。お使いのインスタンスのコンソールで、の順に移動します。
password
hmacSha1('yourAccessKeySecret','authId=LTAI****************×tamp=1573489088171')
-
-
コマンドラインインターフェイスを開き、amqp.js ファイルが含まれるディレクトリに移動し、次のコマンドを実行して rhea ライブラリをインストールします。
npm install rheaコマンドが完了すると、プロジェクトのルートディレクトリに
node_modulesフォルダー、amqp.jsファイル、およびpackage-lock.jsonファイルが格納されます。 -
CMD ウィンドウで、次のコマンドを入力してamqp.js コードを実行し、AMQP クライアントサーバーを起動します。
node amqp.js
実行結果の例
-
成功:接続に成功すると、クライアントはメッセージの受信を開始し、次のようなログが出力されます。この例は、デバイスによって報告された温度と湿度のデータを示しています。
xxx>node amqp.js {"deviceType":"CustomCategory","iotId":"xxx","requestId":"1613748030337","checkFailedData":{},"productKey":"xxx","gmtCreate":1613747903528, "deviceName":"xxx","items":{"Temperature":{"value":xxx,"time":1613747903526},"Humidity":{"value":23,"time":1613747903526}}} {"deviceType":"CustomCategory","iotId":"xxx","requestId":"1613729851729","checkFailedData":{},"productKey":"xxx","gmtCreate":1613729721715, "deviceName":"xxx","items":{"Temperature":{"value":17,"time":1613729721715},"Humidity":{"value":20,"time":1613729721715}}} -
失敗:接続に失敗すると、次のようなエラーメッセージが表示されます。
エラーログを使用して、コードとネットワーク設定を確認してください。問題を解決し、コードを再実行してください。
>node amqp.js [connection-1] disconnected Error: getaddrinfo ENOTFOUND iot-xxx.b.aliyuncs.com at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) { errno: -3008, code: 'ENOTFOUND', syscall: 'getaddrinfo', hostname: 'ixxx.iyuncs.com' }
関連情報
サーバー側サブスクリプション機能に関連するエラーコードの詳細については、「IoT Platform ログ」トピックのメッセージに関連するエラーコードセクションをご参照ください。