设备接入阿里云物联网平台——Nodejs SDK

文章目录

  • 环境的搭建与配置
    • nodejs的安装
    • 使用npm安装Nodejs SDK
  • 认证与连接
    • 通过MQTT Topic与平台进行通信
      • 消息发布
      • 消息订阅
    • 物模型开发
      • 设备属性的上报
      • 设备属性的设置

环境的搭建与配置

nodejs的安装

1、首先从官网下载编译好的nodejs
https://nodejs.org/en/
选择符合自己电脑配置的安装
设备接入阿里云物联网平台——Nodejs SDK_第1张图片

2、解压文件并将其转移到创建好的目录中

tar xvf node-v12.18.1-linux-x64.tar.xz
mv node-v12.18.1-linux-x64 指定目录

设备接入阿里云物联网平台——Nodejs SDK_第2张图片
3、配置开发环境
在~/.bashrc中写入
在这里插入图片描述

然后运行source .bashrc,重新加载配置文件,就可以在环境变量中看到如图
在这里插入图片描述
4、测试
输入node -v和npm -v,查看是否安装成功
在这里插入图片描述
到这里nodejs就安装成功了

使用npm安装Nodejs SDK

首先创建一个目录用来存放nodejs项目,我的是~/gateway
然后进入到目录执行npm init,初始化node项目,会生成package.json文件用来记录项目的详细信息。执行npm init之后会让输入一些项目的信息,可以根据自己的需要填写,也可以直接enter,信息后期也是可以修改的
设备接入阿里云物联网平台——Nodejs SDK_第3张图片
设备接入阿里云物联网平台——Nodejs SDK_第4张图片

2、进入项目所在目录,安装SDK
设备接入阿里云物联网平台——Nodejs SDK_第5张图片
这样就已经安装成功,接下来就可以进行连接物联网平台了

认证与连接

这里使用的是一机一密的认证方式,比较简单。
这里对产品和设备的创建和设置不做详细解释,具体可以查看阿里云的官方文档中的操作。

// node引入包名
const iot = require('alibabacloud-iot-device-sdk');

//创建iot.device对象将会发起到阿里云IoT的连接
const device = iot.device({
  productKey:  "*********", //将修改为实际产品的ProductKey
  deviceName: "************",//将修改为实际设备的DeviceName
  deviceSecret: "************",//将修改为实际设备的DeviceSecret
});


//监听connect事件
device.on('connect', () => {
  //将 修改为实际值
  device.subscribe('/a1NeIV5y2Cl/testdevice1/user/get'); 
  console.log('connect successfully!');
  device.publish('/a1NeIV5y2Cl/testdevice1/user/update', 'hello world!');
});

//监听message事件
device.on('message', (topic, payload) => {
  console.log(topic, payload.toString());
});
// 上报设备属性
device.postProps({
  LightStatus: 1
}, (res) => {
  console.log(res);
});
			

// 监听云端设置属性服务消息,示例代码为一个灯
device.onProps((cmd)=>{
  console.log('>>>onProps',cmd); //打印完整的属性设置消息
  for(var key in cmd.params){ 
      if(key=='LightStatus'){ //判断是否设置的是LightSwitch属性
          console.log('set property ',key);
      //示例代码将云端设置的属性在本地进行保存,实际产品开发时需要修改为去将灯打开或者关闭
          lightState = cmd.params.LightSwitch; 
      //本地设置完毕之后,将更新后的状态报告给云端。
      //注意:云端下发命令后,云端属性的值并不会改变,云端需要等待来自设备端的属性上报
          device.postProps({'LightSwitch': lightState});
      }
  }
})

然后使用node运行以上代码就可以了
在这里插入图片描述
说明连接已经建立,设备的数据已经可以发送到指定的topic中,也可以通过物联网平台来给设备指定的topic发送数据,这样设备就可以接受到平台发送的数据。
设备接入阿里云物联网平台——Nodejs SDK_第6张图片
设备接入阿里云物联网平台——Nodejs SDK_第7张图片
在这里插入图片描述

通过MQTT Topic与平台进行通信

消息发布

device.publish(Topic,message) # 将message发送到指定的Topic
Qos表示mqtt服务的质量
QOS0::至少0次,大白话就是只管发,不管收。
QOS1::至少1次。一般场景够用,可能会造成一条数据接收多次
QOS2: 刚好1次(这个是很多书、资料上的说法,其实这里更准确的说法应当是 “保证相同的消息只接收一条”)。
要保证产品有指定的topic,并且topic有publish权限

//To publish a message with QoS 0
device.publish(’///user/update’, ‘hello world!’);
//To publish a message with QoS 1
device.publish(’///user/update’, ‘hello world!’,{qos:1});
//To publish a Buffer
device.publish(’///user/update’, new Buffer([0,1,2,3,4]));

消息订阅

device.subscribe(Topic)订阅指定topic的消息
确保产品具有相应的topic,并且topic具有subscribe权限。

//订阅指定topic
device.subscribe(’///user/get’);
//device.subscribe(’///user/get’,{qos:1});
//接收到数据时将topic以及消息打印出来
device.on(‘message’, (topic, payload) => {
console.log(topic, payload.toString());
});

const iot = require('alibabacloud-iot-device-sdk');

// init device and connect linkplatform
const device = iot.device({
  "ProductKey": "************",
  "DeviceName": "************",
  "DeviceSecret": "************"
});




device.on('message', (topic, payload) => {
  console.log('topic:',topic);
  if(payload){
    console.log('payload',payload.toString());
  }
});

device.on('connect', () => {
  console.log('>>>>>connect');
  device.subscribe('/a1NeIV5y2Cl/testdevice1/user/get');
  setInterval(()=>{
    device.publish('/a1NeIV5y2Cl/testdevice1/user/update', "hello");
  },2000) //每隔两秒发布一次消息
  device.subscribe('/a1NeIV5y2Cl/testdevice1/user/update')
});

设备接入阿里云物联网平台——Nodejs SDK_第8张图片

物模型开发

物模型的开发方式让设备不用关心如何去订阅MQTT topic,而是调用物模型相关的接口来实现属性上报、服务监听、事件上报。

设备属性的上报

device.postProps(params,(res))
params:属性参数,object类型
res:服务端reply消息内容

const iot = require('alibabacloud-iot-device-sdk');

let count = 0;
const device = iot.device({
  "ProductKey": "************",
  "DeviceName": "************",
  "DeviceSecret": "************"
});
device.on('connect', () => {
  console.log('>>>>>connect');
  // setInterval(() => {
  //   device.postProps({
  //     state: count++%2
  //   }, (res) => {
  //     console.log(`postProps:`,res);
  //   });
  // }, 10000);
//设备属性的上报
  device.postProps({
    LightSwitch: 0
  }, (res) => {
    console.log(`postProps:>>>>>>>>>>`,res);
  });
});

设备接入阿里云物联网平台——Nodejs SDK_第9张图片
设备接入阿里云物联网平台——Nodejs SDK_第10张图片

设备属性的设置

设备属性的设置不能直接从云平台进行设置,需要使用阿里云平台提供的云端SDK来对设备的属性进行操作。这里我们使用的是python SDK来完成操作。
由于我们使用的Ubuntu系统自带的python2和python3,因此我们只需要执行

sudo apt-get install python-pip

就可以了。

接下来安装Iot python SDK,使用pip install 直接安装

sudo pip install aliyun-python-sdk-core
sudo pip install aliyun-python-sdk-iot

接下来需要获取阿里云提供的用户通行ID和通行密码Secret
https://usercenter.console.aliyun.com/

然后就是编写代码,使用的Demo是SetDeviceProperty
从这里获取相关Demo使用方法的示例
在这里插入图片描述
找到
在这里插入图片描述

#!/usr/bin/env python
#coding=utf-8

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkiot.request.v20180120.SetDevicePropertyRequest import SetDevicePropertyRequest
accessKeyId = '************'
accessKeySecret = '************'

client = AcsClient('************', '************', 'cn-shanghai')

request = SetDevicePropertyRequest()
request.set_accept_format('json')

request.set_Items({'deviceswitch':1})
# request.set_IotId("IotId")
request.set_DeviceName("testdevice2")
request.set_ProductKey("a1qfDPbUCyE")

response = client.do_action_with_exception(request)
# python2:  print(response) 
print(response)

执行以上代码,设备端会收到来自云端的命令cmd,但需要注意的是执行上面代码的时候设备必须为在线状态,也就是设备与平台是连接的状态才能进行设置

当通过云端python SDK对设备进行下发命令时,设备端通过onProps监听命令会收到命令cmd,格式如图:
在这里插入图片描述
需要注意的是,云端下发命令后,云端属性的值并不会改变,云端需要等待来自设备端的属性上报。

const iot = require('alibabacloud-iot-device-sdk');

let count = 0;
const device = iot.device({
  "ProductKey": "************",
  "DeviceName": "************",
  "DeviceSecret": "************"
});
device.on('connect', () => {
  console.log('>>>>>connect');
  // setInterval(() => {
  //   device.postProps({
  //     state: count++%2
  //   }, (res) => {
  //     console.log(`postProps:`,res);
  //   });
  // }, 10000);
//设备属性的上报
  device.postProps({
    deviceswitch: 0
  }, (res) => {
    console.log(`postProps:>>>>>>>>>>`,res);
  });
});

// 监听云端设置属性服务消息,示例代码为一个灯
device.onProps((cmd)=>{
  console.log('>>>onProps',cmd); //打印完整的属性设置消息
  for(var key in cmd.params){ 
      if(key=='deviceswitch'){ //判断是否设置的是deviceswitch属性
          console.log('set property ',key);
      //示例代码将云端设置的属性在本地进行保存,实际产品开发时需要修改为去将灯打开或者关闭
          deviceswitch = cmd.params.deviceswitch; 
      //本地设置完毕之后,将更新后的状态报告给云端。
      //注意:云端下发命令后,云端属性的值并不会改变,云端需要等待来自设备端的属性上报
          device.postProps({'deviceswitch': deviceswitch});
      }
  }
})

设备接入阿里云物联网平台——Nodejs SDK_第11张图片
设备接入阿里云物联网平台——Nodejs SDK_第12张图片
下一篇博客中有接下来的一些操作

你可能感兴趣的:(设备接入阿里云物联网平台——Nodejs SDK)