树莓派上云 — 连接阿里云物联网平台

阿里云物联网平台可以为设备提供可靠的通信能力,更加方便的支持设备采集数据并存储在云端,同时也提供了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

第三步:下载sdk

点击“下载Linux工具包”,将文件传到树莓派上。然后进行下一步。

第四步:配置和测试sdk

按照第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)

如果博客对您有帮助,请给我 赞助


热度:5,833℃

树莓派上云 — 连接阿里云物联网平台》有6个想法

  1. 老师,您的课程很棒!能不能继续讲讲,如何才能用阿里云控制树莓派上的小灯?

  2. 我看了https://www.tujing.site/3655按照你的手顺配好了,但是有个问题,你修改的从设备上报数据的代码里面的(“/sys/class/thermal/thermal_zone0/temp”)是从哪里来的呢?
    这段代码怎么改能够在Ubuntu环境下跑起来?

  3. 你好,我想问下图2的那个二次开发的页面是如何实现的,2次开发的后台用的是PHP还是Java,实现这个功能是否要买一个云服务器,还有一些云端开发的问题想问一下你,还望指点迷津。

  4. 今天刷B站看到你的代码,经过测试,目前已经运行成功,载体为树莓派4B,目前数据上报正常,但是这个占用CPU较高,有其他解决方案吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注