发布 Topic
4.3.8 NodeJS Demo 使用说明
概述
本文以NodeJS为例,介绍设备通过MQTTS/MQTT协议接入平台,通过平台接口实现
“数据上报”、“命令下发”的功能。如需其他语言接入,请参考资源获取。
前提条件
● 已安装Node.js,若未安装请参考安装Node.js。
● 已在控制台获取设备接入地址。获取地址的操作步骤,请参考平台对接信息。
● 已在控制台创建产品和设备。创建产品和设备的具体操作细节,请参考创建产 品、注册单个设备或批量注册设备。
准备工作
1. 安装Node.js访问Node.js官网,选择合适系统的版本下载。(本文以windows 64-bit系统,Node.js版本v12.18.0(npm 6.14.4)为例)。
2. 下载完成后,运行安装文件,根据界面提示安装。
3. 检查Node.js是否安装成功。
导入代码样例
步骤1 下载quickStart(Node.js)样例,并解压。
步骤2 运行Win键 + r -->输入 cmd-->回车,进入命令行窗口,安装全局模块,执行如下命 令:
npm install mqtt -g:mqtt协议模块;
npm install crypto-js -g:设备密钥加密算法模块;
npm install fs -g:用于加载平台证书;
步骤3 找到文件解压的对应目录,如下图所示。
代码目录介绍如下:
● DigiCertGlobalRootCA.crt.pem:平台证书文件;
● MqttDemo.js:Node.js源码,包含MQTT/MQTTS连接到平台,并进行属性上 报,命令下发;
步骤4 Demo里的关键工程配置参数。其中MqttDemo.js需要配置Server地址、设备ID和设备 密钥,用于启动Demo时,连接控制台上注册的设备。
设备接入
开发指南 4 设备侧开发
● Server地址:即域名,参考平台对接信息获取,SSL加密接入时该Server地址要与 对应的证书文件匹配使用;
● 设备ID和设备密钥:在物联网平台注册设备或调用创建设备接口后获取。
var TRUSTED_CA = fs.readFileSync("DigiCertGlobalRootCA.crt.pem");//获取证书 //IoT平台mqtt对接地址
var serverUrl = "iot-mqtts.cn-north-4.myhuaweicloud.com";
var deviceId = "****";//请填写在平台注册的设备ID var secret = "****";//请填写在平台注册的设备密钥
var timestamp = dateFormat("YYYYmmddHH", new Date());
var propertiesReportJson = {'services':[{'properties':{'alarm':1,'temperature':12.670784,'humidity':
18.37673,'smokeConcentration':19.97906},'service_id':'smokeDetector','event_time':null}]};
var responseReqJson = {'result_code': 0,'response_name': 'COMMAND_RESPONSE','paras': {'result': 'success'}};
步骤5 用户可通过mqtt.connect(options)中选择不同的options,确定设备侧建链时是否进行
clientId: getClientId(deviceId), username: deviceId,
password:HmacSHA256(secret, timestamp).toString(), ca: TRUSTED_CA,
protocol: 'mqtts', rejectUnauthorized: false, keepalive: 120,
reconnectPeriod: 10000, connectTimeout: 30000 }
//MQTT非安全连接,不建议使用 var option = {
host: serverUrl, port: 1883,
clientId: getClientId(deviceId), username: deviceId,
password: HmacSHA256(secret, timestamp).toString(), keepalive: 120,
reconnectPeriod: 10000, connectTimeout: 30000 //protocol: 'mqtts' //rejectUnauthorized: false }
//此处默认使用options为安全连接 var client = mqtt.connect(options);
----结束
//发布消息 publishMessage();
})
//命令下发响应
client.on('message', function (topic, message) { log('received message is ' + message.toString());
var jsonMsg = responseReq;
client.publish(getResponseTopic(topic.toString().split("=")[1]), jsonMsg);
log('responsed message is ' + jsonMsg);
})
找到NodeJS Demo源码目录,修改关键工程配置参数后启动程序,如下图:
启动程序前,设备状态是离线。
启动程序后,设备状态变为在线
注:如果连接失败,在重连回调函数中已实现退避重连,代码样例如下:
client.on('reconnect', () => { log("reconnect is starting");
//退避重连
var lowBound = Number(defaultBackoff)*Number(0.8);
var highBound = Number(defaultBackoff)*Number(1.2);
var randomBackOff = parseInt(Math.random()*(highBound-lowBound+1),10);
var backOffWithJitter = (Math.pow(2.0, retryTimes)) * (randomBackOff + lowBound);
var waitTImeUtilNextRetry = (minBackoff + backOffWithJitter) > maxBackoff ? maxBackoff : (minBackoff + backOffWithJitter);
client.options.reconnectPeriod = waitTImeUtilNextRetry;
log("next retry time: " + waitTImeUtilNextRetry);
设备接入
开发指南 4 设备侧开发
retryTimes++; function subScribeTopic() {
client.subscribe(getCmdRequestTopic(), function (err) { if (err) { function publishMessage() {
var jsonMsg = propertiesReport;
log("publish message topic is " + getReportTopic());
log("publish message is " + jsonMsg);
client.publish(getReportTopic(), jsonMsg);
log("publish message successful");
}
上报属性的json:
var propertiesReportJson = {'services':[{'properties':{'alarm':1,'temperature':12.670784,'humidity':
18.37673,'smokeConcentration':19.97906},'service_id':'smokeDetector','event_time':null}]};
命令行主界面如下:
接收下发命令
在Demo中提供了接收平台下发命令的功能,在MQTT建链完成并成功订阅Topic后,
可以在控制台设备详情中命令下发或使用应用侧Demo对该设备ID进行命令下发。下 发成功后,在Demo中接收到平台下发给设备的命令。
例如下发参数名为smokeDetector: SILENCE,参数值为50的命令。
命令下发成功后,Demo收到的消息是50,命令运行主界面显示如下: