/** * 树莓派状态 JSON 数据接口 */ require('dotenv').config() const fs = require('fs') const http = require('http') const hostname = require('os').hostname() const exec = require('child_process').exec const MEMINFO_FILE_PATH = '/proc/meminfo' const TEMPERATURE_FILE_PATH = '/sys/class/thermal/thermal_zone0/temp' const server = http.createServer(function (request, response) { response.setHeader('Access-Control-Allow-Origin', '*') response.setHeader('Access-Control-Allow-Methods', 'HEAD,GET,POST,OPTIONS,PATCH,PUT,DELETE') response.setHeader('Access-Control-Allow-Headers', 'Origin,X-Requested-With,Authorization,Content-Type,Accept,Z-Key') response.setHeader('Content-Type', 'application/json') try { const temp_string = fs.readFileSync(TEMPERATURE_FILE_PATH) const meminfo_string = String(fs.readFileSync(MEMINFO_FILE_PATH)) const meminfo_total = meminfo_string.match(/MemTotal\:\s+(\d+) kB/) const meminfo_available = meminfo_string.match(/MemAvailable\:\s+(\d+) kB/) const result = { hostname, cpu: { temperature: Number((temp_string / 1000).toFixed(3)), }, memory: { total: Number((meminfo_total[1] / 1024).toFixed(2)), available: Number((meminfo_available[1] / 1024).toFixed(2)) }, } exec("cat /proc/stat |grep cpu |tail -1|awk '{print ($5*100)/($2+$3+$4+$5+$6+$7+$8+$9+$10)}'|awk '{print 100 - $1}'", (err, stdout, stderr) => { result.cpu.load = Number((stdout / 100).toFixed(4)) response.end(JSON.stringify(result)) }) } catch (error) { response.statusCode = 500 response.end(JSON.stringify({ error })) } }) const port = process.env.PORT || 3000 const host = process.env.HOST || 'localhost' server.listen(port, host, () => console.log(`rpi status http server running at http://${host}:${port}`))