This repository has been archived by the owner on Apr 27, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
258 lines (203 loc) · 15.1 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
#
# The main file with the server code.
# The server for the WEB application is configured to work on web sockets.
# The server concept is based on a TPC connection
# The storage location of the user database,
# with their history and other confidential information
#
# To start the server, you need to register
# >> pip install -r requirements.txt
#
# Then run
# >> python server.py
#
import sys
sys.path.append('../')
from AI.main import Network
from datarequest import *
from database import *
import websockets
import asyncio
import pathlib
import socket
import random
import json
import ssl
# получаем имя компьютера в сети и находим по ARP таблице его IP адресс
IP:str = socket.gethostbyname(socket.gethostname())
# 1-65535, но не {22, 23, 80, 443, 1, 5000, 8000}
PORT:int = 8090
SENDREQUEST:bool = False
print(f"IP SERVER: {IP}\nPORT: {PORT}\n")
# Словарь, содержащий в себе рекомендации для разных уровней подготовки.
RECOMMENDATION:dict = {
"1":[
"Начинайте с небольших поездок, чтобы ваш организм мог постепенно привыкнуть к физической нагрузке. Не старайтесь сразу преодолевать большие дистанции.",
"Начинайте с умеренного темпа. С течением времени вы сможете увеличивать скорость.",
"Чаще обращайте внимание на статичтику, по ней вы смоежте отследить собственный прогресс",
"Научитесь эффективно использовать педали, равномерно распределяя усилие на обе ноги. Это поможет снизить нагрузку на мышцы и суставы.",
"Важно пить достаточное количество воды во время поездок, чтобы избежать обезвоживания.",
"Внимательно отслеживайте свои ощущения. Если у вас болит что-то или вы устали, предоставьте себе достаточно времени на отдых и восстановление.",
"Поддерживайте ритм дыхания. Оптимальная дыхательная техника поможет улучшить выносливость и уменьшить усталость во время поездки.",
"Перед тяжелыми тренировками уделяйте внимание разминке и растяжке. Это поможет предотвратить травмы и улучшить гибкость мышц.",
"Выбирайте разнообразные маршруты. Это не только делает тренировки интереснее, но также разнообразит нагрузку на различные группы мышц.",
"Включайте кратковременные интервалы более высокой интенсивности в ваши поездки. Это поможет улучшить физическую форму и эффективность тренировок."
],
"2":[
"Экспериментируйте с различными видами тренировок, такими как велосипедные тренировки высокой интенсивности (HIIT) или длинные дистанционные поездки, чтобы разнообразить свою тренировочную программу.",
"Настройте свои тренировки в соответствии с целями: развивайте выносливость для длинных поездок или работайте над скоростью и мощностью для коротких и интенсивных тренировок.",
"Развивайте навыки пилотирования велосипеда, такие как навыки спусков и управление в сложных условиях, чтобы повысить уверенность и безопасность на дороге.",
"Понемногу увеличивайте темпы тренировок.",
"Планируйте долгосрочные тренировочные циклы с периодами активного тренировочного нагрузки и периодами восстановления, чтобы избежать перетренировки и повысить производительность.",
"Можете поучавтствовать в мероприятиях, таких как веломарафоны или групповые поездки, чтобы наслаждаться обществом других велосипедистов и находить новые вызовы.",
"Не забывайте про отдых!",
"Поддерживайте свое физическое здоровье, регулярно занимаясь растяжкой и укрепляя мышцы, чтобы предотвращать повреждения и улучшать общую производительность.",
"Планируйте ваши тренировки в зависимости от времени суток и условий погоды, чтобы адаптироваться к переменам и сохранять регулярность тренировок.",
"Регулярно обновляйте свой велосипедный экипаж и оборудование, чтобы поддерживать и улучшать ваш опыт велосипедиста.",
],
"3":[
"Отправляйтесь в большие и долгие поездки. Это положителньо скажется на вашем здоровье.",
'Применяйте методику "интервальной тренировки", разделяя тренировку на интенсивные и восстановительные периоды, для улучшения аэробной и анаэробной выносливости.',
'Используйте технику "тренировочного блочного периода", чтобы фокусироваться на конкретных аспектах подготовки, например, силовых тренировках или улучшении техники велосипедного движения.',
"Чаще проводите анализ данных с прошлых соревнований, выделяя сильные и слабые стороны своей подготовки, и разрабатывайте индивидуализированные программы тренировок.",
"Чаще учавствуте в вело-соревнованиях.",
"Соревнуйтесь с другими велосипедистами в скорости и выносливости.",
"Практикуйте тренировки на выносливость в условиях имитации реальных гонок, чтобы адаптировать свои стратегии согласно требованиям соревновательной динамики.",
"Работайте над техникой спусков и кривых с высокой скоростью, чтобы увеличить свою уверенность в технически сложных условиях.",
"Участвуйте в международных соревнованиях и гонках, чтобы испытать свои силы с ведущими велосипедистами со всего мира и поддерживать высокий уровень мотивации.",
"Внедряйте в тренировочный процесс технологии анализа биометрии, такие как мониторинг мощности и измерение частоты вращения педалей, для более детального контроля за тренировками и оптимизации производительности. Используйте из по максимуму."
]
}
# реализация модели нейронной сети
network = Network(file="data.csv")
async def main(websocket, path) -> None:
'''
A function describing how the server request handler works.
'''
try:
# получаем полный запрос от клиента
fromClient = await websocket.recv()
# обработанный ответ
data:dict = json.loads(fromClient)
# оформление запроса
task = data[0]
# если пришел запрос на авторизацию пользователя
if task == "SignIn":
# если пользователь есть и пароль подходит
if data[1] in getUsers() and data[2]==getUserPassword(data[1]):
await websocket.send("Success")
else:
await websocket.send("Failed")
# обработка запроса на регистрацию пользователя
elif task == "SignUp":
if addUsers(data[1], data[2]) == "Success":
await websocket.send("Success")
else:
await websocket.send("Failed")
elif task=="GetPulse":
pulses = get_data_from_server()['data']['pulse']
minPulse = pulses['min']
maxPulse = pulses['max']
avgPulse = pulses['avg']
# отправляем данные
data = [minPulse, maxPulse, avgPulse]
await websocket.send(json.dumps(data, ensure_ascii=False))
# получение данных об истории
elif task == "GetHistory":
history = getHistory(data[1])
await websocket.send(json.dumps(history))
elif task == "GetUserStatic":
history = getHistory(data[1])
newdata = [
[elem[4] for elem in history],
[elem[7] for elem in history],
[elem[8] for elem in history],
[elem[10] for elem in history]
]
await websocket.send(json.dumps(newdata, ensure_ascii=False))
# получить данные о всех планах
elif task == "GetPlans":
result = getRoutes(data[1])
await websocket.send(json.dumps(result, ensure_ascii=False))
elif task == "DeleteAccount":
if getUserPassword(data[1]) == data[2]:
deleteUser(data[1])
await websocket.send("Success")
else:
await websocket.send("Failed")
# удалить поездку, если она не нужна
elif task == "DeleteWay":
# получаем логин и название для поздки
login = data[1]
name = data[2]
# удаляем ее из БД
deleteRoute(login, name)
# отправляем ответ
await websocket.send("Success")
# удалить поездку, если она не нужна
elif task == "DeleteHistory":
# получаем логин и название для поздки
login = data[1]
name = data[2]
# удаляем ее из БД
deleteHistory(login, name)
# отправляем ответ
await websocket.send("Success")
# запланировать поездку и добавить ее в базу данных поездок
elif task == "AddPlan":
login = data[1]
name = data[2]
# дата в формет {ГОД-МЕСЯЦ-ДЕНЬ}
date = data[3]
one = data[4]
two = data[5]
# пусть координаты будут выглядеть так:
# X1;Y1
# X2;Y2
startPoint = str(one[0]) + "; " + str(one[1])
endPoint = str(two[0]) + "; " + str(two[1])
length = data[6]
time = data[7]
level = network.getNewResult()
addRoute(login, name, level, date, startPoint, endPoint, length, time)
await websocket.send("Success")
# обработать запрос на завершение запланированной поездки
# сразу разделим данные и сохраним в БД
elif task == "CompletePlan":
login = data[1]
name = data[2]
level = data[3]
date = data[4]
startPoint = data[5]
endPoint = data[6]
maxPulse = data[7]
minPulse = data[8]
averagePulse = data[9]
lengthWay = data[10]
time = data[11]
deleteRoute(login, name)
addHistory(login, name, level, date, startPoint, endPoint, maxPulse, minPulse, averagePulse, lengthWay, time)
await websocket.send("Success")
# отправка ответа на запрос на получение рекомендаций пользователю
elif task == "GetRecomend":
info = data[1]
await websocket.send(random.choices(RECOMMENDATION[str(info)]))
else:
print(f"Неизвестный тип запроса: {task}")
await websocket.send("Failed")
except:
print("Disconnect")
if __name__=="__main__":
# создаем все таблицы
createDataBaseUsers()
createDataBaseRoute()
createDataBaseHistory()
addUsers("login", "1234")
# addHistory("login", "test", 1, "2024-12-12", "5422352; 23424", "324234; 234324", 45.4, 11.4, 12, 12345.3, 1000)
# обработчик запросов
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(certfile=pathlib.Path(__file__).with_name("server.crt"),
keyfile=pathlib.Path(__file__).with_name("server.key"))
servercode = websockets.serve(main, IP, PORT, ssl=ssl_context)
asyncio.get_event_loop().run_until_complete(servercode)
asyncio.get_event_loop().run_forever()