联合创作人招募中!
微信联系:yulone

ESP8266传送数据到MySQL数据库教程

本文将为大家介绍如何通过ESP8266传送传感器的数据到一个MySQL数据库中,并通过浏览器访问PHP文件来显示数据库中的数据,实现通过互联网实时查看NodeMCU搭载的数据的效果。本文内容分为创建数据库、存储数据、ESP8266编程、显示数据几个步骤。

准备工作

如果没有做好如下准备请自行了解,我以后也有可能会在爱鱼客补充教程。

还有其他的一些方法也可以用来传输数据,比如使用MQTT的M2M协议、Node-Red等,可能以后会写一写相关的教程,这边不多做说明,有兴趣的同学可以自己去了解一下。
MQTT:mqtt.org
Node-Red:nodered.org

创建一个MySQL数据库

如果使用的是LAMP一键安装包,一般会自动安装好phpMyAdmin数据库管理系统,我们可以登录后台添加一个空数据库;如果使用的是虚拟主机的话可以在主机管理面板后台创建数据库和用户;如果是自己的搭的话你应该已经知道怎么添加数据库了。以下为 command line 为例:

1. 连接MySQL数据库(默认用户名为root)

mysql -u root -p

之后会出现“Enter Password:”,此时可以输入密码,在SSH下输入密码是不会显示的,只要输入完按回车就可以登陆并进入MySQL编辑系统,MySQL的提示符是:“mysql>”。

此处注意有另一种输入方式(用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码,因为mysql编辑器的读取规则是-u后面是用户名,-p后面是密码,空格之后是要进入的数据库,详见第6步)

mysql -uroot -ppassword

2. 添加数据库用户(用户名:name,密码:mypassword)

mysql> create user 'name'@'localhost' identified by 'mypassword';

3. 创建数据库:esp8266

mysql> create database esp8266;

4.为用户添加对数据库的完全的访问时间权限

mysql> grant usage on *.* to 'name'@'localhost' with max_queries_per_hour 10000;

上面一行我们设置了 ‘with max_queries_per_hour’,这个是可选的,我们也可以把它去掉,因为一般情况下没有理由限制自己访问自己的数据库,于是就变成了:

mysql> grant usage on *.* to 'name'@'localhost';

5. 下面来为用户添加完全控制权限:

mysql> grant all on esp8266.* to 'name'@'localhost';

现在我们可以退出(Ctrl+C),通过创建的用户和密码来访问刚刚创建的esp8266数据库。上面所有的操作都可以在phpMyAdmin面板或者部分主机面板中通过可视化界面完成,即创建数据库、数据库用户,然后给该用户添加对数据库的完全控制权限。有同学会问为什么能够通过可视化界面设置的却要写上命令行的代码呢?原因很简单,因为我们现在设计的智能硬件也好,微控制器也好,最重要的就是这些命令行,如果你只是为了图方便,找个教程复制粘贴一下就可以用的话,那么你可能真的不适合自己捣腾这些东西,之后自己的项目出了问题也可能根本没法解决。所以通过命令行,我们可以知道机器是怎么运作的,这样在日后如果遇到问题,处理起来也就会更加容易。

闲话聊完,让我们继续:

6. 访问刚刚创建的esp8266数据库

mysql -u name -p esp8266

同样的,之后会出现“Enter Password:”,此时可以输入刚刚为新用户设置的密码,输入后按回车登陆。

如果输入以下内容则不需要再另外输入密码就可以登录:

mysql -uname -ppassword esp8266

7. 创建数据表:DataTable,包含三列:logdate、field、value

mysql> create table DataTable ( logdate DATETIME , field VARCHAR(64), value BIGINT);

在这边添加了一列名为“field”,以备日后查询需要。

存储数据

我们通过PHP文件来完成数据存储的功能。首先创建一个PHP文件,命名为“store.php”

此代码仅在查询的参数具有名为“heap”的参数室才执行存储。

<?php
  $servername = "localhost"; //服务器地址,默认为localhost
  $username = "name"; //用户名
  $password = "password"; //密码
  $dbname = "esp8266"; //数据库名称

  $now = new DateTime();
  parse_str( html_entity_decode( $_SERVER['QUERY_STRING']) , $out);

  if ( array_key_exists( 'heap' , $out ) ) {
  // 建立连接
  $conn = new mysqli($servername, $username, $password, $dbname);
  // 检查连接
  if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
  }

  $datenow = $now->format('Y-m-d H:i:s');
  $hvalue  = $out['heap'];

  $sql = "INSERT INTO DataTable ( logdate , field  , value) VALUES ( '$datenow' , 'heap', $hvalue )";

  if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
  } else {
    echo "Error: " . $sql . "<br>" . $conn->error;
  }

  $conn->close();
}
?>

ESP8266编程

刷了NodeMCU固件的ESP8266使用LUA来编程,首先监测ESP8266是否连接上了WiFi(保存为ping.lua周期执行)

conn=net.createConnection(net.TCP, false)
conn:on("receive", function(conn, payload) print("Get done.", payload) end )
conn:connect(80,"xx.xx.xx.xx") //xx.xx.xx.xx为服务器IP地址
conn:send("GET /store.php?heap=" .. node.heap() .." HTTP/1.1\r\nHost: xx.xx.xx.xx\r\n" .. "Connection: keep-alive\r\nAccept: */*\r\n\r\n")

显示数据

我们可以查看存储于MySQL数据库的数据:新建一个名为 list.php 的文件,代码如下:

<?php
 $servername = "localhost"; //服务器地址,默认为localhost
 $username = "name"; //用户名
 $password = "password"; //密码
 $dbname = "esp8266"; //数据库名称

  parse_str( html_entity_decode( $_SERVER['QUERY_STRING']) , $out);

  $sqlq = "Select * from DataTable ";

  if ( array_key_exists( 'field' , $out ) ) {
    $sqlq = $sqlq . " where field = '" . $out['field'] . "'" ;
  }

  echo $sqlq;
  // 建立连接
  $conn = new mysqli($servername, $username, $password, $dbname);
  // 检查连接情况
  if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
  }

  $result = mysqli_query( $conn , $sqlq );

  if ( $result->num_rows  > 0 ) {

  echo "<table border='1'>
    <tr>
    <th>Log Date</th>
    <th>Field</th>
   <th>Value</th>
   </tr>";

  while($row = mysqli_fetch_array($result)) {
    echo "<tr>";
    echo "<td>" . $row['logdate'] . "</td>";
    echo "<td>" . $row['field'] . "</td>";
    echo "<td>" . $row['value'] . "</td>";
    echo "</tr>";
  }
  echo "</table>";
}
$conn->close();

?>

如果我们访问list.php文件,并且不包含任何参数,显示的则是所有可以显示的数据。如果包含特定参数,则只会显示特定的数据,如下:

http://address/list.php?field=sensor1

爱鱼客著作权所有!未经允许不得转载:爱鱼客 » ESP8266传送数据到MySQL数据库教程

分享到:更多 ()

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    好文章!

    aicreate7个月前 (12-05)Reply