1、首先从官网下载编译好的nodejs
https://nodejs.org/en/
选择符合自己电脑配置的安装
2、解压文件并将其转移到创建好的目录中
tar xvf node-v12.18.1-linux-x64.tar.xz
mv node-v12.18.1-linux-x64 指定目录
然后运行source .bashrc,重新加载配置文件,就可以在环境变量中看到如图
4、测试
输入node -v和npm -v,查看是否安装成功
到这里nodejs就安装成功了
首先创建一个目录用来存放nodejs项目,我的是~/gateway
然后进入到目录执行npm init,初始化node项目,会生成package.json文件用来记录项目的详细信息。执行npm init之后会让输入一些项目的信息,可以根据自己的需要填写,也可以直接enter,信息后期也是可以修改的
2、进入项目所在目录,安装SDK
这样就已经安装成功,接下来就可以进行连接物联网平台了
这里使用的是一机一密的认证方式,比较简单。
这里对产品和设备的创建和设置不做详细解释,具体可以查看阿里云的官方文档中的操作。
// 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发送数据,这样设备就可以接受到平台发送的数据。
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')
});
物模型的开发方式让设备不用关心如何去订阅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);
});
});
设备属性的设置不能直接从云平台进行设置,需要使用阿里云平台提供的云端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});
}
}
})