From 4c16540bf1103c418f9c1e903c3ded415c34f9d3 Mon Sep 17 00:00:00 2001 From: Zhao Xin <7176466@qq.com> Date: Sun, 4 Sep 2022 14:26:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- package-lock.json | 32 ++++++++++++++++++++++++++++++++ package.json | 20 ++++++++++++++++++++ server.js | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server.js diff --git a/README.md b/README.md index 07efdeb..dbf2324 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ -# rpi_status_http_server +# 树莓派状态 JSON 数据接口 -树莓派状态HTTP JSON数据接口 \ No newline at end of file +``` bash +npm install +npm start +``` diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5e54762 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,32 @@ +{ + "name": "rpi_status_http_server", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "rpi_status_http_server", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "dotenv": "^16.0.2" + } + }, + "node_modules/dotenv": { + "version": "16.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + } + }, + "dependencies": { + "dotenv": { + "version": "16.0.2", + "resolved": "https://mirrors.cloud.tencent.com/npm/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..98ceb0b --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "rpi_status_http_server", + "version": "0.0.1", + "description": "树莓派状态 JSON 数据接口", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "repository": { + "type": "git", + "url": "ssh://git@nas:2222/zhaoxin/rpi_status_http_server.git" + }, + "keywords": [], + "author": "Zhao Xin <7176466@qq.com>", + "license": "MIT", + "dependencies": { + "dotenv": "^16.0.2" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..04f71cc --- /dev/null +++ b/server.js @@ -0,0 +1,41 @@ +/** + * 树莓派状态 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 +server.listen(port, () => console.log(`rpi status http server running at http://localhost:${port}`);)