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

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

效果如下:

 未启动
 

首先是后端:
安装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 modules
const fs = require('fs')
const http = require('http')
let temp

//read CPU temperature every second
setInterval(() => {
  temp = fs.readFileSync('/sys/class/thermal/thermal_zone0/temp')//这个接口不仅树莓派能用,AMD64物理机也能用
}, 1000)

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

另存为temp.js,并执行

node temp.js

如需后台运行,则执行

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

然后是前端:


setInterval(function(){
jQuery.getJSON("https://blog.urusai.me/api/pi", function(json) {
var divTempnum = document.getElementById('tempnum');
divTempnum.innerHTML = " " + json.temp + "℃";
})
},5000)

我的博客使用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配置文件即可。

发表评论

发表评论

*

three + 1 =