用nodejs编写树莓派信息接口及调用

用nodejs创建http服务,以json方式输出服务器信息,用于前端展示。

效果如下:

 未启动…

状态:加载中……
访客UA:加载中……

首先是后端:
(树莓派)安装nodejs,编写nodejs脚本如下(已作为扩展模块提交到xprober:https://github.com/kmvan/x-prober/blob/master/extensions/temperature-sensors/raspberrypi.js):


/**
 * Raspberry PI Series (Linux) Temperature CPU
 *
 * @usage `node ./raspberrypi.js`
 */
 
//import sf and http 
const fs = require('fs')
const http = require('http')
let

//read CPU temperature every second setInterval(() => {
temp = fs.readFileSync('/sys/class/thermal/thermal_zone0/temp')

}, 1000)

//creat http
const server =
http.createServer((request, response) => {
//write response
response.writeHead(200, {
//defining document type then charset "utf-8"
'Content-Type':
/json;charset="utf-8"',
//
'Access-Control-Allow-Origin': '*',
})
const items = [
{
id: 'cpu',
name: 'CPU',
celsius: temp / 1000,
},
]
//transform object into string, and output with .end()
response.end(JSON.stringify(items)) })
//listen port and IP
server.listen(4096, '127.0.0.1')

另存为temp.js,并执行

node temp.js

如需后台运行,则执行

nohup node temp.js >/dev/null 2>log &

然后是前端:


<span id="temp">当前树莓派温度:加载中……</span>
<span id="ip">当前访客IP:加载中……</span>
<!--使用getJSON跨域读取json接口,需引入jq库-->
<script
src="http://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
<script>
//定时循环执行函数
setInterval(function(){
//使用getJSON读取接口,建议将json接口放到与主域名相同的域名下,否则将有跨域问题
jQuery.getJSON("json接口地址", function(json) {
//DOM操作span#temp和span#ip,从内存中修改这两个标签的文本内容
var spanTemp = document.getElementById('temp');
var spanIp = document.getElementById('ip');
spanTemp.innerHTML = "当前树莓派温度:" + json.temp;
spanIp.innerHTML = "当前访客IP:" + json.ip;
})
//定时器设置为2000毫秒
},2000)
</script>

我的博客使用https连接,如果直接调用基于http的api,会报mixed-content。我这边树莓派的node.js环境好像有点问题,创建https服务器后浏览器无法握手,说是两端没有共用的加密方式(似乎node使用了ssl3.0进行通讯,但我在程序中排除了ssl3.0、tls1.0和1.1后仍然无法握手),于是我用apache把8080端口反代到blog.urusai.me/api/pi,并且套了一层tls。
具体配置文件如下:


<proxy http://127.0.0.1:8080>
AllowOverride None
Order Deny,Allow
Allow from all
</proxy>
<Location /api/pi>
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
</Location>

将其加入虚拟主机配置文件的

<VirtualHost *:443></VirtualHost>

标签之间。
例如我的配置文件是

/安装目录/conf/vhost/blog.urusai.me.conf

注意,如果除了用于反代node程序的apache/nginx以外还使用了其它反代,想透过反代获取客户端的真实ip就必须使用请求头中的x-forwarded-for等关键字,apache2可以使用mod_remoteip模块实现x-forwarded-for的传送与改写。apache2.2需要自行安装后在httpd.conf中Include该模块的配置文件(apxs安装的模块通常位于与httpd.conf相同目录下的extra目录),2.4已内置该模块,Include配置文件即可。

发表评论

发表评论

*

5 × = twenty