使用中国移动ONENET平台实现树莓派信息自动上报

updated 2019/7/15 前两天onenet做了升级,API未向前兼容,重新写了脚本。同时之前的ip138获取公网IP的功能因对方屏蔽,更换为sohu

最近领导安排我参加重庆物联网项目,为了熟悉情况,业余时间做了一个简单的“物联网”设备信息管理功能。

大致的流程是:树莓派上Python脚本用crontab每隔5分钟采集一次CPU信息和内存信息,并通过onenet的数据上报接口上报到onenet平台,再在onenet平台配置触发器,目前配置的是CPU使用率超过50%则发送一封告警邮件。

onenet平台目前是免费的,注册开发者账号后还需要做的事情包括:注册一个产品,注册好产品后平台会分配一个API-KEY。然后在这个产品下注册一个设备,注册好设备后平台会分配一个设备ID。这样就可以进行信息上报了。

树莓派部分:首先需要写一个Python脚本,脚本做2件事情,1是采集CPU和内存的信息,2是将这些信息通过接口上报到onenet平台。

脚本如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import psutil
import requests
import socket
import re

'''
    采集树莓派cpu和内存信息上报到ONENET设备管理平台(HTTP)
'''


# 获取内存信息
def get_memory_info():
    memory_info = {}
    mem = psutil.virtual_memory()
    memory_info['mem_total'] = round(float(mem.total) / 1000000000, 3)
    memory_info['mem_free'] = round(float(mem.free) / 1000000000, 3)
    memory_info['mem_usage_percent'] = int(round(mem.percent))
    return memory_info


# 获取CPU信息
def get_cpu_usage_percent():
    cpu_usage_percent = psutil.cpu_percent(interval=1)
    return cpu_usage_percent


# 获取内网IP
def get_intranet_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip


# 获取公网IP
def get_internet_ip():
    url = urllib.request.urlopen("http://txt.go.sohu.com/ip/soip")
    text = url.read()
    ip = re.findall(r'\d+.\d+.\d+.\d+', text.decode("UTF-8"))
    return ip[0]


def send_to_iot_platform(memory_info):
    # 信息上报到'ONENET'平台
    url = "http://api.heclouds.com/devices/25700221/datapoints"
    params = {
        "datastreams": [
            {
                "id": "pi_info",
                "datapoints": [
                    {
                        "at": "",
                        "value": {
                            "CPUUsage": get_cpu_usage_percent(),
                            "IntranetIP": get_intranet_ip(),
                            "InternetIP": get_internet_ip(),
                            "MemoryFree": memory_info['mem_free'],
                            "MemoryTotal": memory_info['mem_total'],
                            "MemoryUsage": memory_info['mem_usage_percent']
                        }
                    }
                ]
            }
        ]
    }
    headers = {
        "api-key": "这里填写分配的api-key",
        "Content-type": "application/json"
    }
    response = requests.post(url, json=params, headers=headers)
    return response.text


def main():
    memory_info = get_memory_info()
    print('Memory Total(G):', memory_info['mem_total'])
    print('Memory Free(G):', memory_info['mem_free'])
    print('Memory Usage Percent(%):', memory_info['mem_usage_percent'])
    print('CPU Usage Percent(%):', get_cpu_usage_percent())
    print('Intranet IP:', get_intranet_ip())
    print('Internet IP:', get_internet_ip())
    print("onenet resp:", send_to_iot_platform(memory_info))


if __name__ == "__main__":
    main()

脚本写好后,再在crontab中配置,每5分钟上报一次:

*/5 * * * * python /home/pi/Documents/memcpu.py >> /var/log/mycron.log

全部搞定后就可以在onenet平台上查询到上报的信息了:


1.png
2.png

最后,再配置一个触发器,CPU使用率超过10%时发送邮件告警。

3.png

好了,试一下是否可以正常通过触发器来发送邮件吧。

首先写一个死循环让CPU飙高一点。

while True:
            print("123")

果然收到邮件:


4.png

也可以通过onenet的图标看出这段时间内CPU飙升的情况:

5.png

目前场景比较简单,主要上报的指标有:CPU使用率,内存使用率,内存大小,内存空闲大小,内网IP,公网IP。目前其实就内网IP这个有用一点,在DHCP环境下经常无法快速知道给PI分配了哪个IP。

复杂一点么可以做个机房温度传感器,买个树莓派的温度传感器,然后同样用python将机房温度上报给onenet平台,当温度超过某个指标后自动告警。

onenet也支持开发web或者wap应用,用于展现数据。也提供了一个快速开发模板,因此也做了一个简单的H5 APP:

链接 点击这里

样例如下:

6.png

最后来个树莓派3在安静地工作中的图 XD

7.jpg

你可能感兴趣的:(使用中国移动ONENET平台实现树莓派信息自动上报)