API实现网页输出服务器温度

Silas 发布于 2025-02-11 62 次阅读


使用DS18B20传感器采集温度数据,并通过Flask开发一个API,最后在WordPress页面上通过短代码展示温度。同时,我们将验证API的可用性,并通过樱花隧道进行端口映射,使API可以被外部访问。

一、准备工作

硬件设备

  1. 香橙派3LTS:作为服务器。
  2. DS18B20温度传感器:用于采集温度。
  3. 杜邦线:用于连接传感器与香橙派。

软件环境

  1. Ubuntu系统:香橙派的定制系统。
  2. Python 3:用于开发API。
  3. Flask:轻量级Web框架,用于创建API。
  4. WordPress:作为展示温度数据的网页平台。
  5. 宝塔面板(可选):用于管理服务器。
  6. 樱花隧道:用于端口映射。

准备步骤

确保网络连通:香橙派3LTS已连接网络。

安装必要的库

sudo apt update
sudo apt install python3-pip git
pip3 install flask

二、DS18B20传感器配置

传感器部署可以查看我之前的教程(点击跳转

检查传感器

ls /sys/bus/w1/devices/

你应该看到类似28-xxxxxxxxxxxx的目录,这表示传感器已正确连接。

三、温度采集脚本开发

开发Python脚本

创建一个名为temperature_api.py的文件:

import os
from flask import Flask, jsonify
from datetime import datetime

app = Flask(__name__)

# DS18B20传感器路径
sensor_path = "/sys/bus/w1/devices/28-xxxxxxxxxx/w1_slave"  # 替换为你的传感器路径

def read_temp_raw():
    with open(sensor_path, 'r') as f:
        return f.readlines()

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c
    return None

@app.route('/api/temperature')
def temperature():
    try:
        temp_c = read_temp()
        return jsonify({
            "temperature": temp_c,
            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        })
    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5001)

替换传感器路径

sensor_path替换为你的实际传感器路径。可以通过以下命令找到:

ls /sys/bus/w1/devices/

四、启动API

使用nohup后台运行

nohup python3 temperature_api.py > /dev/null 2>&1 &

五、验证API可用性

使用curl测试API

在本地或远程服务器上运行以下命令,验证API是否可用:

curl http://127.0.0.1:5001/api/temperature

如果返回类似以下的JSON数据,说明API正常工作:

{
"temperature": 25.6,
"timestamp": "2024-10-09 15:30:45"
}

注意记得开放本地5001端口

六、樱花隧道端口映射

创建隧道

  1. 登录樱花隧道管理面板。
  2. 点击左侧的隧道列表,然后点击创建隧道
  3. 选择一个节点,隧道类型选择TCP
  4. 填写隧道名称,本地IP填写127.0.0.1,本地端口填写5001
  5. 远程端口可以自选,范围是10240-65535
  6. 点击创建按钮,完成隧道创建。

验证端口映射

  1. 在樱花隧道客户端中,查看隧道状态,确保隧道已启动。
  2. 在外部网络中,使用<樱花隧道分配的公网IP>:<远程端口>访问API,验证是否可以正常获取温度数据。

七、在WordPress中显示温度

编辑functions.php

在WordPress主题的functions.php文件中添加以下代码:

function display_temperature_shortcode() {
    $api_url = 'http://<樱花隧道分配的公网IP>:<远程端口>/api/temperature'; // 替换为你的API地址
    $response = wp_remote_get($api_url);

    if ( is_wp_error($response) ) {
        return '<p>Error retrieving temperature.</p>';
    }

    $data = json_decode(wp_remote_retrieve_body($response), true);

    if ( !isset($data['temperature']) ) {
        return '<p>No temperature data available.</p>';
    }

    return '<div class="temperature-display">
               <p>Current Temperature: ' . round($data['temperature'], 2) . '°C</p>
               <p>Timestamp: ' . $data['timestamp'] . '</p>
           </div>';
}
add_shortcode('temperature', 'display_temperature_shortcode');

显示温度

在WordPress文章或页面中插入以下短代码:

[temperature]

八、优化与注意事项

防火墙设置

确保防火墙允许API端口(默认5001):

sudo ufw allow 5001/tcp

使用 nohup& 可以让 API 在后台运行,并且即使关闭终端也不会停止运行。以下是具体步骤:

使用 nohup 和 & 启动 API

启动 loadavg_api.py

nohup python3 /root/loadavg_api.py > /dev/null 2>&1 &

启动 temperature_api.py

nohup python3 /root/temperature_api.py > /dev/null 2>&1 & 

2. 解释命令

  • nohup:使程序在后台运行,并且即使关闭终端也不会停止。
  • > /dev/null:将标准输出重定向到 /dev/null,即丢弃输出。
  • 2>&1:将标准错误重定向到标准输出。
  • &:将命令放到后台运行。

3. 设置开机自启

方法 1:使用 /etc/rc.local

  1. 编辑 /etc/rc.local 文件sudo nano /etc/rc.local
  2. 添加启动命令exit 0 之前添加以下行:nohup python3 /root/loadavg_api.py > /dev/null 2>&1 & nohup python3 /root/temperature_api.py > /dev/null 2>&1 &
  3. 保存并退出
  4. 确保 /etc/rc.local 可执行bash复制sudo chmod +x /etc/rc.local

4. 关闭 API

方法 1:使用 pkill 命令

  1. 查找 API 进程 ID (PID)bash复制ps aux | grep python3找到与你的 API 相关的进程,并记下其 PID。
  2. 停止进程bash复制sudo kill -9 <PID><PID> 替换为实际的进程 ID。

方法 2:使用 pkill 命令

  1. 停止 loadavg_api.py
  2. sudo pkill -f loadavg_api.py
  3. 停止 temperature_api.py
  4. sudo pkill -f temperature_api.py

此作者没有提供个人介绍
最后更新于 2025-02-12