在上一篇关于Esp32的文章中,我们通过Esp32的蓝牙系统控制了家里的灯光。结尾处提到,这套蓝牙方案似乎有点耗电,于是乎我采取了wifi这个方案解决。
大概讲一下原理和思路:通过服务器提交表单,更改数据库参数。另一边,单片机不停检测数据库特定参数数据,若发生改变,则执行相对应的命令。(我设置的参数 0 为关灯 1 为开灯)
Ⅰ.方案需求
- 完整的控制设备(如果你还没有看上一期蓝牙版的教程,先去看完再继续哦)
- 一个迷你服务器+数据库(只要是能任何时候都在浏览器能访问的网页即可)
Ⅱ.网络服务的搭建
如果你已经准备好一个能随时访问的网页和数据库,那么我们就开始配置吧!
一、在数据库中建立表
登录后台数据库,新建表名为 home_intellenges 的表,分别添加 id 和 value 字段(表名若要更改请根据后面的提示更改源码)
二、上传控制页面到你的网站
一共有三个页面,分别是:
- index.html 远程控制器网页 用于控制灯的开和关
- upload_db.php 用于将我们的操控数据上传到数据库
- get_data.php 用于单片机请求并返回灯的开关状态数据
在你的后台新建一个文件夹,并将这三个文件上传上去(文件名不能改 除非自行改源码)
1.index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>岩石的智能家居</title>
<style>
body {
background-color: rgb(173, 166, 166);
}
div.my_room {
background-color: dodgerblue;
text-align: center;
position: absolute;
margin: auto;
left: 0;
right: 0;
top: 0;
bottom: 0;
width:300px;
height:150px;
border-radius: 100px;
box-shadow: 0 0 100px 42px white;
}
.light1 {
color: white;
}
.confirm_light1 {
position: relative;
top: 20px;
width: 60px;
height: 30px;
border-radius: 190px;
}
</style>
</head>
<body>
<form action="upload_db.php" method="post">
<div class="my_room">
<p class="light1">灯光控制1</p>
<span class="light1">开:</span><input type="radio" name="house_light" value="1">
<span class="light1">关:</span><input type="radio" name="house_light" value="0"><br>
<button type="submit" class="confirm_light1">确定</button>
</div>
</form>
</body>
</html>
2.upload_db.php
<html>
<body>
<?php
$host = "localhost"; // 主机地址
$db_admin = "sql_admin"; // 数据库账户名
$db_name = "sql_name"; // 数据库名
$db_passwd = "sql_pwd"; // 数据库登录密码
// 数据表名 home_intellenges 若你创建的不是这个名称,请将所有的 home_intellenges 都换 成你的
// 定义变量并设置为空值
$house_light = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$house_light = server_input($_POST["house_light"]);
// strcmp 二进制安全字符串比较
if (strcmp($house_light, "1") == 0) {
echo "开灯!";
turn_on();
} else {
turn_off();
echo "关灯!";
}
}
// 开灯
function turn_on() {
$conn=mysqli_connect($host, $db_name, $db_passwd);
if($conn){
$select = mysqli_select_db($conn,$db_name);
if($select) {
$sql = "update home_intellenges set value = 1 where id = 1";
$ok = mysqli_query($conn,$sql);
if($ok) {
header("location:index.html");
}
else {
echo "数据库修改错误";
}
}
else {
echo "表文件链接错误";
}
}
else {
echo "无法连接数据库";
}
}
// 关灯
function turn_off() {
$conn=mysqli_connect($host, $db_name, $db_passwd);
if($conn){
$select = mysqli_select_db($conn,$db_name);
if($select) {
$sql = "update home_intellenges set value = 0 where id = 1";
$ok = mysqli_query($conn,$sql);
if($ok) {
header("location:index.html");
}
else {
echo "数据库修改错误";
}
}
else {
echo "表文件链接错误";
}
}
else {
echo "无法连接数据库";
}
}
function server_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data, ENT_QUOTES);
return $data;
}
?>
</body>
</html>
请根据文件开头的提示将数据录入完全,之后进入下一步。
3.get_data.php
<?php
$host = "localhost"; // 主机地址
$db_admin = "sql_admin"; // 数据库账户名
$db_name = "sql_name"; // 数据库名
$db_passwd = "sql_pwd"; // 数据库登录密码
// 数据表名 home_intellenges 若你创建的不是这个名称,请将所有的 home_intellenges 都换 成你的
class CallBackData
{
public $my_house_light1;
}
// 定义变量并设置为空值
$http_data = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$http_data = server_input($_POST["house_light"]);
// strcmp 二进制安全字符串比较
// 接收 house_light: state
if (strcmp($http_data, "state") == 0) {
return_func();
}
else {
echo "error code: 1";
}
} else if ($_SERVER["REQUEST_METHOD"] == "GET") {
$http_data = server_input($_GET["house_light"]);
// strcmp 二进制安全字符串比较
// 接收 house_light: state
if (strcmp($http_data, "state") == 0) {
return_func();
}
else {
echo "error code: 2";
}
} else {
echo "error code: 3";
}
function return_func()
{
$data = new CallBackData(); // 创建返回数据对象
$conn=mysqli_connect($host, $db_name, $db_passwd);
if($conn) {
$select = mysqli_select_db($conn,$db_name);
if($select) {
$sql = "SELECT * FROM `home_intellenges` WHERE id = 1"; // 数据库执行语句 home_intellenges 为搜索的表名
$ok = mysqli_query($conn, $sql);
if($arr=mysqli_fetch_array($ok)) {
$data->my_house_light1 = "".$arr['value']."";
echo json_encode($data); // 返回JSON数据
}
else {
echo "ERROR: cannot locate data";
}
}
}
}
function server_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data, ENT_QUOTES);
return $data;
}
?>
三、连接测试
通过输入 你的域名/文件路径/index.html 访问刚才上传上去的页面 查看是否成功
Comments | NOTHING