You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何解析传感器数据字符串并处理云端JSON数据?

解析Arduino上传的JSON传感器数据并存储到MySQL的PHP实现步骤

先把你从云端拿到的JSON数据贴出来,方便我们对照操作:

{ 
  "timestamp":1526005337995, 
  "data":[ 
    { 
      "_id":"ByWpiEKaM", 
      "data":"N12E00008", 
      "raw":[78,49,50,69,48,48,48,48,56], 
      "timestamp":1525398457512 
    } 
  ]
}

作为JSON新手不用慌,咱们一步步搞定解析和存储的全流程:

步骤1:获取并解码JSON数据

首先要把云端的JSON数据拿到PHP里,转成PHP能直接操作的数组。如果是通过API接口获取,用file_get_contents();如果是POST请求传来的,就用file_get_contents('php://input')。这里先模拟一个JSON字符串演示:

// 模拟从云端获取的JSON字符串
$jsonString = '{ "timestamp":1526005337995, "data":[ { "_id":"ByWpiEKaM", "data":"N12E00008", "raw":[78,49,50,69,48,48,48,48,56], "timestamp":1525398457512 } ]}';

// 解码JSON为关联数组(第二个参数true很关键,返回数组而非对象)
$sensorData = json_decode($jsonString, true);

// 加个判断确保解码成功,避免后续报错
if (json_last_error() !== JSON_ERROR_NONE) {
    die("JSON解码失败,请检查数据格式");
}

步骤2:遍历传感器数据条目

注意data是一个数组,以后可能会有多个传感器上传的数据,所以用循环处理每一条:

// 遍历每个传感器数据项
foreach ($sensorData['data'] as $item) {
    $dataString = $item['data']; // 拿到核心的"N12E00008"字符串
    $itemTimestamp = $item['timestamp']; // 记录数据采集的毫秒级时间戳
    // 接下来拆分这个字符串提取信息
}

步骤3:拆分字符串提取关键信息

根据你说的规则:N12是项目ID,E代表湿度(G代表温度),最后两位08是数值。用PHP的字符串截取函数就能轻松拆分:

// 提取项目ID:前3个字符
$projectId = substr($dataString, 0, 3);

// 提取类型标识:第4个字符(字符串索引从0开始,所以是第3位)
$sensorTypeCode = substr($dataString, 3, 1);
// 转成易懂的中文名称
$sensorType = ($sensorTypeCode === 'E') ? '湿度' : '温度';

// 提取数值:取最后两位字符,转成整数(自动去掉前面的0,比如"08"转成8)
$sensorValue = (int)substr($dataString, -2);

如果以后数值位数有变化(比如变成3位),可以改成截取第4位之后的所有字符转成整数:$sensorValue = (int)substr($dataString, 4);,这样N12E00008会转成8,N12E123转成123,更灵活。

步骤4:将解析后的数据存入MySQL

首先需要创建一个存储传感器数据的表,比如sensor_readings,SQL语句如下:

CREATE TABLE sensor_readings (
    id INT AUTO_INCREMENT PRIMARY KEY,
    project_id VARCHAR(10) NOT NULL COMMENT '项目ID',
    sensor_type VARCHAR(10) NOT NULL COMMENT '传感器类型:温度/湿度',
    sensor_value INT NOT NULL COMMENT '传感器数值',
    reading_timestamp BIGINT NOT NULL COMMENT '采集时间戳(毫秒)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间'
);

然后用PHP的PDO连接数据库并插入数据(PDO支持预处理语句,能有效防止SQL注入,比mysqli更安全):

// 替换成你的数据库信息
$host = 'localhost';
$dbname = '你的数据库名';
$username = '你的用户名';
$password = '你的密码';

try {
    // 创建PDO连接
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 准备插入语句(预处理防止SQL注入)
    $stmt = $pdo->prepare("INSERT INTO sensor_readings (project_id, sensor_type, sensor_value, reading_timestamp) 
                          VALUES (:project_id, :sensor_type, :sensor_value, :reading_timestamp)");

    // 绑定参数
    $stmt->bindParam(':project_id', $projectId);
    $stmt->bindParam(':sensor_type', $sensorType);
    $stmt->bindParam(':sensor_value', $sensorValue);
    $stmt->bindParam(':reading_timestamp', $itemTimestamp);

    // 执行插入
    $stmt->execute();

    echo "数据插入成功!";
} catch(PDOException $e) {
    // 捕获并输出错误信息
    echo "数据库操作错误: " . $e->getMessage();
}

// 关闭数据库连接
$pdo = null;

额外小提示

  • 时间戳转换:如果需要把毫秒级时间戳转成MySQL的datetime格式,可以用date('Y-m-d H:i:s', $itemTimestamp / 1000),同时把表中的reading_timestamp字段改成DATETIME类型。
  • 数据校验:可以加一些判断,比如检查$dataString的长度是否符合预期,或者$sensorTypeCode是不是E或G,避免脏数据入库。
  • 批量处理:如果一次有大量传感器数据,建议用批量插入来提高效率,减少数据库连接次数。

内容的提问来源于stack exchange,提问作者Lucy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:09