设备接入 IoTDA
设备接入 IoTDA
- 最新动态
- 功能总览
- 服务公告
- 计费说明
- 产品介绍
- 快速入门
- 用户指南
- 最佳实践
- 开发指南
-
API参考
- 应用侧API参考
- 设备侧MQTT/MQTTS接口参考
- 设备侧HTTPS接口参考
- 设备侧LwM2M接口参考
- 安全隧道WebSocket接口参考
- 模组AT指令参考
- 修订记录
- SDK参考
- 场景代码示例
-
常见问题
- 热门问题
-
方案咨询
- 连接IoT平台的业务场景有哪些?
- 设备管理服务和设备接入服务合一后的差异点是什么?
- IAM子用户或子项目是否可以开通物联网平台服务?
- 物联网平台支持在华为云的哪些区域开通?
- 华为是否提供模组/硬件终端/应用软件等?
- IAM用户访问API提示没有权限?(是否区分版本?)
- 创建规则或者设置资源文件存储时候提示赋予Security Administrator权限
- 物联网平台设置默认资源空间的规则是什么?
- 设备接入服务如何获取设备数据?
- 物联网平台的资源空间和设备可以无限创建吗?
- 物联网平台支持批量注册设备吗?
- 物联网平台对应用侧和设备侧在开发或使用时有限制吗?
- 物联网平台支持的DTLS加密算法有哪些?
- 物联网平台支持二进制大小端模式切换吗?
- 什么是NB-IoT?
- 物联网平台支持的硬件架构和使用的相关组件有哪些?
- 如何获取平台接入地址?
- 设备集成相关问题
- 设备侧SDK相关问题
- 设备发放相关问题
- LWM2M/CoAP接入相关问题
- MQTT接入相关问题
- 泛协议接入相关问题
- 物模型相关问题
- 消息通信相关问题
- 订阅推送相关问题
- 编解码插件相关问题
- OTA升级相关问题
- 应用集成相关问题
- 实例管理相关问题
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
Node.js Demo使用说明
概述
本文以Node.js为例,介绍通过MQTTS/MQTT协议接入平台,基于平台接口实现“属性上报”、“订阅接收命令”等功能。
前提条件
准备工作
- 安装Node.js访问Node.js官网,选择合适系统的版本下载。(本文以windows 64-bit系统,Node.js版本v12.18.0(npm 6.14.4)为例)。
- 下载完成后,运行安装文件,根据界面提示安装。
- 检查Node.js是否安装成功。
Win键 + r -->输入 cmd-->回车,进入命令行窗口。
输入node –v,回车后显示Node.js版本,输入npm -v显示版本信息,即表示安装成功。
导入代码样例
- 下载quickStart(Node.js)样例,并解压。
- 运行Win键 + r -->输入 cmd-->回车,进入命令行窗口,安装全局模块,执行如下命令:
npm install mqtt -g:mqtt协议模块;
npm install crypto-js -g:设备密钥加密算法模块;
npm install fs -g:用于加载平台证书;
- 找到文件解压的对应目录,如下图所示。
代码目录介绍如下:
- DigiCertGlobalRootCA.crt.pem:平台证书文件;
- MqttDemo.js:Node.js源码,包含MQTT/MQTTS连接到平台,并进行属性上报,命令下发;
- Demo里的关键工程配置参数。其中MqttDemo.js需要配置Server地址、设备ID和设备密钥,用于启动Demo时,连接控制台上注册的设备。
var TRUSTED_CA = fs.readFileSync("DigiCertGlobalRootCA.crt.pem");//获取证书 //IoT平台mqtt对接地址(要替换为设备所在的平台域名地址) var serverUrl = "xxx.myhuaweicloud.com"; //请填写设备所在平台的接入地址 //注册设备时获得的deviceId,密钥(要替换为自己注册的设备ID与密钥) var deviceId = "722cb****************"; 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'}};
- 用户可通过mqtt.connect(options)中选择不同的options,确定设备侧建链时是否进行SSL加密,建议使用默认的MQTTS安全连接。
//MQTTS安全连接 var options = { host: serverUrl, port: 8883, 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);
程序启动
设备或网关在接入物联网平台时首先需要和平台建立连接,从而将设备或网关与平台进行关联。开发者通过传入设备信息,将设备或网关连接到物联网平台。
- 此Demo主要提供建立MQTT/MQTTS连接等方法,MQTT使用1883端口,MQTTS使用8883端口(需要加载设备校验平台身份的证书,用于设备侧接入物联网平台登录鉴权使用),并提供了Mqtt客户端建立连接的方法mqtt.connect(options)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
var client = mqtt.connect(options); client.on('connect', function () { log("connect to mqtt server success, deviceId is " + deviceId); //订阅Topic subScribeTopic(); //发布消息 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); })
找到Node.js Demo源码目录,修改关键工程配置参数后启动程序,如下图:
启动程序前,设备状态是离线。
图1 设备列表-设备离线启动程序后,设备状态变为在线
图2 设备列表-设备在线注:如果连接失败,在重连回调函数中已实现退避重连,代码样例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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); retryTimes++; })
- 订阅某Topic的设备才能接收broker发布的关于该Topic的消息,关于平台预置Topic可参考Topic定义。此Demo调用subScribeTopic方法进行订阅Topic,订阅成功后等待平台命令下发:
1 2 3 4 5 6 7 8 9 10
//订阅接收命令topic function subScribeTopic() { client.subscribe(getCmdRequestTopic(), function (err) { if (err) { log("subscribe error:" + err); } else { log("topic : " + getCmdRequestTopic() + " is subscribed success"); } }) }
- 发布Topic是指设备主动向平台上报自己的属性或消息,详细见设备属性上报接口文档。连接成功后,调用publishMessage方法进行属性上报:
1 2 3 4 5 6 7 8
//上报json数据,注意serviceId要与Profile中的定义对应 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:1
var propertiesReportJson = {'services':[{'properties':{'alarm':1,'temperature':12.670784,'humidity':18.37673,'smokeConcentration':19.97906},'service_id':'smokeDetector','event_time':null}]};
命令行主界面如下:
属性上报成功,平台界面如下:
图3 查看上报数据-Demo_smokeDetector说明:
如果在“设备详情”页面没有最新上报数据,请确认设备上报的服务/属性和产品模型中的服务/属性一致。
父主题: 使用MQTT Demo接入