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平台上查询到上报的信息了:
最后,再配置一个触发器,CPU使用率超过10%时发送邮件告警。
好了,试一下是否可以正常通过触发器来发送邮件吧。
首先写一个死循环让CPU飙高一点。
while True:
print("123")
果然收到邮件:
也可以通过onenet的图标看出这段时间内CPU飙升的情况:
目前场景比较简单,主要上报的指标有:CPU使用率,内存使用率,内存大小,内存空闲大小,内网IP,公网IP。目前其实就内网IP这个有用一点,在DHCP环境下经常无法快速知道给PI分配了哪个IP。
复杂一点么可以做个机房温度传感器,买个树莓派的温度传感器,然后同样用python将机房温度上报给onenet平台,当温度超过某个指标后自动告警。
onenet也支持开发web或者wap应用,用于展现数据。也提供了一个快速开发模板,因此也做了一个简单的H5 APP:
链接 点击这里
样例如下:
最后来个树莓派3在安静地工作中的图 XD