MQTT服务器搭建与数据接收
使用paho-mqtt库实现MQTT服务器订阅功能,接收NBIoT模组上报的数据。NBIoT模组通常以JSON格式上报传感器数据。
import paho.mqtt.client as mqtt
import json
# MQTT配置
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
MQTT_TOPIC = "sensor/data"
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe(MQTT_TOPIC)
def on_message(client, userdata, msg):
try:
data = json.loads(msg.payload.decode())
print(f"Received data: {data}")
# 调用数据库存储函数
save_to_database(data)
except Exception as e:
print(f"Error processing message: {e}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.loop_forever()
数据库存储实现
使用SQLite或MySQL存储传感器数据,这里以SQLite为例。
import sqlite3
from datetime import datetime
def init_db():
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS sensor_readings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
device_id TEXT,
temperature REAL,
power REAL,
timestamp DATETIME
)
''')
conn.commit()
conn.close()
def save_to_database(data):
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('''
INSERT INTO sensor_readings (device_id, temperature, power, timestamp)
VALUES (?, ?, ?, ?)
''', (data['device_id'], data['temp'], data['power'], datetime.now()))
conn.commit()
conn.close()
Web服务实现
使用Flask创建REST API供前端调用。
from flask import Flask, jsonify
import sqlite3
app = Flask(__name__)
@app.route('/api/sensor_data', methods=['GET'])
def get_sensor_data():
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM sensor_readings ORDER BY timestamp DESC LIMIT 100')
rows = cursor.fetchall()
conn.close()
data = [{
'id': row[0],
'device_id': row[1],
'temperature': row[2],
'power': row[3],
'timestamp': row[4]
} for row in rows]
return jsonify(data)
if __name__ == '__main__':
init_db()
app.run(host='0.0.0.0', port=5000)
WebSocket实时推送
使用Flask-SocketIO实现实时数据推送。
from flask_socketio import SocketIO, emit
socketio = SocketIO(app, cors_allowed_origins="*")
# 修改on_message函数加入WebSocket推送
def on_message(client, userdata, msg):
try:
data = json.loads(msg.payload.decode())
print(f"Received data: {data}")
save_to_database(data)
socketio.emit('new_data', data) # 推送新数据到所有客户端
except Exception as e:
print(f"Error processing message: {e}")
@socketio.on('connect')
def handle_connect():
print('Client connected')
小程序端实现
小程序使用WebSocket连接后端服务。
// 小程序端代码
const socket = wx.connectSocket({
url: 'ws://your-server-ip:5000'
})
socket.onMessage((res) => {
const data = JSON.parse(res.data)
console.log('Received new data:', data)
// 更新页面数据
this.setData({
temperature: data.temperature,
power: data.power
})
})
完整系统部署
- 启动MQTT服务:
mosquitto -v - 运行Python脚本:
python main.py(整合所有代码) - 部署Flask应用:可使用Gunicorn或uWSGI
- 配置Nginx反向代理WebSocket连接
- 小程序端配置合法域名
数据可视化增强
使用ECharts或Chart.js实现数据可视化。
// 小程序端图表实现
import * as echarts from '../../ec-canvas/echarts'
function initChart(canvas, width, height) {
const chart = echarts.init(canvas, null, {
width: width,
height: height
})
canvas.setChart(chart)
const option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line'
}]
}
chart.setOption(option)
return chart
}
安全增强措施
- MQTT启用TLS加密
- 实现设备认证机制
- API接口添加JWT验证
- 数据库定期备份
- 实现数据分页查询避免性能问题
以上代码提供了从NBIoT设备数据接收、存储到前后端展示的完整实现方案,可根据实际需求调整数据库类型、通信协议和安全措施。
1930

被折叠的 条评论
为什么被折叠?



