四、控制连接设备
在本章中,我们将了解如何使用我们的树莓 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 地址:
使用 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 请求的响应:
之后,我们将看到最终结果,如下图所示:
将计算机上的 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/:
安装 Node.js
下载软件后,请按照以下步骤操作:
-
Click on the Next button:
-
Click on the Next button:
-
Select where to install it:
-
Select the default configuration:
-
To finish the configuration, we click on Install:
-
After the installation is complete we will see the following:
用 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
使用 Node.js 和 Arduino Wi-Fi 监控温度、湿度和光照
在本章的这一部分,我们将解释带有 Arduino 的 Wi-Fi 屏蔽的代码:
我们定义变量的数量;在这种情况下,我们将监控三个变量(temperature
、 humidity
和light
):
#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 地址:
连接到无线网络
现在,我们可以看到您的 Arduino Wi-Fi 屏蔽的 IP 地址,我们现在可以将我们的计算机连接到与 Arduino 板相同的网络。查看下面的截图,了解更多详细信息:
要测试应用,我们需要转到以下路径,并在安装了 Node.js 服务器的计算机上运行以下命令,如下图所示:
在这个文件夹中,我们有一个 JavaScript 文件,并输入命令节点 app.js
进入界面文件夹后输入以下命令node app.js
:
现在您已经启动了 web 服务器、应用,切换到同一台机器上的浏览器,通过输入机器的 IP 地址来查看结果:
在服务器监听端口 300 后,它与无线模块建立通信,向设备的 IP 地址发送请求:
使用 Node.js 和 Arduino 以太网监控温度、湿度和光照
在上一节中,我们展示了如何使用 CC3000 模块通过无线网络监控我们的 Arduino 现在我们将使用另一个重要模块:以太网屏蔽。该部件的硬件连接类似于下图:
阿尔杜伊诺以太网屏蔽应用代码
现在,您可以将代码复制到名为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 响应:
前面的截图显示了 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
;如果出现如下屏幕,恭喜您,您刚刚正确配置了服务器:
这里我们有一个屏幕,我们可以看到在 Node.js 服务器中app.js
的执行:
总结
在本章中,您学习了如何控制您的 Arduino 板,从中央界面仪表板中的树莓 Pi Zero 使用网络区域中的通信模块。我们已经研究了如何从中央界面控制和监控设备;您可以使用其他传感器,例如气压传感器。
在下一章中,您将做更多有趣的项目,例如将网络摄像头配置并连接到您的 Arduino 板,该板可以通过您的树莓 Pi Zero 进行监控。
版权属于:月萌API www.moonapi.com,转载请注明出处