准备
ESP32使用POST方式调用PHP存储到数据库并显示,整个Demo需要准备的事项如下:
- ESP32 端代码
- 服务器端php代码
- 数据库
ESP32 使用 ESP-IDF 工程代码,通过 POST 方式发送数据到服务器端的 php 文件处理。
php 文件分为两部分,一部分用作接收 ESP32数据,另一部分做数据显示。
php 的 POST 接收文件将接收到的数据进行处理,然后存储到数据库。
php 的显示文件读取数据库,并将数据实时显示到网页。
数据库创建
数据库的创建这里不多讲,搭建服务器创建mysql数据库即可。
本例子建立了如下一个表:
mysql> SELECT * FROM table_esp32_post;
+----+-------------+---------------------+--------+---------------------+---------------------+
| id | name | str1 | value1 | time_update | time_create |
+----+-------------+---------------------+--------+---------------------+---------------------+
| 1 | DaoBanMoJie | www.daobanmojie.com | 1991 | 2021-03-08 17:47:43 | 2021-03-08 17:46:37 |
+----+-------------+---------------------+--------+---------------------+---------------------+
3 rows in set (0.07 sec)
ESP32 代码
ESP32通过wifi连接到网络
关于ESP32连接wifi的代码可以参考下面这篇帖子。
ESP32 启用http
主函数代码:
主函数代码以及注册的http_test_task
函数代码。
static void http_test_task(void *pvParameters)
{
http_post_demo();
ESP_LOGI(TAG, "http示例结束\n");
vTaskDelete(NULL);
}
void app_main(void)
{
NVS_Init();
wifi_init_sta();
xTaskCreate(&http_test_task, "http_test_task", 8192, NULL, 5, NULL); //创建HTTP任务
}
http_post_demo 代码:
http_post_demo
代码中是ESP32需要详细讲解的部分。
代码分两部分,第一部分创建需要存储到数据库JSON数据表。
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root , "api_key", cJSON_CreateString("DaoBanMoJie_JiaIT"));
cJSON_AddItemToObject(root , "id", cJSON_CreateString("2"));
cJSON_AddItemToObject(root , "name", cJSON_CreateString("daobanmojie"));
cJSON_AddItemToObject(root , "str1", cJSON_CreateString("Pirate IT!"));
cJSON_AddItemToObject(root , "value1", cJSON_CreateNumber(1230));
const char *post_data = cJSON_Print(root);
cJSON_Delete(root);
第二部分:POST代码
esp_http_client_config_t config = {
.method = HTTP_METHOD_POST,
.url = "http://esp.daobanmojie.com/esp-data-post.php",
.event_handler = _http_event_handler,
};
esp_http_client_handle_t client = esp_http_client_init(&config);
esp_http_client_set_post_field(client, post_data, strlen(post_data));
esp_err_t err = esp_http_client_perform(client);
if (err == ESP_OK) {
ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",esp_http_client_get_status_code(client),esp_http_client_get_content_length(client));
} else {
ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
}
esp_http_client_cleanup(client);
服务器端PHP代码
服务器端php代码分为两部分。一部分post提交数据代码,另一部分为数据库查询显示代码。
POST提交代码
<?php
$servername = "localhost"; //数据库地址
$dbname = "db_esp32_dbmj"; // 数据库名
$username = "db_esp32_dbmj"; // 数据库用户名
$password = "数据库密码"; // 数据库密码
$api_key_value = "DaoBanMoJie_JiaIT"; //POST密匙
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$read_post = file_get_contents('php://input');
$datas = json_decode($read_post, TRUE);
$api_key = $datas['api_key'];
if ($api_key == $api_key_value) {
$id = $datas['id'];
$name = $datas['name'];
$str1 = $datas['str1'];
$value1 = $datas['value1'];
$conn = new mysqli($servername, $username, $password, $dbname); // 创建数据库连接
if ($conn->connect_error) { die("连接失败:" . $conn->connect_error);} // 检查数据库连接状态
$sql = "SELECT id FROM table_esp32_post";
$result = $conn->query($sql);
$db_id_flag = 0;
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$db_id = $row["id"];
if ($db_id == $id) {
$db_id_flag = 1;
break;
}
}
}
if ($id != "" && $db_id_flag == 0) {
$sql = "INSERT INTO table_esp32_post ( id, name, str1, value1)
VALUES ('".$id."', '".$name."', '".$str1."', ".$value1.")";
$result = $conn->query($sql);
if ($result === TRUE) {echo "新记录插入成功";}
else {echo "插入记录错误: " . $sql . "<br>" . $conn->error;}
} else {
$sql = "UPDATE table_esp32_post
SET name='".$name."', str1='".$str1."', value1=".$value1."
WHERE id=" . $id;
$result = $conn->query($sql);
if ($result === TRUE) {echo "记录更新成功";}
else {echo "记录更新错误: " .$sql. "<br>" .$conn->error;}
}
$conn->close();
}
}
?>
数据显示代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>数据显示</title>
<link rel="stylesheet" href="https://www.layuicdn.com/layui/css/layui.css">
</head>
<body>
<?php
$servername = "localhost"; // 数据库地址
$dbname = "db_esp32_dbmj"; // 数据库名
$username = "db_esp32_dbmj"; // 数据库用户名
$password = "数据库密码"; // 数据库密码
$conn = new mysqli($servername, $username, $password, $dbname); // 创建数据库连接
if ($conn->connect_error) { // 检查数据库连接状态
die("Connection failed: " . $conn->connect_error);
}
echo '
<table class="layui-table">
<colgroup>
<col width="150">
<col width="200">
<col>
</colgroup>
<thead>
<tr>
<th>ID</th>
<th>name</th>
<th>str1</th>
<th>Value1</th>
<th>更新时间</th>
<th>创建时间</th>
</tr>
</thead>
<tbody>';
//查询数据库bak table_esp32_post表中的内容
$sql = "SELECT id, name, str1, value1, time_update, time_create FROM table_esp32_post ORDER BY id ";
$result = $conn->query($sql);
if ($result = $conn->query($sql)) {
while ($row = $result->fetch_assoc()) {
$row_id = $row["id"];
$name = $row["name"];
$str1 = $row["str1"];
$value1 = $row["value1"];
$time_update = $row["time_update"];
$time_create = $row["time_create"];
echo '
<tr>
<td>' . $row_id . '</td>
<td>' . $name . '</td>
<td>' . $str1 . '</td>
<td>' . $value1 . '</td>
<td>' . $time_update . '</td>
<td>' . $time_create . '</td>
</tr>';
}
$result->free();
}
$conn->close();
echo ('
</tbody>
</table>');
//<!-- 自动刷新 间隔10s -->
echo ("
<script type=\"text/javascript\">
function fresh_page()
{
window.location.reload();
}
setTimeout('fresh_page()',10000);
</script>
");
?>
</table>
</body>
</html>
完整程序下载
PHP文件、数据库sql文件、ESP32的工程文件下载。
该部分仅登录用户可见
1 条评论
加油