使用PHP和MQTT构建高效的物联网数据转发服务器流程

一、项目概述

项目目标和用途

本项目旨在搭建一个基于PHP的物联网服务器,能够接收来自各种传感器的数据,并通过MQTT协议将数据转发到其他设备或服务。该系统适用于智能家居、环境监测等场景,能够实现实时数据监控和远程控制。

技术栈关键词

  • PHP

  • MQTT

  • MySQL

  • ESP8266/ESP32(单片机)

  • DHT11(温湿度传感器)

  • Linux服务器

  • Apache/Nginx

  • 二、系统架构

    系统架构设计

    本项目的系统架构主要由以下几个部分组成:

    1. 传感器模块:负责采集环境数据(如温度、湿度)。

    2. 单片机模块:使用ESP8266/ESP32作为数据采集和传输的核心。

    3. 物联网服务器:基于PHP搭建,负责接收数据并转发MQTT消息。

    4. MQTT Broker:用于管理和转发MQTT消息。

    5. 客户端应用:可以是Web端或移动端,负责展示数据和控制设备。

    选择的硬件和技术栈

  • 单片机:ESP8266/ESP32,支持Wi-Fi,适合物联网应用。

  • 传感器:DHT11,简单易用,适合温湿度监测。

  • 通信协议:MQTT,轻量级,适合物联网数据传输。

  • 数据库:MySQL,用于存储历史数据。

  • Web服务器:Apache或Nginx,运行PHP代码。

  • 三、环境搭建和注意事项

    环境搭建

    在Linux服务器上搭建物联网服务器的步骤如下:

    1. 更新系统软件包:

      sudo apt updatesudo apt upgrade
      
    2. 安装Apache或Nginx:

    3. 安装Apache:

      sudo apt install apache2
      
    4. 安装Nginx:

      sudo apt install nginx
      
    5. 安装PHP及相关扩展:

      sudo apt install php libapache2-mod-php php-mysql
      
    6. 安装MySQL:

      sudo apt install mysql-serversudo mysql\_secure\_installation
      
    7. 安装MQTT Broker(Mosquitto):

      sudo apt install mosquitto mosquitto-clients
      
    8. 安装Composer(PHP依赖管理工具):

      sudo apt install composer
      
    9. 安装MQTT PHP客户端库:

      composer require php-mqtt/client
      

    注意事项

  • 确保网络连接稳定,避免数据丢失。

  • 定期备份数据库,防止数据丢失。

  • 处理异常情况,如传感器故障或网络中断。

  • 配置防火墙,确保MQTT端口(默认1883)和Web服务端口(80或443)开放。

  • 四、代码实现过程

    功能模块实现

    根据系统架构,逐步实现各个功能模块。

    1. 传感器模块代码

    使用Arduino IDE编写ESP8266/ESP32的代码,采集温湿度数据并发送到物联网服务器。

    #include <ESP8266WiFi.h>
    #include <DHT.h>
    
    #define DHTPIN 2
    #define DHTTYPE DHT11
    
    DHT dht(DHTPIN, DHTTYPE);
    const char* ssid = "your_SSID";
    const char* password = "your_PASSWORD";
    const char* server = "http://your_server_ip/data.php";
    
    void setup() {
        Serial.begin(115200);
        dht.begin();
        WiFi.begin(ssid, password);
    }
    
    void loop() {
        if (WiFi.status() == WL_CONNECTED) {
            float h = dht.readHumidity();
            float t = dht.readTemperature();
            if (!isnan(h) && !isnan(t)) {
                String data = "temperature=" + String(t) + "&humidity=" + String(h);
                WiFiClient client;
                if (client.connect(server, 80)) {
                    client.print("POST /data.php HTTP/1.1\r\n");
                    client.print("Host: ");
                    client.print(server);
                    client.print("\r\n");
                    client.print("Content-Type: application/x-www-form-urlencoded\r\n");
                    client.print("Content-Length: ");
                    client.print(data.length());
                    client.print("\r\n\r\n");
                    client.print(data);
                    client.stop();
                }
            }
        }
        delay(2000); // 每2秒读取一次数据
    }
    

    2. 物联网服务器代码

    在Linux服务器上,我们需要创建一个PHP脚本来接收传感器数据并将其存储到MySQL数据库,同时将数据转发到MQTT Broker。

    2.1 创建数据库和表

    首先,我们需要在MySQL中创建一个数据库和表来存储温湿度数据。

    CREATE DATABASE iot_data;
    USE iot_data;
    
    CREATE TABLE sensor_data (
        id INT AUTO_INCREMENT PRIMARY KEY,
        temperature FLOAT NOT NULL,
        humidity FLOAT NOT NULL,
        created\_at TIMESTAMP DEFAULT CURRENT\_TIMESTAMP
    );
    
    2.2 PHP脚本(data.php)

    在Web服务器的根目录下创建一个名为data.php的文件,内容如下:

    <?php
    require 'vendor/autoload.php'; // 引入Composer自动加载文件
    use PhpMqtt\Client\MqttClient;
    use PhpMqtt\Client\ConnectionSettings;
    
    // 数据库连接
    $servername = "localhost";
    $username = "your_db_username";
    $password = "your_db_password";
    $dbname = "iot_data";
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    
    // 获取POST数据
    $temperature = $_POST['temperature'];
    $humidity = $_POST['humidity'];
    
    // 插入数据到数据库
    $sql = "INSERT INTO sensor_data (temperature, humidity) VALUES ('$temperature', '$humidity')";
    if ($conn->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
    
    // MQTT配置
    $server = "your_mqtt_broker_ip"; // MQTT Broker地址
    $clientId = "php-mqtt-client";
    $mqtt = new MqttClient($server, 1883, $clientId);
    $settings = (new ConnectionSettings())->setUsername('your_mqtt_username')->setPassword('your_mqtt_password');
    
    try {
        $mqtt->connect($settings);
        // 发布温湿度数据到MQTT主题
        $mqtt->publish('sensor/temperature', $temperature, 0);
        $mqtt->publish('sensor/humidity', $humidity, 0);
        $mqtt->disconnect();
    } catch (Exception $e) {
        echo "MQTT Error: " . $e->getMessage();
    }
    
    $conn->close();
    ?>
    

    3. 测试和验证

    1. 启动MQTT Broker:

      sudo systemctl start mosquitto
      
    2. 启动Web服务器:

    3. 对于Apache:

      sudo systemctl start apache2
      
    4. 对于Nginx:

      sudo systemctl start nginx
      
    5. 上传ESP8266/ESP32代码到开发板,确保其连接到Wi-Fi并能够发送数据。

    6. 使用MQTT客户端(如MQTT.fx或mosquitto_sub)订阅主题,验证数据是否成功发布:

      mosquitto\_sub -h your\_mqtt\_broker\_ip -t sensor/temperature
      mosquitto\_sub -h your\_mqtt\_broker\_ip -t sensor/humidity
      
    7. 访问PHP脚本,确保数据能够正确存储到MySQL数据库中。

    五、项目总结

    项目主要功能

    本项目成功搭建了一个基于PHP的物联网服务器,能够实现以下功能:

  • 通过ESP8266/ESP32采集温湿度数据。

  • 将数据通过HTTP POST请求发送到PHP服务器。

  • PHP服务器将数据存储到MySQL数据库中。

  • PHP服务器将接收到的数据通过MQTT协议转发到指定的MQTT Broker。

  • 客户端应用(如Web应用或移动应用)可以通过MQTT订阅相关主题,实时获取温湿度数据。

  • 实现过程总结

  • 在本项目中,我们经历了以下几个步骤:

  • 环境搭建:在Linux服务器上安装了Apache/Nginx、PHP、MySQL和Mosquitto MQTT Broker,确保了系统的基本运行环境。

  • 硬件选择:选择了ESP8266/ESP32作为数据采集的核心,DHT11传感器用于温湿度监测,确保了系统的可扩展性和灵活性。

  • 数据采集与传输:通过Arduino IDE编写了ESP8266/ESP32的代码,实现了定时采集温湿度数据并通过HTTP POST请求发送到PHP服务器。

  • 数据存储与转发:在PHP中实现了数据接收、存储到MySQL数据库以及通过MQTT协议转发数据的功能,确保了数据的持久化和实时性。

  • 测试与验证:通过MQTT客户端验证了数据的发布和订阅功能,确保了系统的可靠性。

  • 作者:极客小张

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用PHP和MQTT构建高效的物联网数据转发服务器流程

    发表回复