/** * 树莓派状态 JSON 数据接口 */ require('dotenv').config() const fs = require('fs') const http = require('http') const exec = require('child_process').exec const port = process.env.PORT || 3000 const host = process.env.HOST || 'localhost' const hostname = require('os').hostname() const MEMINFO_FILE_PATH = '/proc/meminfo' const TEMPERATURE_FILE_PATH = '/sys/class/thermal/thermal_zone0/temp' const status = { hostname, cpu: { temperature: 0, load: 0 }, memory: { total: 0, available: 0 }, error: null } const server = http.createServer(function (request, response) { // 如无必要,允许来自任意域名的跨域请求,只需要 `Access-Control-Allow-Origin:*` 一条就行了。 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') response.end(JSON.stringify(status)) }) server.listen(port, host, () => console.log(`rpi status http server is running at http://${host}:${port}`)) const io = require('socket.io')(server, { cors: { origin: "*" } }) setInterval(() => { update_status() }, 1000) function update_status() { try { 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/) status.memory.total = Number(meminfo_total[1] * 1024) status.memory.available = Number(meminfo_available[1] * 1024) status.cpu.temperature = Number(fs.readFileSync(TEMPERATURE_FILE_PATH) / 1000) 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) => { status.cpu.load = Number(stdout) status.error = null io.emit('status', status) }) } catch (error) { status.error = error io.emit('status', status) } }