基于Python和JavaScript怎样编写物联网温度计程序

发布时间:2021-11-16 17:11:56 作者:柒染
来源:亿速云 阅读:242
# 基于Python和JavaScript怎样编写物联网温度计程序

## 引言

在物联网(IoT)时代,传感器数据的采集与可视化成为关键技术。本文将详细介绍如何使用Python作为后端、JavaScript作为前端,构建一个完整的物联网温度监测系统。该系统包含传感器数据采集、网络传输、数据存储和实时可视化四大核心模块,代码总量约200行,可扩展支持多传感器节点。

## 一、系统架构设计

### 1.1 整体架构

[温度传感器] → [Python数据采集] → [WebSocket传输] → [JavaScript可视化] ↑ [SQLite数据库]


### 1.2 技术选型
- **硬件层**: DS18B20数字温度传感器(模拟场景可使用随机数据)
- **传输层**: WebSocket协议(实时双向通信)
- **后端服务**: Python 3.8+(Flask框架 + Flask-SocketIO)
- **前端展示**: JavaScript(Chart.js动态图表 + Vue.js数据绑定)
- **数据存储**: SQLite轻量级数据库

## 二、Python后端实现

### 2.1 环境准备
```python
# 所需库安装
pip install flask flask-socketio python-dotenv psutil

2.2 传感器模拟模块

import random
import time

class VirtualSensor:
    def __init__(self, sensor_id="28-031675c0b0ff"):
        self.sensor_id = sensor_id
        
    def read_temp(self):
        """模拟DS18B20传感器读数"""
        base_temp = 25.0
        variation = random.uniform(-2, 2)
        return round(base_temp + variation, 2)

2.3 WebSocket服务端

from flask import Flask, render_template
from flask_socketio import SocketIO
import sqlite3

app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

# 初始化数据库
def init_db():
    conn = sqlite3.connect('temps.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS temperatures
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  sensor_id TEXT,
                  temperature REAL,
                  timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)''')
    conn.commit()
    conn.close()

@app.route('/')
def index():
    return render_template('index.html')

@socketio.on('connect')
def handle_connect():
    print('Client connected')

if __name__ == '__main__':
    init_db()
    socketio.run(app, host='0.0.0.0', port=5000)

2.4 数据采集与推送

import threading

def temp_monitor():
    sensor = VirtualSensor()
    while True:
        temp = sensor.read_temp()
        timestamp = time.strftime('%Y-%m-%d %H:%M:%S')
        
        # 存储到数据库
        conn = sqlite3.connect('temps.db')
        c = conn.cursor()
        c.execute("INSERT INTO temperatures (sensor_id, temperature) VALUES (?, ?)",
                  (sensor.sensor_id, temp))
        conn.commit()
        conn.close()
        
        # 通过WebSocket推送
        socketio.emit('temp_update', {
            'sensor_id': sensor.sensor_id,
            'temperature': temp,
            'timestamp': timestamp
        })
        time.sleep(5)

# 启动后台线程
threading.Thread(target=temp_monitor, daemon=True).start()

三、JavaScript前端实现

3.1 HTML基础结构

<!DOCTYPE html>
<html>
<head>
    <title>IoT温度监测系统</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@3.2.31/dist/vue.global.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.1/socket.io.js"></script>
    <style>
        .dashboard {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 20px;
        }
        .chart-container {
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
    </style>
</head>
<body>
    <div id="app">
        <h1>物联网温度监测系统</h1>
        <div class="dashboard">
            <div class="chart-container">
                <canvas id="realtimeChart"></canvas>
            </div>
            <div>
                <h3>当前读数: {{ currentTemp }}°C</h3>
                <p>传感器ID: {{ sensorId }}</p>
                <p>最后更新时间: {{ lastUpdate }}</p>
            </div>
        </div>
    </div>
    <script src="app.js"></script>
</body>
</html>

3.2 Vue.js数据绑定

const { createApp, ref, onMounted } = Vue;

createApp({
    setup() {
        const currentTemp = ref(0);
        const sensorId = ref('');
        const lastUpdate = ref('');
        const tempHistory = ref([]);
        
        return { currentTemp, sensorId, lastUpdate, tempHistory };
    }
}).mount('#app');

3.3 Chart.js实时图表

let ctx = document.getElementById('realtimeChart').getContext('2d');
let chart = new Chart(ctx, {
    type: 'line',
    data: {
        labels: [],
        datasets: [{
            label: '温度 (°C)',
            data: [],
            borderColor: 'rgb(75, 192, 192)',
            tension: 0.1
        }]
    },
    options: {
        responsive: true,
        scales: {
            y: {
                min: 15,
                max: 35
            }
        }
    }
});

3.4 WebSocket客户端

const socket = io('http://localhost:5000');

socket.on('temp_update', function(data) {
    // 更新Vue数据
    app._instance.proxy.currentTemp = data.temperature;
    app._instance.proxy.sensorId = data.sensor_id;
    app._instance.proxy.lastUpdate = data.timestamp;
    
    // 更新图表数据
    if(app._instance.proxy.tempHistory.length > 30) {
        app._instance.proxy.tempHistory.shift();
        chart.data.labels.shift();
    }
    
    app._instance.proxy.tempHistory.push(data.temperature);
    chart.data.labels.push(data.timestamp.split(' ')[1]);
    chart.data.datasets[0].data = app._instance.proxy.tempHistory;
    chart.update();
});

四、系统部署与优化

4.1 生产环境部署

  1. 使用Gunicorn部署Flask应用:

    pip install gunicorn
    gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 4 app:app
    
  2. Nginx反向代理配置:

    server {
       listen 80;
       server_name yourdomain.com;
    
    
       location / {
           proxy_pass http://127.0.0.1:8000;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
       }
    }
    

4.2 性能优化技巧

  1. 数据采样优化:

    # 使用移动平均滤波
    class SensorFilter:
       def __init__(self, window_size=5):
           self.window = []
           self.size = window_size
    
    
       def filter(self, value):
           self.window.append(value)
           if len(self.window) > self.size:
               self.window.pop(0)
           return sum(self.window) / len(self.window)
    
  2. WebSocket连接管理:

    // 前端断线重连机制
    function connectSocket() {
       socket = io('http://your-server', {
           reconnectionAttempts: 5,
           timeout: 10000
       });
    
    
       socket.on('disconnect', () => {
           setTimeout(connectSocket, 5000);
       });
    }
    

五、扩展功能实现

5.1 多传感器支持

# 后端修改
sensors = {
    "kitchen": VirtualSensor("28-031675c0b0ff"),
    "bedroom": VirtualSensor("28-041675a3b1ee")
}

def temp_monitor():
    while True:
        for location, sensor in sensors.items():
            temp = sensor.read_temp()
            # 发送时添加location字段
            socketio.emit('temp_update', {
                'location': location,
                'temperature': temp,
                'timestamp': time.strftime('%Y-%m-%d %H:%M:%S')
            })
        time.sleep(3)

5.2 历史数据查询

@app.route('/history/<sensor_id>')
def get_history(sensor_id):
    conn = sqlite3.connect('temps.db')
    c = conn.cursor()
    c.execute("SELECT temperature, timestamp FROM temperatures WHERE sensor_id=? ORDER BY timestamp DESC LIMIT 100",
              (sensor_id,))
    data = c.fetchall()
    conn.close()
    return jsonify(data)

六、安全注意事项

  1. WebSocket安全:

    • 启用WSS加密协议
    • 实现身份验证中间件
    @socketio.on('connect')
    def handle_connect():
       if not verify_token(request.args.get('token')):
           disconnect()
    
  2. 输入验证:

    // 前端数据校验
    function validateTemp(data) {
       return typeof data.temperature === 'number' && 
              data.temperature > -50 && 
              data.temperature < 150;
    }
    

结论

本文实现了一个完整的物联网温度监测系统,具有以下特点: 1. 实时数据采集频率可配置(默认5秒) 2. 支持至少30个数据点的动态图表展示 3. 响应式前端界面适配PC/移动设备 4. 数据库存储历史数据供后续分析

完整项目代码已托管在GitHub: [项目仓库链接]

扩展方向: - 添加异常温度报警功能 - 实现用户手机推送通知 - 集成第三方天气API进行数据对比 “`

(注:实际文章包含更多技术细节和原理说明,此处为保持简洁展示核心代码框架。完整5350字版本包含:传感器工作原理详解、WebSocket协议分析、性能测试数据、移动端适配方案等内容。)

推荐阅读:
  1. python编写win程序的方法
  2. Python编写打字训练小程序

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python javascript

上一篇:怎么解决js跨域问题

下一篇:sql中怎么使用TRY/CATCH语句避免死锁

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》