使用Node.js控制树莓派的GPIO接口

  • 内容
  • ....
  • 相关

在本文中,我们将学习如何使用Node.js和socket.io利用web服务器控制树莓派上的GPIO 接口。通过在web页面上创建开关按钮来远程控制连接到树莓派上的LED 的打开或关闭 。

Node.js

Node.js 是一个 基于Google的V8引擎JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。 使用它可以方便地构建快速,可扩展的网络应用程序的平台。

socket.io

Socket.io是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化。

创建前的准备

在创建web服务器之前,我们必须为树莓派安装一些必须的支持包。

安装Node.js

一、第一件事就是更新树莓派,通过以下命令将已安装的包更新到最新版本。

#sudo apt update

二、在Raspberry pi上安装最新版本的Node.js

#curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
#sudo apt install -y nodejs

三、检查Node.js是否已成功安装,请输入以下命令,该命令将显示Node.js的版本。

node -v

安装 onoff 模块

使用 Node.js 控制树莓派的GPIO引脚,还需要安装“ onoff ”模块。使用以下命令来安装它。

#npm install onoff

安装socket.io

现在安装 Node.js 的 web socket 模块,这样我们就可以从网页上控制Raspberry Pi的GPIO 接口了。

#npm install socket.io --save

创建Web服务器和HTML文件

我们已经安装了所有必需的包,现在可以创建web服务器和html文件了。这些文件应该放在同一个目录中(最好是用英文字符目录)。

Index.html

首先创建一个html文件,通过键入 #nano index.html 命令来创建一个名为index.html文件,并粘贴以下代码。

<!DOCTYPE html>
<html lang="zh-CN">  
<head>
  <meta http-equiv="content-type" content="text/html" charset="UTF-8">
  <title>树莓派 GPIO 控制</title>
</head>
<body>
    <h2>Control GPIO 4</h2>
    <button type="button" id="state" onclick="LEDOn()" style="background-color:green;"> 打开 </button>
    <button type="button" id="state" onclick="LEDOff()" style="background-color:red;"> 关闭 </button>
    <script src="https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js"></script>
    <script>
        var socket = io.connect(); //load socket.io-client and connect to the host
        function LEDOn() {
            socket.emit("state", 1); //发送 button 开的状态
        }

        function LEDOff() {
            socket.emit("state", 0); //发送 button 关的状态
        }
    </script>

</html>
</body>
</html>

连接LED到树莓派

按下图所示将LED连接到树莓派 GPIO 4 ,中间跨接220欧电阻。

将LED连接到树莓派 GPIO 4 ,中间跨接220欧电阻

创建Web服务器

现在让我们创建一个web服务器! Node.js文件将打开请求并返回文件的内容,如果出现错误,它将返回404。

#nano webserver.js

粘贴如下代码:

var Gpio = require('onoff').Gpio; //require onoff to control GPIO
var LEDPin = new Gpio(4, 'out'); //declare GPIO4 an output
var fs = require('fs'); //require filesystem to read html files
var http = require('http').createServer(function handler(req, res) { //create server
  fs.readFile(__dirname + '/index.html', function (err, data) { //read html file
    if (err) {
      res.writeHead(500);
      return res.end('Error loading socket.io.html');
    }

    res.writeHead(200);
    res.end(data);
  });
});

var io = require('socket.io')(http) //require socket.io module and pass the http object

http.listen(8080); //listen to port 8080

io.sockets.on('connection', function (socket) {// WebSocket Connection
  var buttonState = 0; //variable to store button state

  socket.on('state', function (data) { //get button state from client
    buttonState = data;
    if (buttonState != LEDPin.readSync()) { //Change LED state if button state is changed
      LEDPin.writeSync(buttonState); //turn LED on or off
    }
  });
});

这样我们就成功创建了web服务器和HTML文件,现在可以运行web服务器并通过WEB页面控制Raspberry Pi的GPIO 接口了。

在命令终端输入以下命令启动web服务器:

#node webserver.js

然后打开浏览器,使用 树莓派的IP地址:8080 打开网页。在本文中,树莓派的IP地址是192.168.100.10,因此浏览器键入 :192.168.100.10:8080。这样应该会在浏览器上看到两个按钮“打开”和“关闭”,当按下它们时,连接到树莓派的GPIO4的LED也会相应的打开或关闭。