本文介绍使用Node.js语言的AMQP SDK接入阿里云物联网平台,接收服务端订阅消息的示例。
前提条件
已获取消费组ID,并订阅Topic消息。
管理消费组:您可使用物联网平台默认消费组(DEFAULT_GROUP)或创建消费组。
配置AMQP服务端订阅:您可通过消费组订阅需要的Topic消息。
准备开发环境
支持使用的开发环境为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。
安装成功后,打开CMD窗口,通过以下命令查看node版本。
node --version
显示如下版本号,表示安装成功。
v14.15.1
在本地计算机创建一个JavaScript文件(例如amqp.js),用来存放Node.js示例代码。
示例代码如下,按照以下表格中的参数说明,修改代码中的参数值。
重要请确保参数值输入正确,否则AMQP客户端接入会失败。
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']; //创建Connection。 var connection = container.connect({ //接入域名,请参见AMQP客户端接入说明文档。 'host': '${YourHost}', 'port': 5671, 'transport':'tls', 'reconnect':true, 'idle_time_out':60000, //userName组装方法,请参见AMQP客户端接入说明文档。 'username':'${YourClientId}|authMode=aksign,signMethod=hmacsha1,timestamp=1573489088171,authId=' + accessKey + ',iotInstanceId=${YourIotInstanceId},consumerGroupId=${YourConsumerGroupId}|', //计算签名,password组装方法,请参见AMQP客户端接入说明文档。 'password': hmacSha1(accessSecret, 'authId='+ accessKey +'×tamp=1573489088171'), }); //创建Receiver Link。 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(); }); //计算password签名。 function hmacSha1(key, context) { return Buffer.from(crypto.createHmac('sha1', key).update(context).digest()) .toString('base64'); }
参数
示例
说明
host
iot-cn-***.amqp.iothub.aliyuncs.com
AMQP接入域名。
${YourHost}
对应的AMQP接入域名信息,请参见管理实例终端节点。username
'test |authMode=aksign,signMethod=hmacsha1,timestamp=1573489088171,authId=LTAI***vKu****,iotInstanceId=,consumerGroupId=DEFAULT_GROUP|'
接入物联网平台的身份认证信息。其中:
${YourClientId}
:替换为客户端ID,可自定义,长度不可超过64个字符。建议使用您的AMQP客户端所在服务器UUID、MAC地址、IP等唯一标识。AMQP客户端接入并启动成功后,登录物联网平台控制台,在对应实例的 页签,单击消费组对应的查看,消费组详情页面将显示该参数,方便您识别区分不同的客户端。
${YourAccessKeyId}
、${YourAccessKeySecret}
:替换为您物联网平台的AccessKey ID和AccessKey Secret。登录物联网平台控制台,将鼠标移至账号头像上,然后单击AccessKey管理,获取AccessKey ID和AccessKey Secret。
说明如果使用RAM用户,您需授予该RAM用户管理物联网平台的权限(AliyunIOTFullAccess),否则将连接失败。授权方法请参见RAM用户访问。
${YourIotInstanceId}
:替换为实例ID。您可登录物联网平台控制台,在实例概览找到对应的实例,查看实例ID。
重要若没有实例概览或ID,直接删除${YourIotInstanceId}即可。
${YourConsumerGroupId}
:替换为消费组ID。登录物联网平台控制台,在对应实例的 查看您的消费组ID。
password
hmacSha1('iMS8ZhCDd***'*, 'authId=LTAI4GFGQ****×tamp=1573489088171')
打开CMD窗口,使用cd命令找到amqp.js文件所在路径,在该路径下使用npm命令下载rhea库。下载后,项目文件如下图所示。
npm install rhea
在CMD窗口输入如下命令,运行amqp.js代码,启动AMQP客户端服务器。
node amqp.js
运行结果示例
成功:返回类似如下日志信息,表示AMQP客户端已接入物联网平台并成功接收消息。
失败:返回类似如下日志信息,表示AMQP客户端连接物联网平台失败。
您可根据日志提示,检查代码或网络环境,然后修正问题,重新运行代码。
相关文档
服务端订阅消息相关错误码,请参见消息相关错误码。