利用xively监控树莓派的CPU温度
前言
在RaspberryPi搭建博客后发现个问题,就是我如何能够知道RaspberryPi的一些运行信息,比如CPULoad或者温度。初步想法是利用图表形式汇总信息,然后 通过网页图表展示。该方案主要有以下几个关键点:
1.打点,将收集的信息进行打点,通常是将数据写入文件。
2.收集打点数据文件,然后分析出数据内容。
3.根据分析结果,进行画图用于展示。
而针对以上几点来看让Raspberry Pi去打点没什么问题,收集打点数据分析内容,利用分析结果画图展示这个两条如果让RaspberryPi来做的话有些浪费本地资源, 本身Raspberry Pi的资源就有限如CPU。所以如果可以将打点数据上传到第三方的服务中,让第三方分析并且画图展示岂不是更好。所以,参考了一粟同学的方案。 利用xively.com 提供的服务来进行数据收集和描点画图。
xively账户准备
1.注册账户,因为需要邮箱收取激活邮件,所以需要填写正确的邮件地址。(激活邮件到达比较慢,至少我是等了半天才收到激活邮件)
2.添加一个设备
菜单上develop, 然后点击Add Device
提交后会得到Feed ID,Feed URL,API Endpoint相关信息,后续API使用要用。
*设置API的密钥 在API Keys选择添加一个API,设置属性Read,Create,Update,Delete,标签随便命名。
到此为止你的FEED相关需要的东西经创建好了,有空的话可以看下创建成功页面下的一些示范API的连接,支持JAVA,CURL等。这里主要用CURL
xively http API
上面已经创建好了数据的FEED,剩下的就是向这个FEED里提交数据了,这里用的是CURL API详情
1.数据格式(JSON)
{
"datastreams": [
{
"id": "load",
"current_value": "9.00"
},
{
"id": "temp",
"current_value": "89.15"
}
]
}
每条线的点的数据结构是KEY-VALUE形式,其中id代表是这个点属于线的ID(自己定义有意义的名称 如Load),current_value是指这个点的VALUE。 推荐一个在线的JOSN格式化和校验工具 jsoneditoronline
2.提交数据
cosm提供了HTTP的API方式
URL: https://api.xively.com/v2/feeds/${FEED_ID}?timezone=+8
HEAD:需要增加X-ApiKey:${apiKey}
putData:上面的JSON数据
浏览器调试
利用chrome的一个插件叫Dev Http Client, 在连接地址里填入API的地址其中feed_id换成你真实的FEED_ID
如:https://api.xively.com/v2/feeds/80400859?timezone=+8
启用HEADERS 添加一个X-ApiKey 的KEY VALUE就是你的APPKEY.
BODY 处填写需要发送的JSON数据,方式选择PUT
点击发送即可,RESPONSE 处会显示200表示y成功 。如下图:
这个时候访问下 https://xively.com/feeds/80400859 这个地址就可以看到刚才PUT过去的数据就OK了代表你的API已经调试OK.
准备SHELL打点脚本
1.cpuLoad 数据收集
cat /proc/loadavg | awk '{print $2}'`
2.CPU温度 数据收集
cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}'
通过以上2条命令就可以查看当前的CPU对应的LOADE和温度,下面就需要将收集到的数据组装成cosm的API需要的JSON格式在PUT给cosm就可以了。
下面是脚本的例子:
#!/bin/bash
LOCATION='/home/pi/sysdata' #生成JSON文件路径,替换成你的路径
API_KEY='l9eHDf_fLzQx9Qfc8hCVrIan9DOSAKxrN21EOTdyL1IxST0g' #API使用的KEY,替换成你的KEY
FEED_ID='126908' #提交数据的FEED,替换成你的FEED_ID
####################################################
COSM_URL=https://api.xively.com/v2/feeds/${FEED_ID}?timezone=+8
cpu_load=cat /proc/loadavg | awk '{print $2}'
for i in 1 2 3 4 5; do
cpu_t=cat /sys/class/thermal/thermal_zone0/temp | awk '{print $1/1000}'
if [[ "${cpu_t}" =~ ^- ]]
then
cpu_t='0.0'
else
echo ${cpu_t}
break
fi
done
STR=awk 'BEGIN{printf "{\"datastreams\":[ {\"id\":\"load\",\"current_value\":\"%.2f\"}, {\"id\":\"temp\",\"current_value\":\"%.2f\"}] } ",'$cpu_load','$cpu_t'}'
echo ${cpu_t}
echo ${cpu_load}
echo ${STR}
echo ${STR} > ${LOCATION}/cosm.json
curl -s -v --request PUT --header "X-ApiKey: ${API_KEY}" --data-binary @${LOCATION}/cosm.json ${COSM_URL}
修改脚本中需要替换成你自己的三个变量LOCATION,API_KEY,FEED_ID 之后 赋予改脚本文件 755权限并且运行。
例如:该脚本名称testSys.sh
chmod 755 testSys.sh
./testSys.sh
可以看到以下结果:
将打点脚本添加到CRONTAB中
crontab -e
*/1 * * * * /home/pi/sysdata/testSys.sh>/dev/null 2>&1 & #每一分钟运行一次/home/pi/sysdata/testSys.sh
页面引入图表
在需要暂时图表的地方加入以下代码:
<img src="https://api.xively.com/v2/feeds/${FEED_ID}/datastreams/${LINE_ID}.png?width=340&height=180&colour=%23f15a24&duration=2days&title=${TITLE}&show_axis_labels=false&detailed_grid=true&scale=&timezone=8"/>
${FEED_ID}:替换成你创建FEED的ID,上个例子中就是126908
${LINE_ID}:替换成你FEED里具体LINE的ID,上个例子中就是load或者temp
${TITLE} :图表展示上的标题,可以自己按照需要命名,比如CPU的LOAD
经过以上步骤就可以将你的PI上的CPU的LOAD还有温度数据采集到放到cosm展示,其他原理类似如统计在线人数等需求都可以用这个xively的服务来实现。