四、控制连接设备

在本章中,我们将了解如何使用我们的树莓 Pi Zero 和 Arduino UNO 从远程站点控制设备,使用以下模块在网络中进行通信:Wi-Fi 屏蔽和以太网屏蔽。我们将在本章中讨论以下主题:

  • 用 Node.js 制作一个简单的网络服务器
  • 使用 Restful API 和 Node.js 从树莓 Pi 零点控制中继
  • 将计算机中的 Node.js 配置为网络服务器
  • 使用带有 Arduino 无线网络的 Node.js 监控温度、湿度和光线
  • 使用带有 Arduino 以太网的 Node.js 监控温度、湿度和光线

用 Node.js 做一个简单的 web 服务器

拥有树莓 Pi 最重要的一个方面是我们有一台配置了服务和服务器的真实计算机。在本节中,我们将解释如何安装 Node.js,这是一个强大的框架,我们将使用它来运行我们将在本书中看到的大多数应用。幸运的是,在树莓 Pi 上安装 Node.js 真的很简单。

在本章的文件夹中,打开名为webserver.js的文件。我们将在端口 8056 上创建一个服务器。要测试程序并查看结果,我们必须在您的 MS-DOS 界面上打开 Node.js 终端,并使用以下命令运行该文件:

node webserver.js

webserver.js文件中添加以下几行来声明 HTTP 请求命令:

var http = require('http'); 

我们使用以下功能创建服务器:

http.createServer(function (req, res) { 

我们定义了将在 HTML 代码中显示的文件内容:

res.writeHead(200, {'Content-Type': 'text/plain'}); 

我们从服务器发送响应:

res.end('Hello  from Node.js'); 

定义将要打开的端口非常重要:

}).listen(8056); 

显示服务器的消息:

console.log('Server running at port 8056'); 

要测试此程序,请在本地计算机上打开浏览器,并导航到以下链接:http://192.168.1.105:8056。如果看到下面的屏幕;您的 Node.js 服务器在您的计算机上运行良好;您需要更改计算机的 IP 地址:

Making a simple web server with Node.js

使用 Restful API 和 Node.js 从树莓 Pi Zero 控制中继

在本节中,我们将向您展示如何控制连接到 Arduino UNO 板的中继模块,这是一个用于从网络浏览器发送命令的中继。开始吧。

JSON 结构

JavaScript 对象符号 (JSON) 是一种轻量级的数据交换格式。人类很容易读写。机器很容易解析和生成。它基于 JavaScript 编程语言的一个子集。

JSON 建立在两种结构上:

  • 名称/值对的集合。在各种语言中,这被实现为对象、记录、结构、字典、哈希表、键控列表或关联数组。

  • 有序的值列表。在大多数语言中,这是通过数组、向量、列表或序列来实现的。

首先,我们需要知道如何应用我们用来描述这个结构的 JSON 格式,如下所示:

{"data": "Pin D6 set to 1", "id": "1", "name": "Arduino", "connected": true}

这是我们需要遵循并做出响应的格式:

  • 数据:定义命令的编号,然后描述命令的定义
  • 名称:跟随设备名称
  • 已连接:确认设备是否已连接

{ }之间的所有数据定义了我们的 JSON 格式。

带有 aREST 应用编程接口的命令

使用像这样的aREST命令,我们可以定义我们的 Arduino 和设备,然后从网络浏览器控制它们。以下是来自aREST应用编程接口的命令示例:

  • IP_Address_of the device/mode/6/o:这将数字引脚 6 配置为输出引脚
  • IP_Address_of the device /digital/6/1:配置输出 6,使功能像数字写一样。例如:http://192.168.1.100/digital/6/1;我们定义设备的 IP 地址和将被激活的 pin 号。

在你的树莓 Pi Zero 上安装 Node.js

Node.js 是一个工具,允许我们使用 JavaScript 中的代码创建在设备中运行的服务器。最重要的是,我们将应用这个框架来使用这些代码构建一个 web 服务器。

使用 Node.js 意味着我们配置了一个 web 服务器,它将打开一个端口,设备可以连接到 web 服务器。

使用以下命令,您将在您的树莓 Pi Zero 中安装 Node.js:

sudo apt-get install nodejs

NPM 是带有 Node.js 的 JavaScript 运行时环境的默认包管理器。要配置和安装aREST模块,请在您的终端中键入以下行:

sudo npm install arest

Express 的理念是为 HTTP 服务器提供小型、健壮的工具,使其成为单页应用、网站、混合或公共 HTTP APIs 的绝佳解决方案。

我们还需要使用以下命令配置 express 模块:

sudo npm install express

使用来自网络浏览器的 aREST 命令控制继电器

在下一节中,我们将看到如何使用Rest命令控制网络浏览器的数字输出。让我们深入了解一下,了解更多细节:

配置网络服务器

现在,您可以将代码复制到一个名为 outputcontrol.js 的文件中,或者直接从这个项目的文件夹中获取完整的代码,并使用 Node.js 执行它。

sudo node output control.js

我们通过使用以下内容来定义导入命令的设备的 GPIO:

var gpio = require('rpi-gpio'); 

现在我们将使用 Node.js 创建我们的 web 服务器,使用下面的代码行。

我们导入运行所必需的必需包。我们使用以下内容声明库:

var express = require('express'); 
var app = express(); 

定义主体解析器并打开端口,在这种情况下, 8099 :

var Parser = require('body-parser'); 
var port = 8099; 

使用正文解析器:

app.use(Parser.urlencoded({ extended: false })); 
app.use(Parser.json()); 

配置 GPIO 11 ,我们来控制:

gpio.setup(11,gpio.DIR_OUT); 

我们定义将从 web 浏览器调用的函数。

功能名称为ledon;它激活 GPIO 11 并向屏幕发送信息led1 is on:

function ledon() { 
    setTimeout(function() { 
        console.log('led1 is on'); 
        gpio.write(11, 1); 
      }, 2000); 
} 

功能名称为ledoff;关闭 GPIO 11 并向屏幕发送信息led1 is off:

function ledoff() { 
    setTimeout(function() { 
        console.log('led1 is off'); 
        gpio.write(11, 0); 
   }, 2000); 
} 

我们定义了函数GET,意思是当浏览器收到名为ledon的函数时,我们正在向服务器发出请求;它以下列格式回应:{status:"connected",led:"on"}

我们现在将为来自客户端的传入请求声明应用功能:

app.get('/ledon', function (req, res) { 
    ledon(); 
    var data ={status:"connected",led:"on"}; 
    res.json(data); 
}); 

我们定义函数GET。也就是说,当浏览器接收到名为/ledoff的函数时,我们正在向服务器发出请求,它以如下格式响应:{status:"connected",led:"off"}.

app.get('/ledoff', function (req, res) { 
    ledoff(); 
    var data ={status:"connected",led:"off"}; 
    res.json(data); 
}); 

我们现在从 web 服务器打开端口:

app.listen(port); 
console.log('Server was started on ' + port); 

如果一切正常,我们打开自己喜欢的浏览器,输入http://IP_address of your Raspberry_PI_zero:port/command

In this case, we type 192.168.1.105:8099/ledon

下面的截图向您展示了 JSON 请求的响应:

Configuring the web server

之后,我们将看到最终结果,如下图所示:

Configuring the web server

将计算机上的 Node.js 配置为 web 服务器

Node.js 是一个开源的跨平台运行时环境,用于开发服务器端和网络应用。Node.js 应用是用 JavaScript 编写的,可以在 OS X、微软视窗和 Linux 上的 Node.js 运行时中运行。

Node.js 还提供了各种 JavaScript 模块的丰富库,在很大程度上简化了使用 Node.js 的 web 应用的开发。

在上一节中,我们在树莓 Pi Zero 中配置了 Node.js,现在在这一节中,我们将使用一个 Windows 操作系统做同样的事情,并配置我们运行在其上的 web 服务器 Node.js。

本节的主要目的是解释如何从运行在 Node.js 框架中的 web 服务器控制我们的 Arduino 板。为此,安装它很重要;我们的系统将在 Windows 计算机上运行。

在本节中,我们将解释如何在 Windows 中安装 Node.js。

下载 Node.js

首先我们需要下载适用于 Windows 64 位的 Node.js 这要看你的操作系统版本才能下载,你只需要转到以下链接:https://nodejs.org/es/download/:

Downloading Node.js

安装 Node.js

下载软件后,请按照以下步骤操作:

  1. Click on the Next button:

    Installing Node.js

  2. Click on the Next button:

    Installing Node.js

  3. Select where to install it:

    Installing Node.js

  4. Select the default configuration:

    Installing Node.js

  5. To finish the configuration, we click on Install:

    Installing Node.js

  6. After the installation is complete we will see the following:

    Installing Node.js

用 Node.js 配置 web 服务器端口 8080

现在,我们需要配置端口,该端口将被期望从远程浏览器监听打开的连接。打开本章文件夹中的文件,然后使用 Node.js 执行该文件

您现在可以将代码复制到一个名为server.js的文件中,或者从这个项目的文件夹中获取完整的代码。

首先,我们需要用以下代码创建我们的服务器:

var server = require('http'); 

创建一个名为loadServer的函数,该函数具有响应浏览器的代码:

function loadServer(requiere,response){ 
      console.log("Somebody is connected");     

如果此函数以数字 200 响应,则表示连接已建立,服务器工作正常:

response.writeHead(200,{"Content-Type":"text/html"}); 
      response.write("<h1>The Server works perfect</h1>"); 
      response.end(); 
} 

创建并打开服务器端口:

server.createServer(loadServer).listen(8080); 

打开计算机上安装了 Node.js 服务器的终端,然后在 MS-DOS 界面中键入以下命令:

C:\users\PC>node server.js

现在,为了测试服务器是否正在运行,我们将进入网络浏览器并键入localhost:number_of_port;您应该会在屏幕上看到类似下面的截图:

http://localhost:8080  

Configuring web server port 8080 with Node.js

使用 Node.js 和 Arduino Wi-Fi 监控温度、湿度和光照

在本章的这一部分,我们将解释带有 Arduino 的 Wi-Fi 屏蔽的代码:

Monitoring temperature, humidity, and light using Node.js with Arduino Wi-Fi

我们定义变量的数量;在这种情况下,我们将监控三个变量(temperaturehumiditylight):

#define NUMBER_VARIABLES 3 

这里我们必须包含传感器库:

#include "DHT.h" 

我们定义传感器的引脚:

#define DHTPIN 7  
#define DHTTYPE DHT11 

我们定义传感器的实例:

DHT dht(DHTPIN, DHTTYPE); 

我们导入模块的库:

#include <Adafruit_CC3000.h> 
#include <SPI.h> 
#include <CC3000_MDNS.h> 
#include <aREST.h> 

我们定义了连接模块的引脚:

using a breakout board 
#define ADAFRUIT_CC3000_IRQ   3 
#define ADAFRUIT_CC3000_VBAT  5 
#define ADAFRUIT_CC3000_CS    10 

我们创建将要连接的模块实例:

Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS,  
ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT); 

我们定义了 aREST 实例:

aREST rest = aREST(); 

然后我们定义您需要更改的 SSID 和密码:

#define WLAN_SSID       "xxxxx" 
#define WLAN_PASS       "xxxxx" 
#define WLAN_SECURITY   WLAN_SEC_WPA2 

我们将端口配置为监听传入的 TCP 连接:

#define LISTEN_PORT           80 

我们定义模块的服务器实例:

Adafruit_CC3000_Server restServer(LISTEN_PORT); 
// DNS responder instance 
MDNSResponder mdns; 

我们定义将要发布的变量:

int temp; 
int hum; 
int light; 

我们这里有定义串行通信配置的设置:

void setup(void) 
{   
  // Start Serial 
  Serial.begin(115200);  
  dht.begin(); 

我们从将要发布的变量开始:

  rest.variable("light",&light); 
  rest.variable("temp",&temp); 
  rest.variable("hum",&hum); 

我们定义设备的标识和名称:

  rest.set_id("001"); 
  rest.set_name("monitor"); 

我们连接到网络:

  if (!cc3000.begin()) 
  { 
    while(1); 
  } 
  if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) { 
    while(1); 
  } 
  while (!cc3000.checkDHCP()) 
  { 
    delay(100); 
  } 

这里我们定义了连接设备的功能:

  if (!mdns.begin("arduino", cc3000)) { 
    while(1);  
  } 

我们在串行接口中显示连接:

  displayConnectionDetails(); 
  restServer.begin(); 
  Serial.println(F("Listening for connections...")); 
} 

在这一部分,我们声明将要获取的变量:

void loop() { 
  temp = (float)dht.readTemperature(); 
  hum = (float)dht.readHumidity(); 

然后我们测量光线水平:

  float sensor_reading = analogRead(A0); 
  light = (int)(sensor_reading/1024*100); 

我们声明用于请求的函数:

  mdns.update(); 

我们需要执行来自服务器的请求:

Adafruit_CC3000_ClientRef client = restServer.available(); 
  rest.handle(client); 
} 

我们从设备显示网络配置:

bool displayConnectionDetails(void) 
{ 
  uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv; 
  if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) 
  { 
Serial.println(F("Unable to retrieve the IP Address!\r\n")); 
    return false; 
  } 
  else 
  { 
    Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress); 
    Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask); 
    Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway); 
    Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv); 
    Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv); 
    Serial.println(); 
    return true; 
  } 
} 

下载 Arduino 板中的代码草图,然后转到串行监视器,查看从路由器获取的 IP 地址的配置。之后,我们可以显示 Wi-Fi 屏蔽的配置 IP 地址:

Monitoring temperature, humidity, and light using Node.js with Arduino Wi-Fi

连接到无线网络

现在,我们可以看到您的 Arduino Wi-Fi 屏蔽的 IP 地址,我们现在可以将我们的计算机连接到与 Arduino 板相同的网络。查看下面的截图,了解更多详细信息:

Connecting to the Wi-Fi network

要测试应用,我们需要转到以下路径,并在安装了 Node.js 服务器的计算机上运行以下命令,如下图所示:

Connecting to the Wi-Fi network

在这个文件夹中,我们有一个 JavaScript 文件,并输入命令节点 app.js

进入界面文件夹后输入以下命令node app.js:

Connecting to the Wi-Fi network

现在您已经启动了 web 服务器、应用,切换到同一台机器上的浏览器,通过输入机器的 IP 地址来查看结果:

Connecting to the Wi-Fi network

在服务器监听端口 300 后,它与无线模块建立通信,向设备的 IP 地址发送请求:

Connecting to the Wi-Fi network

使用 Node.js 和 Arduino 以太网监控温度、湿度和光照

在上一节中,我们展示了如何使用 CC3000 模块通过无线网络监控我们的 Arduino 现在我们将使用另一个重要模块:以太网屏蔽。该部件的硬件连接类似于下图:

Monitoring temperature, humidity, and light using Node.js with Arduino Ethernet

阿尔杜伊诺以太网屏蔽应用代码

现在,您可以将代码复制到名为Monitor_Ethernet.ino的文件中,或者直接从这个项目的文件夹中获取完整的代码;您需要使用 Arduino IDE。

以下是程序中包含的库:

#include <SPI.h> 
#include <Ethernet.h> 
#include <aREST.h> 
#include <avr/wdt.h> 

包括 DHT11 传感器的库:

#include "DHT.h" 

我们定义了温度和湿度传感器的引脚:

#define DHTPIN 7  
#define DHTTYPE DHT11 

我们有传感器的例子:

DHT dht(DHTPIN, DHTTYPE); 

我们为设备注册了媒体访问控制地址:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xFE, 0x40 }; 
IPAddress ip(192,168,1,153); 
EthernetServer server(80); 

我们现在创建一个aREST应用编程接口的实例:

aREST rest = aREST(); 

我们发布将被监控的变量:

int temp; 
int hum; 
int light; 

我们现在配置串行通信并启动传感器实例:

void setup(void) 
{   
  // Start Serial 
  Serial.begin(115200); 
  dht.begin(); 

我们开始发布变量:

  rest.variable("light",&light); 
  rest.variable("temp",&temp); 
  rest.variable("hum",&hum); 

给出我们正在使用的设备的 ID 和名称非常重要:

  rest.set_id("008"); 
  rest.set_name("Ethernet"); 

我们开始以太网连接:

if (Ethernet.begin(mac) == 0) { 
    Serial.println("Failed to configure Ethernet using DHCP"); 
    Ethernet.begin(mac, ip); 
  } 

我们在串行监视器上显示 IP 地址:

  server.begin(); 
  Serial.print("server is at "); 
  Serial.println(Ethernet.localIP()); 
  wdt_enable(WDTO_4S); 
} 

我们读取温度和湿度传感器:

void loop() {   

  temp = (float)dht.readTemperature(); 
  hum = (float)dht.readHumidity(); 

我们测量传感器的光照水平:

  float sensor_reading = analogRead(A0); 
  light = (sensor_reading/1024*100); 

我们监听将要连接的传入客户端:

  EthernetClient client = server.available(); 
  rest.handle(client); 
  wdt_reset(); 
} 

现在我们已经完成了配置,我们打开一个网络浏览器,键入您的 Arduino 以太网盾的 IP 地址:http://192.168.1.153。如果一切顺利,它将显示以下屏幕,并显示来自电路板的 JSON 响应:

Code for the application of the Arduino Ethernet shield

前面的截图显示了 JSON 请求的结果。

在 Node.js 中配置设备

在本节中,我们将解释用于配置我们可以从网页上控制的设备的代码。

我们在上一节安装了快递包裹;如果您有任何困难,只需打开终端并键入以下内容:

npm install express

我们定义节点表达并创建应用:

var express = require('express'); 
var app = express(); 

然后,我们定义要监听的端口:

var port = 3000; 

我们使用视图引擎定义了 Jade 应用的实例:

app.set('view engine', 'jade'); 

我们配置公共文件夹:

app.use(express.static(__dirname + '/public')); 

我们现在定义要监控的设备:

var rest = require("arest")(app); 
rest.addDevice('http','192.168.1.153'); 

我们为应用提供服务:

app.get('/', function(req, res){ 
res.render('interface'); 
}); 

我们启动服务器,并在设备连接时发送消息:

app.listen(port); 
console.log("Listening on port " + port); 

在微软操作系统中打开你的终端,在你的节点服务器中执行app.js

要测试应用,请打开您的网络浏览器并键入http://localhost:3000;如果出现如下屏幕,恭喜您,您刚刚正确配置了服务器:

Configuring the device in Node.js

这里我们有一个屏幕,我们可以看到在 Node.js 服务器中app.js的执行:

Configuring the device in Node.js

总结

在本章中,您学习了如何控制您的 Arduino 板,从中央界面仪表板中的树莓 Pi Zero 使用网络区域中的通信模块。我们已经研究了如何从中央界面控制和监控设备;您可以使用其他传感器,例如气压传感器。

在下一章中,您将做更多有趣的项目,例如将网络摄像头配置并连接到您的 Arduino 板,该板可以通过您的树莓 Pi Zero 进行监控。