我正在一个带有网络界面的鸡舍中开发温度监控应用程序 . 我用了两个arduinos和一个覆盆子 .
Arduino 1 :我连接了温度/湿度传感器和RF433Mhz变送器 .
Arduino 2 :RF433Mhz接收器已连接到它 . 它从 Arduino 1 接收数据 .
Raspberry : Arduino 2 连接到我的覆盆子,它读取串行监视器中收到的数据,并通过 websockets (包装 ws of nodejs)将它们发送到网页 .
起初我想直接用Nodejs读取这些数据,但是我在安装串口包时遇到了一些问题 .
所以我改变了我的方法:我用python读取串行监视器中的数据,将其写入文件,Nodejs读取这些文件并将数据发送到网页 .
这是我使用的两个代码:
Phyton script
import serial
import time
ser = serial.Serial('/dev/ttyACM0', 9600)
while True:
data = ser.readline()
if data:
t = data[0:2]
h = data[6:8]
#decode utf-8
tc = t.decode("utf-8")
hc = h.decode("utf-8")
#write the temperature in the temp file
fileTc=open('temp', 'w')
fileTc.write(str(tc))
fileTc.close
#write the humidity in the hum file
fileHc=open('hum', 'w')
fileHc.write(str(hc))
fileHc.close
#sleep
time.sleep(.1)
Nodejs Script
var express = require("express");
const WebSocket = require('ws');
const wss = new WebSocket.Server({port: 4400});
var path = require("path");
var fs = require("fs");
var sys = require("util");
var exec = require("child_process").exec;
var tempcpu = 0;
var temp = 0;
var hum = 0;
var app = express();
app.set("port", process.env.PORT || 5500);
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "ejs");
app.use('/', express.static('public'));
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
setInterval(function(){
child1 = exec("cat /sys/class/thermal/thermal_zone0/temp",
function(error, stdout,stderr){
if (error !== null){
console.log('exec error: ' +error);
} else{
tempcpu = parseFloat(stdout)/1000;
}
});
child2 = exec("cat temp", function(error, stdout,stderr){
if (error !== null){
console.log('exec error: ' +error);
} else{
temp = parseFloat(stdout);
}
});
child3 = exec("cat hum", function(error, stdout,stderr){
if (error !== null){
console.log('exec error: ' +error);
} else{
hum = parseFloat(stdout);
}
});
var tempCPU = JSON.stringify(["cpu",tempcpu]);
var temperature = JSON.stringify(["temp",temp]);
var humidity = JSON.stringify(["hum",hum]);
ws.send(tempCPU);
ws.send(temperature);
ws.send(humidity);
}, 5000);
});
app.get("/", function(request, response) {
response.render("dashboard");
});
app.listen(app.get("port"), function() {
console.log("Server started at port " + app.get("port"));
});
现在我必须单独启动两个脚本 . 我想在启动节点服务器时直接从nodejs运行我的python脚本,并在停止我的nodejs代码(CTRL C)时停止它 .
你知道怎么做吗?
1 回答
你想要实现的是产生一个新的过程,你可以从Node应用程序或Python应用程序执行:
NodeJS方法:Child process
Python方法:Subprocess
EDIT
关于捕获INTERRUPT(CTRL C)信号,这也可以用两种语言完成;并利用来杀死你产生的过程:
使用NodeJS:
使用Python: