Arduino - Web 模式解锁
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
简介
如果您是初学者,我建议您阅读以下教程:
- Arduino - 电机
- Arduino - 伺服电机
- Arduino - 无线网络
访问手机时,您可能对解锁图案很熟悉。现在这个功能在 Arduino 上可用。它可以防止未经授权的人控制/监视 Arduino。
用户可以自由地将本项目中的代码重用于其他应用程序。为简单起见,我以伺服电机控制为例。
这个想法来源于两个为PHPoC平台编写的项目:
- https://www.hackster.io/iot_lover/web-based-pattern-unlock-for-iot-device-aeaf44。
- https://forum.phpoc.com/articles/tutorials/350-servo-motor-controlling-servo-motor-via-websocket-with-graphic-ui
我将它们改编为 Arduino。
在这个项目中,我使用 PHPoC WiFi Shield 将 Arduino 连接到互联网,因为:
- PHPoC Shield 支持 websocket,方便本项目使用。
- PHPoC Shield 有一个专用的嵌入式 Web 服务器,允许在Shield 上存储嵌入式 Web 应用程序。
PHPoC Shield 有一些内置的 Web 应用程序,允许用户使用嵌入式 Web 应用程序来控制/监控 Arduino,而无需任何 Web 编程知识。
此外,PHPoC shield 允许可以编写 Web 应用程序的用户开发自己的 Web 应用程序并将其存储在 PHPoC Shield 上。
演示
数据流
Web 浏览器 <---> PHPoC WiFi Shield <---> Arduino
工作原理
当用户在 Web 浏览器上绘制他们的图案时,图案被映射到一个字符串。此模式字符串通过 WebSocket(通过 PHPoC Shield)发送到 Arduino。
当 Arduino 接收到输入的模式字符串时,它会将接收到的字符串与 Arduino 中的硬编码模式字符串进行比较。如果它们匹配,Arduino 将 ACCEPTED 代码发送回客户端(Web 浏览器)并设置 认证变量 为真。否则,Arduino 将 DENIED 代码发送到客户端并设置 已验证变量 为假。
当Arduino收到用户的控制命令时,它会检查认证变量的值 第一的。如果值为真,则执行与命令对应的任务。如果值为 false,则向客户端发送 DENIED 代码。
模式映射
模式将被映射到一个字符串。例如,在上图中,模式字符串为“1, 4, 8, 6, 3”。
设置了超时。一段时间后,如果用户没有任何活动,则验证已过期,用户需要重新输入图案才能解锁Arduino。
源代码包括两个文件:
- ArduinoUnlockExample.ino:通过Arduino IDE编译并上传到Arduino
- unlock.php:这是网络应用程序代码,通过 PHPoC Debugger 上传到 PHPoC shield。
我们需要做什么
- 为 PHPoC shield 设置 Wifi 信息(SSID 和密码)
- 将新 UI 上传到 PHPoC shield
- 编写 Arduino 代码
为 PHPoC Shield 设置 Wifi 信息
请参阅此说明。
将新的 Web UI 上传到 PHPoC Shield
- 下载 PHPoC 源代码 unlock.php(在代码部分)。
- 下载下面两张控制伺服电机的图片
- 根据此说明使用 PHPoC 调试器将其上传到 PHPoC shield(注意不要删除 PHPoC Shield 上的现有文件)
编写 Arduino 代码
- 在 Arduino IDE 上为 Arduino 安装 PHPoC 库(请参阅说明)
- 在代码部分查看源代码。
- 通过Arduino IDE编译并上传到Arduino
试试吧
- 单击 Arduino IDE 上的串行按钮以查看 IP 地址。
- 打开网页浏览器,输入
http://
replace_ip_address
/unlock.php
- 点击连接按钮并进行测试。
适合初学者的最佳 Arduino 入门套件
如果您正在寻找 Arduino 套件,请参阅适合初学者的最佳 Arduino 套件
函数参考
- Arduino - 伺服库
- Servo.attach()
- Servo.write()
- Servo.writeMicroseconds()
- Servo.read()
- Servo.attached()
- Servo.detach()
- Serial.begin()
- Serial.println()
- 延迟()
- millis()
- for 循环
- while 循环
- 否则
- 循环()
- 设置()
- String.toInt()
- String.substring()
- String.indexOf()
- String.remove()
- String.equals()
代码
- unlock.php
- ArduinoUnlock 示例
unlock.phpPHP
这是 Web 用户界面Arduino - PHPoC Shield
Arduino - Web 模式解锁
WebSocket:null
ArduinoUnlockExampleArduino
/* arduino web server - 模式解锁 */#include "SPI.h"#include "Phpoc.h"#include#define CMD_AUTH 0#define CMD_CTRL 1#define ACCEPTED "202"#define未经授权的“401”PhpocServer服务器(80);伺服伺服;字符串模式;布尔认证;无符号长超时;无符号长lastActiveTime;无效设置(){Serial.begin(9600);而(!串行); Phpoc.begin(PF_LOG_SPI | PF_LOG_NET); //Phpoc.begin(); server.beginWebSocket("web_pattern"); Serial.print("WebSocket 服务器地址:"); Serial.println(Phpoc.localIP());伺服.attach(8); // 将引脚 8 上的伺服器连接到伺服器对象servo.write(90); pattern =String("1,4,8,6,3");认证=假;超时 =10000; // 10000 毫秒 lastActiveTime =0;}void loop() { // 等待新客户端:PhpocClient client =server.available(); if (client) { String data =client.readLine(); if(data) { int pos =data.indexOf(':'); int cmd =data.substring(0, pos).toInt(); if(cmd ==CMD_AUTH) { String reqPattern =data.substring(pos+1); reqPattern.remove(reqPattern.indexOf(13)); reqPattern.remove(reqPattern.indexOf(10)); if(pattern.equals(reqPattern)) { 认证 =真;发送响应(接受,3); lastActiveTime =毫秒(); } else { //Serial.print(reqPattern);认证=假;发送响应(未授权,3); } } else if(cmd ==CMD_CTRL) { if(authenticated) { int angle =data.substring(pos+1).toInt(); //angle =map(angle, -90, 90, 0, 180);角度 =地图(角度,90,-90,0,180);伺服.写(角度); lastActiveTime =毫秒(); Serial.println(角度); } else { sendResponse(UNAUTHORIZED, 3); } } } } if (authenticated &&((millis() - lastActiveTime)> timeout)){authenticated =false;发送响应(未授权,3); }}void sendResponse(char *data, int len) { server.write(data, len); }
示意图
制造工艺