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

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

效果如下:

 Loading…

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

首先是后端:
(树莓派)安装nodejs,编写nodejs脚本如下(如果你的nodejs版本较新,请使用let和const代替var):


//引入fs和HTTP模块
var fs=require("fs");
var http = require('http');
//声明全局变量temp
var temp;
//每秒读取一次CPU温度文件
//同理可以调用gpio信息
setInterval(function() {temp = fs.readFileSync("/sys/class/thermal/thermal_zone0/temp");},1000);
//创建http服务器
var server = http.createServer(function (request, response, next) {
//写入响应头
response.writeHead(200, {
//设置内容类型字段为json,编码为utf-8
'Content-Type': 'application/json;charset="utf-8"',
//设置CORS字段为允许所有域名,防止跨域问题
'Access-Control-Allow-Origin': '*'
});
//声明json对象info
var info = {
temp : temp/1000 + "℃",
//request.headers对象对应请求头,请求头关键字对应相应的对象名(一切皆为对象)
//比如gzip对应对象为request.headers.gzip
//对象有两种读取方式,不含符号的使用obj.key或obj["key"],含符号的使用obj["key-1"]
ip : request.headers['x-forwarded-for'],
};
//将json对象info转换为字符串,并使用.end()方法输出
response.end(JSON.stringify(info));
});
//监听端口,如需监听特定ip,在端口后应英文逗号隔开,再输入以单引号或双引号包围的ip地址
server.listen(8080);

另存为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配置文件即可。

发表评论

发表评论

*

four + 5 =