Raspberry PI服务器 - GPIO端口状态JSON响应

时间:2015-08-10 10:51:30

标签: json node.js raspberry-pi

我挣扎了几天。问题很简单,有没有办法在Raspberry PI上创建一个服务器,它将返回JSON格式的GPIO端口的当前状态?

示例:

Http://192.168.1.109:3000/led

{
  "Name": "green led",
  "Status": "on"
}

我发现Adafruit gpio-stream library很有用,但不知道如何将数据发送到JSON格式。

谢谢

2 个答案:

答案 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);