阿里云物联网平台可以为设备提供可靠的通信能力,更加方便的支持设备采集数据并存储在云端,同时也提供了API,实现设备的远程控制功能。今天以树莓派为例,将树莓派连接到阿里云的物联网平台上,将树莓派的cpu 、gpu温度,开机时间,内存使用情况、硬盘使用情况,系统负载等信息上传到云端,实现对系统的远程监控。以下是上云的教程。
开始之前先看下效果,这是树莓派上云后我做的系统状态监控。
一、阿里云物联网平台介绍
从阿里云物联网平台文档可以看到,其平台“为设备提供安全可靠的连接通信能力,向下连接海量设备,支撑设备数据采集上云;向上提供云端API,服务端通过调用云端API将指令下发至设备端,实现远程控制。”
平台具有以下功能:
1.设备接入:物联网平台支持海量设备连接上云,设备与云端通过IoT Hub进行稳定可靠地双向通信。其提供2G/ 3G /4G、NB-IoT、LoRaWAN、WiFi等不同网络设备接入方案和MQTT、CoAP、HTTP/S等多种协议的设备端SDK,可以比较快速方便的上云。
2.设备管理:提供完整的设备生命周期管理功能,支持设备注册、功能定义、数据解析、在线调试、远程配置、固件升级、远程维护、实时监控、分组管理、设备删除等功能。
3.安全能力:阿里云物联网平台提供身份认证和通信安全等多重防护,有效保障设备和云端数据的安全。
4.规则引擎:物联网平台规则引擎包含服务端订阅、云产品流转和场景联动功能。
二、快速连接设备
在物联网平台上选择设备快速接入,即可打开如下界面。
在这个界面,快速连接设备引导将通过4个步骤,来帮助我们快速的连接设备到阿里云物联网平台。
接下来按照步骤进行,填写产品和设备的信息。
因为开发的设备是树莓派,所以我们选择设备平台是linux,然后选择的协议是MQTT,设备开发工具有三种选择,node.js、Java、嵌入式c,这里我选择的是node.js,因为其他的两个开发工具包需要比较复杂的工具包。
当然,选择Node.js的前提是在树莓派上已经安装该环境,可以用这两个命令查看是否安装Node.js环境。
pi@raspberrypi:~ $ node -v
v12.14.1
pi@raspberrypi:~ $ npm -v
6.13.4
如果没有安装,则要通过这篇文章安装在树莓派上安装最新版Nodejs
点击“下载Linux工具包”,将文件传到树莓派上。然后进行下一步。
按照第4步的要求,解压工具包,并在树莓派上运行./start.sh文件,就可以在云端看到树莓派上报的数据,初步的连接完成。
连接成功以后,可以看到树莓派已将在上报数据,不过上报的数据是不变的,是预设好的,我们通过更改功能定义和修改上报代码,可以实现我们想要的功能。
三、上报树莓派的状态信息
我们接下来进行设置,使得树莓派上报我们需要的数据。
1.增加功能定义。
一个上报的数据就是一个功能,比如我们想要让树莓派将CPU的温度上传到云端,这时就要增加一个温度的功能定义。
增加功能定义可以选择标准功能和自定义功能,如果我们要添加的功能在标准功能中没有,可以在自定义功能中进行添加。
这里因为要监控树莓派的系统状态,所以选择了8个功能,分别是树莓派运行时间,空余内存,已用内存,内存使用率,CPU温度,系统1、5、15分钟的平均负责。
这里上报CPU温度选择的是标准功能,其余的都是自定义功能,添加好之后的功能定义是这样的。
2.发布功能
产品功能定义完成后,要将其发布。
3.修改上报代码
在树莓派本地打开index.js 文件,修改程序代码,使得按照要求上报数据到云顿。我修改之后的代码如下,大家可以进行参考。
const aliyunIot = require('aliyun-iot-device-sdk');
const deviceConfig = require('./device_id_password.json');
const device = aliyunIot.device(deviceConfig);
const fs = require("fs");
const os = require("os");
device.on('connect', () => {
console.log('Connect successfully!');
console.log('Post properties every 5 seconds...');
setInterval(() => {
var temp;
temp = fs.readFileSync("/sys/class/thermal/thermal_zone0/temp");
temp = temp.toString() / 1000 ;
var memusage;
var usedmem = (os.totalmem() - os.freemem())/1024/1024;
var freemem = os.freemem()/1024/1024;
memusage = (os.totalmem() - os.freemem()) * 100 / os.totalmem();
var uptime = os.uptime();
var valtime = 0;
if(uptime< 60){
valtime = uptime + "秒";
}else if(uptime >= 60 && uptime < 3600){
valtime = (uptime /60 ) .toFixed(1)+ "分钟";
}else if(uptime >= 3600 && uptime < 86400){
valtime = (uptime /3600).toFixed(1)+ "小时";
}else{
valtime = (uptime /86400).toFixed(1) + "天";
}
var loadavg = [];
var loadavg_1;
var loadavg_5;
var loadavg_15;
loadavg = os.loadavg();
loadavg_1 = loadavg[0];
loadavg_5 = loadavg[1];
loadavg_15 = loadavg[2];
const params = {
CurrentTemperature: temp ,
UpTime: valtime ,
FreeMem: freemem,
UsedMem: usedmem,
MemoryUsage: memusage,
LoadAvg_1: loadavg_1,
LoadAvg_5: loadavg_5,
LoadAvg_15:loadavg_15
};
console.log(`Post properties: ${JSON.stringify(params)}`);
device.postProps(params);
}, 5000);
device.serve('property/set', (data) => {
console.log('Received a message: ', JSON.stringify(data));
});
});
device.on('error', err => {
console.error(err);
});
修改之后保存,然后运行 ./start.sh 文件,即可看到树莓派成功上报数据的显示。
之后打开阿里云物联网平台的设备管理页面,就可以看到上报的数据了。
老师,您的课程很棒!能不能继续讲讲,如何才能用阿里云控制树莓派上的小灯?
好的,以后会出这类教程的
我看了https://www.tujing.site/3655按照你的手顺配好了,但是有个问题,你修改的从设备上报数据的代码里面的(“/sys/class/thermal/thermal_zone0/temp”)是从哪里来的呢?
这段代码怎么改能够在Ubuntu环境下跑起来?
你好,我想问下图2的那个二次开发的页面是如何实现的,2次开发的后台用的是PHP还是Java,实现这个功能是否要买一个云服务器,还有一些云端开发的问题想问一下你,还望指点迷津。
监控树莓派运行状态可以用 Pi Dashboard
https://make.quwj.com/project/10
今天刷B站看到你的代码,经过测试,目前已经运行成功,载体为树莓派4B,目前数据上报正常,但是这个占用CPU较高,有其他解决方案吗?