commit b6156ae81d7114341f5659c6c6a7408aefa73c37 Author: Qangan Date: Fri Feb 23 10:00:48 2024 +0700 added all info here diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/accounts.json b/accounts.json new file mode 100644 index 0000000..6b9b537 --- /dev/null +++ b/accounts.json @@ -0,0 +1,6 @@ +[ + { + "username": "1", + "password": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b" + } +] \ No newline at end of file diff --git a/data.json b/data.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/data.json @@ -0,0 +1 @@ +{} diff --git a/esplistener/__init__.py b/esplistener/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/esplistener/__pycache__/__init__.cpython-311.pyc b/esplistener/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..37e238b Binary files /dev/null and b/esplistener/__pycache__/__init__.cpython-311.pyc differ diff --git a/esplistener/__pycache__/esplistener.cpython-311.pyc b/esplistener/__pycache__/esplistener.cpython-311.pyc new file mode 100644 index 0000000..1a7cfa6 Binary files /dev/null and b/esplistener/__pycache__/esplistener.cpython-311.pyc differ diff --git a/esplistener/esplistener.py b/esplistener/esplistener.py new file mode 100644 index 0000000..0f354ae --- /dev/null +++ b/esplistener/esplistener.py @@ -0,0 +1,109 @@ +import socket, json, random + +bufferSize = 1024 + +gets_data = {} + + +def initialize(): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.bind(('192.168.1.35', 7777)) + s.settimeout(0.5) + with open('data.json') as f: + data = json.load(f) + return [s, data] + +def update_json(data): + with open('data.json', 'w') as f: + json.dump(data, f) + +'''def get_smth(s, data): + req = {"SensorType": data} + while True: + print("Sending") + s.sendto(json.dumps(req).encode(), (('192.168.1.77', 7777))) + try: + a = s.recvfrom(bufferSize) + except: + continue + try: + j = json.loads(a[0].decode()) + if data in j.get('SensorType'): + print(j.get("value"), True) + s.sendto("GOT".encode(), ('192.168.1.77', 7777)) + else: + print(a[0].decode()) + continue + except Exception as err: + print("lol", err, a[0].decode()) + continue + + #finally: + #print("lol") +def change_smth(s, data, value): + req = {"SensorType": data, + "value": value} + while True: + try: + a = s.recvfrom(bufferSize) + j = json.loads(a[0].decode()) + if data in j.get("SensorType"): + print(j[data], True) + return j[data] + break + else: + print(a[0].decode()) + except Exception as err: + print(a) + continue +''' + +def send_command(s, SensorType: str,command: str, value = None): + if value: + req = {"Command": command, + "SensorType": SensorType, + "Value": value} + else: + req = {"Command": command, + "SensorType": SensorType} + + while True: + s.sendto(json.dumps(req).encode(), (('192.168.1.77', 7777))) + try: + a = s.recvfrom(bufferSize) + except: + continue + try: + response = json.loads(a[0].decode()) + if command == 'GetValue' and response["SensorType"] == SensorType: + print(j.get("Value"), True) + elif command == 'ChangeValue' and response["SensorType"] == SensorType: + print("Changed to " + str(value), True) + else: + continue + except Exception as err: + print("We've got an error: ", err, a[1]) + + +def check_sos(s): + '''req = {"SensorType": "SOS"} + while True: + s.sendto(json.dumps(req).encode(), (('192.168.1.77', 7777))) + try: + a = s.recvfrom(bufferSize) + except: + continue + try: + j = json.loads(a[0].decode()) + if data in j.get('SensorType'): + print(j.get("value"), True) + s.sendto("GOT".encode(), ('192.168.1.77', 7777)) + break + else: + print(a[0].decode()) + continue + except Exception as err: + print("lol", err, a[0].decode()) + continue + ''' + return json.dumps([{"stationName": str(random.randint(1,255)), "alertType": 'alert!!'}, {"stationName": str(random.randint(1,255)), "alertType": 'alert2!!'}]) diff --git a/mashinka.py b/mashinka.py new file mode 100644 index 0000000..0946906 --- /dev/null +++ b/mashinka.py @@ -0,0 +1,143 @@ +import requests, random, hashlib, json, os +from esplistener.esplistener import * +from flask import session, Flask, request, render_template, url_for, redirect + +initialize_data = initialize() + +socket, data = initialize_data[0], initialize_data[1] + +#get_smth(socket, "Temperature") +send_command(socket, "Temperature", "GetValue") + +app = Flask(__name__) +app.secret_key = '%TGHUI8uyFGHI(*&^5rUIO9i*&^TRfvgbHNJKLKJnhgfDE3WedFGhjKOlIuyTRe4567ioP:liuytr56&8()IuGTfrEdsXcghuy6' + + +def hash_data(data): + hashpass = hashlib.sha256() + hashpass.update(bytes(data, encoding='utf8')) + passw = hashpass.hexdigest() + return passw + +def create_account(login, password): + login, password = str(login), str(password) + if not os.path.exists('accounts.json'): + data = [] + else: + try: + with open('accounts.json', 'r') as file: + data = json.load(file) + for i in data: + if i['username'] == login: + print("found") + return 0 + except json.JSONDecodeError: + data = [] + password_entry = {'username': login, 'password': hash_data(password)} + data.append(password_entry) + with open('accounts.json', 'w') as file: + json.dump(data, file, indent=4) + return 1 +def login_into_account(session, login, password): + if not os.path.exists('accounts.json'): + return None + try: + with open('accounts.json', 'r') as file: + data = json.load(file) + except json.JSONDecodeError: + data = [] + for entry in data: + if entry['username'] == login and entry['password'] == hash_data(password): + session['loggedin'], session['username'] = True, login + return 1 + return 0 + + + +def define_session(session): + if 'loggedin' not in session.keys(): + session['loggedin'] = False + + + +def get_cur_speed(session): + if session['loggedin']: + return random.randint(1, 100) + return "no rights" + #return int(requests.post("http://"+ip+"/get_speed")) +#Основные страницы, индекс, и страницы лабораторий, авторизация +@app.route("/", methods = ["GET", "POST"]) +def index(): + define_session(session) + if session['loggedin'] == True: + cur_speed = 25 + if request.method == "POST": + cur_speed = request.form.get("slide") + return render_template("mashinka.html", cur_speed = cur_speed) + return render_template("mashinka.html", cur_speed = cur_speed) + else: + return render_template("index.html") + +@app.route('/register', methods = ["POST", "GET"]) +def register(): + if request.method == "GET": + if session['loggedin'] == True: + return redirect('/') + else: + return render_template("register.html", err = '') + else: + login = request.form.get('login') + passw = request.form.get('password') + if create_account(login, passw): + return redirect('/') + else: + return render_template("register.html", err='Такой пользователь уже существует') + +@app.route('/login', methods = ["POST", "GET"]) +def login(): + if request.method == 'GET': + if session['loggedin'] == True: + return redirect('/') + else: + return render_template("login.html", err = '') + else: + login = request.form.get('login') + passw = request.form.get('password') + print(passw) + if login_into_account(session, login, passw): + return redirect('/') + else: + return render_template("login.html", err="Неверный логин/пароль") + +#Общение с ЕСП +@app.route("/sos_check", methods = ["POST"]) +def sos_check(): + if random.randint(0,1): + return check_sos(socket) + else: + return '' +@app.route("/mashinka_go", methods = ["POST"]) +def mashinka_go(): + if session['loggedin']: + return '' + else: + return "" +@app.route("/mashinka_stop", methods = ["POST"]) +def mashinka_stop(): + if session['loggedin']: + return '' + else: + return "" +@app.route("/get_temperature", methods = ["POST"]) +def get_temperature(): + if session['loggedin']: + return 1 + else: + return '' + + + +if __name__ == '__main__': + app.run() + + diff --git a/templates/accounts.json b/templates/accounts.json new file mode 100644 index 0000000..d7f0314 --- /dev/null +++ b/templates/accounts.json @@ -0,0 +1,22 @@ +[ + { + "username": "1", + "password": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35" + }, + { + "username": "1", + "password": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35" + }, + { + "username": "1", + "password": "4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce" + }, + { + "username": "2", + "password": "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35" + }, + { + "username": "skillissue", + "password": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3" + } +] \ No newline at end of file diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..ee645f2 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,99 @@ + + + + + + + Mashinka Control + + + + + + + + + + + + + +
+

Вы не авторизированы

+
+ +       + +
+ + + + + + + + + + + + + + + + + diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..b9c385b --- /dev/null +++ b/templates/login.html @@ -0,0 +1,62 @@ + + + + + + + Mashinka Control + + + + + + + + + + + + + + +
+
+
+ + +
+

+
+ + +
+

+ +
+ {% if err != '' %} +

{{err}}

+ {% endif%} +
+ + + + + + + + + + + + diff --git a/templates/mashinka.bk b/templates/mashinka.bk new file mode 100644 index 0000000..28f539e --- /dev/null +++ b/templates/mashinka.bk @@ -0,0 +1,58 @@ + + + + + + + Mashinka controls + + + + + + + + + + + Seal Team + + + + + +
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+ + + + diff --git a/templates/mashinka.html b/templates/mashinka.html new file mode 100644 index 0000000..ceeb755 --- /dev/null +++ b/templates/mashinka.html @@ -0,0 +1,187 @@ + + + + + + + Mashinka Control + + + + + + + + + + + + + +
+ +
+ +

{{cur_speed}}

+ +
+ + +
+
+
+
+
+ +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/templates/register.html b/templates/register.html new file mode 100644 index 0000000..02f6312 --- /dev/null +++ b/templates/register.html @@ -0,0 +1,57 @@ + + + + + + + Mashinka Control + + + + + + + + + + + + + + +
+
+
+ + +
+

+
+ + +
+

+ +
+ {% if err != '' %} +

{{err}}

+ {% endif%} +
+ + + + + + + diff --git a/templates/unauthorized.html b/templates/unauthorized.html new file mode 100644 index 0000000..2c9950c --- /dev/null +++ b/templates/unauthorized.html @@ -0,0 +1,4 @@ + + + no rights + diff --git a/test.py b/test.py new file mode 100644 index 0000000..118cc13 --- /dev/null +++ b/test.py @@ -0,0 +1,81 @@ +from flask import Flask, request, redirect, url_for, render_template, json, render_template_string, jsonify + +app = Flask(__name__) + + +@app.route('/', methods=['GET', 'POST']) +def control_panel(): + print('request.form:', request.form) + + if request.method == 'POST': + if request.form.get('button') == 'button-play': + print("play button pressed") + + elif request.form.get('button') == 'button-exit': + print("exit button pressed") + + elif request.form.get('slide'): + volume = request.form.get('slide') + print('volume:', volume) + #return jsonify({'volume': volume}) + return json.dumps({'volume': volume}) + + print('render') + return render_template_string(''' + + + + + + + + + + Slider + + +
+
+
+
+ + + + + +
+
+
+
+ + + + + + + +''') + +if __name__ == '__main__': + app.run(debug=True, use_reloader=False) diff --git a/webs b/webs new file mode 100644 index 0000000..e69de29 diff --git a/webs.py b/webs.py new file mode 100644 index 0000000..16c41aa --- /dev/null +++ b/webs.py @@ -0,0 +1,94 @@ +import requests +import json +from flask import Flask, render_template, url_for, redirect, request, json +import hashlib + +app = Flask(__name__) + +app.secret_key = '%TGHUI8uyFGHI(*&^5rUIO9i*&^TRfvgbHNJKLKJnhgfDE3WedFGhjKOlIuyTRe4567ioP:liuytr56&8()IuGTfrEdsXcghuy6' + +print("OPEN YOUR ESP SERIAL PORT READER A AND ENDER IP") +ip = input() + +def hash_data(data): + hashpass = hashlib.sha256() + hashpass.update(bytes(password, encoding='utf8')) + passw = hashpass.hexdigest() + return passw + +def create_account(login, password): + passw = hash_data(password) + data = {'username': login, 'password': passw} + with open('accounts.json', 'rw') as f: + for entry in json.load(f): + if entry['username'] == login: + return 0 + json.dump(data, f) + return 1 +def login_into_account(session, login, password): + passw = hash_data(password) + with open('accounts.json', 'r') as f: + for entry in json.load(f): + if entry['username'] == login and entry["password"] == password: + session['loggedin'], session['username'] = True, login + return 1 + return 0 + + + + + +def get_status(): + return requests.get("http://"+ip+"/status").text + +@app.route('/', methods = ["GET", "POST"]) +def index(): + if session["loggedin"] == True: + stat = get_status().split() + led_status = int(stat[0]) + led_brightness = int(stat[1]) + if request.method == "POST": + if request.form.get("slide"): + brightness = request.form.get("slide") + print(brightness) + led_britghtness = change(brightness) + return render_template("index.html", led_status = led_status, led_brightness = led_brightness) + else: + return render_template("unauthorized.html") + +@app.route('/register', methods = ["POST", "GET"]) +def register(): + if request.method == "GET": + if session['loggedin'] == True: + return redirect('/') + else: + return render_template("register.html") + else: + data = request.args + login = data['login'] + passw = data['password'] + if create_account(login, passw): + return redirect('/') + else: + return render_template("register.html", err='Такой пользователь уже существует') + +@app.route('/login', methods = ["POST", "GET"]) +def login(): + if request.method == 'GET': + if session['loggedin'] == True: + return redirect('/') + else: + return render_template("login.html") + else: + data = request.args + login = data['login'] + passw = data['passw'] + if login_into_account(session, login, passw): + return redirect('/') + else: + return render_template("login.html", err="Неверный логин/пароль") + + + +if __name__ == '__main__': + app.ru() diff --git a/webserv/webserv.ino b/webserv/webserv.ino new file mode 100644 index 0000000..5e84469 --- /dev/null +++ b/webserv/webserv.ino @@ -0,0 +1,112 @@ +#include +#include + + +ESP8266WebServer server(80);//Создадим веб сервер на 80 порту +bool LEDstatus = LOW; +byte led_brightness = 0; + +void setup() { + Serial.begin(9600);// Настроим частоту Serial порта + delay(100); + pinMode(3, OUTPUT);// Настроим ножку светодиода на выход, чтобы управлять им + + Serial.println("Connecting to "); + Serial.println("node"); + //connect to your local wi-fi network + WiFi.mode(WIFI_STA);// Режим подключения к сторонней сети wi-fi + WiFi.begin("adm2", "98765432110"); + // Ждем пока статус соеденения не будет равен WL_CONNECTED , что означает что еsp успешно подключена к сети + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.print("."); + } + Serial.println(""); + Serial.println("WiFi connected..!"); + Serial.print("Got IP: "); Serial.println(WiFi.localIP());// Вывод ip esp + //Настройка путей и их обработчиков + server.on("/status", handle_status); + server.on("/ledon", HTTPMethod::HTTP_POST, handle_ledon); + server.on("/ledoff", HTTPMethod::HTTP_POST, handle_ledoff); + //Настройка обработчика ненайденного пути + server.on("/slider", HTTPMethod::HTTP_POST, handle_slider); + server.onNotFound(handle_NotFound); + //Запуск сервера + server.begin(); + Serial.println("HTTP server started"); +} +void loop() { + //Обработка запросов + server.handleClient(); + //Включение/Выключение светодиода. Помните у esp инвертированная логика светодиода на плате, поэтому LOW означает включить светодиод + /*if(LEDstatus) + {analogWrite(6, LOW);} + else + {analogWrite(6, HIGH);} +*/ +} + +void handle_status() { + Serial.println("LED: "); + Serial.println(LEDstatus); + //Отправка + server.send(200, "text/plain", String(not(LEDstatus))+" "+String(led_brightness));} + +void handle_slider(){ + if(!server.hasArg("brightness") or floor(atof(server.arg("brightness").c_str())) <= 0 or floor(atof(server.arg("brightness").c_str())) >= 256 ){ + server.send(400, "texp/plain", "Brightness argument must be 0 0) ? floor(atof(server.arg("brightness").c_str())) : 255; + analogWrite(3, led_brightness); + server.send(200, "text/plain", String(not(LEDstatus))); + + }else{ + + Serial.println("LED: 1"); + Serial.println(server.arg("timeout").c_str()); + LEDstatus = 0; + analogWrite(3, 255); + + delay(atof(server.arg("timeout").c_str())*1000); + //Отправка + LEDstatus = 1; + analogWrite(3, 0); + server.send(200, "text/plain", String(not(LEDstatus))); // +} +} + +void handle_ledoff() { + + + if( ! server.hasArg("timeout")){ + LEDstatus = 1; + led_brightness = 0; + analogWrite(3, led_brightness); + server.send(200, "text/plain", String(not(LEDstatus))); + }else{ + + Serial.println("LED: 0"); + Serial.println(server.arg("timeout").c_str()); + LEDstatus = 1; + analogWrite(3, 0); + delay(atof(server.arg("timeout").c_str())*1000); + //Отправка + LEDstatus = 0; + analogWrite(3, led_brightness); + server.send(200, "text/plain", String(not(LEDstatus))); //Код состояния 200 - OK, тип - text/plain, cами данные - String(LEDstatus) +} +} +//Код состояния 200 - OK, тип - text/plain, cами данные - String(LEDstatus) +void handle_NotFound(){ +//Отправка + server.send(404, "text/plain", "Not found"); //Код состояния 404 - не найдено, тип - text/plain, cами данные - "Not found" +}