• 沒有找到結果。

发布 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,命令运行主界面显示如下: