我挣扎了几天。问题很简单,有没有办法在Raspberry PI上创建一个服务器,它将返回JSON格式的GPIO端口的当前状态?
示例:
Http://192.168.1.109:3000/led
{
"Name": "green led",
"Status": "on"
}
我发现Adafruit gpio-stream library
很有用,但不知道如何将数据发送到JSON格式。
谢谢
答案 0 :(得分:1)
node.js有各种gpio交互库。一个问题是您可能需要以root身份运行它才能访问gpio,除非您可以调整这些设备的读取访问权限。这应该是在最新版本的rasbian中修复的。
我最近构建了一个从运动传感器触发的node.js应用程序,以便激活屏幕(并在一段时间后停用它)。我尝试了各种gpio库,但我最终使用的是“onoff”https://www.npmjs.com/package/onoff,主要是因为它似乎使用了一种适当的方法来识别GPIO引脚上的变化(使用中断)。
现在,您说要发送数据,但是您没有指定应该如何发生。如果我们使用您希望通过HTTP使用POST请求发送数据的示例,并将JSON作为正文发送,那么这意味着您将初始化已连接的GPIO引脚,然后为它们附加事件处理程序(收听为了改变)。
更改后,您将调用http请求并从javascript对象序列化JSON(还有一些库可以处理这个问题)。您需要自己保留名称引用,因为您只按编号寻址GPIO引脚。
示例:
var GPIO = require('onoff').Gpio;
var request = require('request');
var x = new GPIO(4, 'in', 'both');
function exit() {
x.unexport();
}
x.watch(function (err, value) {
if (err) {
console.error(err);
return;
}
request({
uri: 'http://example.org/',
method: 'POST',
json: true,
body: { x: value } // This is the actual JSON data that you are sending
}, function () {
// this is the callback from when the request is finished
});
});
process.on('SIGINT', exit);
我正在使用npm模块onoff并请求。 request用于简化http请求的JSON序列化。
如您所见,我只在这里设置了一个GPIO。如果你需要跟踪多个,你必须确保将它们全部初始化,用某种名称区分它们,并记得在退出回调中取消它们。不确定如果不这样做会发生什么,但您可能会将其锁定以用于其他进程。
答案 1 :(得分:1)
谢谢,这非常有帮助。我没有表达好自己,对不起。我不想发送数据(现在)我只想输入像192.168.1.109/led这样的网址并接收json响应。这就是我现在要做的事情。我不知道这是不是正确的方法。 PLS你可以复习这个或建议更好的方法..
var http = require('http');
var url = require('url');
var Gpio = require('onoff').Gpio;
var led = new Gpio(23, 'out');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var command = url.parse(req.url).pathname.slice(1);
switch(command) {
case "on":
//led.writeSync(1);
var x = led.readSync();
res.write(JSON.stringify({ msgId: x }));
//res.end("It's ON");
res.end();
break;
case "off":
led.writeSync(0);
res.end("It's OFF");
break;
default:
res.end('Hello? yes, this is pi!');
}
}).listen(8080);