signal-tracker / app.py
vumichien's picture
Upload Flask app
a11f31d
raw
history blame
5.06 kB
from flask import Flask, request, jsonify, render_template
from models import db, WifiSignal
from datetime import datetime, timedelta
import random
import folium
from folium.plugins import MarkerCluster
from flasgger import Swagger
# Chỉ định đường dẫn instance_path hợp lệ
app = Flask(__name__, instance_path='/tmp')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# Khởi tạo Swagger
swagger = Swagger(app)
db.init_app(app)
@app.route('/api/generate-data', methods=['POST'])
def generate_data():
"""
Generate demo data.
---
tags:
- Data Management
responses:
201:
description: Demo data generated successfully
"""
base_latitude = 35.6837
base_longitude = 139.6805
start_date = datetime(2024, 8, 1)
end_date = datetime(2024, 8, 7)
delta = end_date - start_date
for _ in range(100):
random_days = random.randint(0, delta.days)
random_seconds = random.randint(0, 86400)
random_time = start_date + timedelta(days=random_days, seconds=random_seconds)
random_latitude = base_latitude + random.uniform(-0.01, 0.01)
random_longitude = base_longitude + random.uniform(-0.01, 0.01)
random_signal_strength = random.randint(10, 50)
wifi_signal = WifiSignal(
latitude=random_latitude,
longitude=random_longitude,
timestamp=random_time,
signal_strength=random_signal_strength
)
db.session.add(wifi_signal)
db.session.commit()
return jsonify({"message": "Demo data generated successfully"}), 201
@app.route('/api/delete-data', methods=['DELETE'])
def delete_data():
"""
Delete all data in the database.
---
tags:
- Data Management
responses:
200:
description: All data deleted successfully
500:
description: An error occurred
"""
try:
num_rows_deleted = db.session.query(WifiSignal).delete()
db.session.commit()
return jsonify({"message": f"Deleted {num_rows_deleted} rows from the database."}), 200
except Exception as e:
db.session.rollback()
return jsonify({"message": f"An error occurred: {str(e)}"}), 500
@app.route('/api/upload', methods=['POST'])
def upload_data():
"""
Upload WiFi signal data.
---
tags:
- Data Management
parameters:
- name: body
in: body
required: true
schema:
type: object
properties:
latitude:
type: number
example: 35.6895
longitude:
type: number
example: 139.6917
timestamp:
type: string
example: "2024-08-29 14:30:00"
signal_strength:
type: integer
example: 42
responses:
201:
description: Data uploaded successfully
400:
description: Invalid input
"""
data = request.json
latitude = data.get('latitude')
longitude = data.get('longitude')
timestamp = datetime.strptime(data.get('timestamp'), '%Y-%m-%d %H:%M:%S')
signal_strength = data.get('signal_strength')
wifi_signal = WifiSignal(latitude=latitude, longitude=longitude, timestamp=timestamp, signal_strength=signal_strength)
db.session.add(wifi_signal)
db.session.commit()
return jsonify({"message": "Data uploaded successfully"}), 201
@app.route('/', methods=['GET'])
def show_map():
start_date = request.args.get('start_date')
end_date = request.args.get('end_date')
query = WifiSignal.query
if start_date and end_date:
start_datetime = datetime.strptime(start_date, '%Y-%m-%d')
end_datetime = datetime.strptime(end_date, '%Y-%m-%d')
query = query.filter(WifiSignal.timestamp >= start_datetime, WifiSignal.timestamp <= end_datetime)
signals = query.all()
signal_data = [(signal.latitude, signal.longitude, signal.signal_strength) for signal in signals]
if signal_data:
min_signal = min(s[2] for s in signal_data)
max_signal = max(s[2] for s in signal_data)
else:
min_signal = max_signal = 1
m = folium.Map(location=[35.6837, 139.6805], zoom_start=12)
marker_cluster = MarkerCluster().add_to(m)
for lat, lon, signal_strength in signal_data:
if max_signal - min_signal != 0:
radius = 5 + 10 * ((signal_strength - min_signal) / (max_signal - min_signal))
else:
radius = 15
folium.CircleMarker(
location=[lat, lon],
radius=radius,
popup=f'Signal Strength: {signal_strength}',
color='blue',
fill=True,
fill_opacity=0.6
).add_to(marker_cluster)
map_html = m._repr_html_()
return render_template('map.html', map_html=map_html)
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)