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