我有一个连接到树莓派的门传感器,目标是让 Node 脚本在门打开时向我的外部 API 服务器发出 POST 请求,并在门关闭后发出另一个 POST 请求。
逻辑是让下面的 python 脚本在我的 Pi 上运行,定期检查门是打开还是关闭。我的 python 脚本运行成功,检查门是打开还是关闭;但是,它只检查状态 1 次。
下面的 Node 脚本也工作正常,它使用 python 脚本的输出发出 POST 请求。
问:如何修改以下脚本,以便在门打开后向我的服务器发送 POST 请求,并在门关闭后向我的服务器发送另一个请求。
我的第一个想法是使用Node Events & EventEmitter功能,但我不确定它的实现。此外,我假设 python 脚本必须不断轮询门;所以在这里,可以使用 while 循环吗?
door.py
import time
import RPi.GPIO as io
io.setmode(io.BCM)
door_pin = 23
io.setup(door_pin, io.IN, pull_up_down=io.PUD_UP)
if io.input(door_pin):
print("Door Opened")
else:
print("Door Closed")
门.js
var exec = require('child_process').exec;
var rest = require('restler');
// String that will be sent to the command line, generating the door status
var doorCommand = "sudo python door.py"
exec(doorCommand, function cb(error, stdout, stderr){
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null){
console.log('exec error: ' + error);
}
var doorStatus = stdout; // stdout shows if the door is opened or closed
// Creates the door status POST request to the Rails server
rest.post('http://192.168.6.109:3000/door/save', {
data: {
door: doorStatus
}
}).on('complete', function(data, response){
console.log('door status code: ' + response.statusCode);
});
});
你走在正确的轨道上。我建议使用 Node.js 模块(如 pi-gpio)直接读取 GPIO 端口,而不是调用 Python 脚本。然后,您将在 Node.js 中使用 setInterval 调用来重复检查门状态,并在状态更改时调用您的 POST。希望这有帮助。