Upload files to "/"
This commit is contained in:
parent
1fd146c333
commit
081992d39e
|
|
@ -0,0 +1,69 @@
|
|||
from time import sleep
|
||||
|
||||
import machine
|
||||
|
||||
import auth_manager
|
||||
import receiver
|
||||
import wifi_manager
|
||||
import uasyncio as asyncio
|
||||
from machine import Pin
|
||||
import time
|
||||
|
||||
def blink_led():
|
||||
led_onboard = Pin("LED", Pin.OUT)
|
||||
for i in range(0,100):
|
||||
led_onboard.on()
|
||||
sleep(0.1)
|
||||
led_onboard.off()
|
||||
sleep(0.1)
|
||||
|
||||
async def main():
|
||||
led_onboard = Pin("LED", Pin.OUT)
|
||||
led_onboard.off()
|
||||
|
||||
#Status zeichen wenn wifi manager an
|
||||
wlan = wifi_manager.get_connection()
|
||||
if wlan is None:
|
||||
print("Could not initialize the network connection.")
|
||||
blink_led()
|
||||
while True:
|
||||
pass # you shall not pass :D
|
||||
print(wlan)
|
||||
|
||||
|
||||
jwt = create_jwt()
|
||||
receiver_obj = connect_receiver(jwt)
|
||||
|
||||
#status pi hochgefahren und aktiv
|
||||
await asyncio.gather(
|
||||
receiver_obj.listen(),
|
||||
check_button_pressed(),
|
||||
receiver_obj.ping_pong()
|
||||
)
|
||||
|
||||
def create_jwt():
|
||||
try:
|
||||
jwt = auth_manager.get_jwt()
|
||||
except:
|
||||
#Falls eine Exception fliegt, ist es wahrscheinlich ein Timeout, das kommt vor, wenn ein Socket noch offen ist
|
||||
machine.reset()
|
||||
if jwt is None:
|
||||
print("Could not create JWT.")
|
||||
machine.soft_reset()
|
||||
blink_led()
|
||||
while True:
|
||||
pass # you shall not pass :D
|
||||
print(jwt)
|
||||
return jwt
|
||||
|
||||
def connect_receiver(jwt):
|
||||
rec = receiver.receiver()
|
||||
rec.connect(jwt)
|
||||
return rec
|
||||
|
||||
async def check_button_pressed():
|
||||
while True:
|
||||
print("Tue andere Dinge...")
|
||||
await asyncio.sleep(2)
|
||||
|
||||
asyncio.run(main())
|
||||
|
|
@ -0,0 +1,178 @@
|
|||
import re
|
||||
import uasyncio as asyncio
|
||||
|
||||
import usocket as socket
|
||||
import ssl
|
||||
import ubinascii
|
||||
import os
|
||||
|
||||
from machine import Pin, PWM
|
||||
from time import sleep
|
||||
|
||||
|
||||
# Frequenz und Duty-Cycle einstellen
|
||||
async def beep(frequency=1000, duration=0.5):
|
||||
beeper = PWM(Pin(15))
|
||||
beeper.freq(frequency) # Frequenz in Hz
|
||||
beeper.duty_u16(32768) # 50 % Duty-Cycle (65535/2)
|
||||
sleep(duration / 1000)
|
||||
beeper.duty_u16(0) # Ton aus
|
||||
|
||||
async def on_message(message):
|
||||
led_onboard = Pin("LED", Pin.OUT)
|
||||
# LED einschalten
|
||||
led_onboard.on()
|
||||
led_onboard.high()
|
||||
# 5 Sekunden warten
|
||||
await asyncio.sleep(message)
|
||||
# LED ausschalten
|
||||
led_onboard.low()
|
||||
led_onboard.off()
|
||||
|
||||
def extract_times(data) -> tuple[int, int]:
|
||||
"""
|
||||
Extract paused and pressed times from a bytes object.
|
||||
|
||||
Args:
|
||||
data (bytes): The raw byte sequence containing the pattern 'paused:<num>;pressed:<num>;'
|
||||
|
||||
Returns:
|
||||
tuple[int, int]: (paused_time, pressed_time)
|
||||
"""
|
||||
# If data is bytes, decode it
|
||||
# if isinstance(data, bytes):
|
||||
# text = data.decode(errors="ignore")
|
||||
# else:
|
||||
text = str(data)
|
||||
match = re.search(r'paused:(\d+);pressed:(\d+);', text)
|
||||
if not match:
|
||||
print("Could not find paused/pressed times in data")
|
||||
raise ValueError("Could not find paused/pressed times in data")
|
||||
return {"paused": int(match.group(1)), "pressed": int(match.group(2))}
|
||||
|
||||
class receiver:
|
||||
|
||||
def __init__(self):
|
||||
self.host = "tcs-communication.bogner.systems"
|
||||
self.port = 443
|
||||
self.websocket_route = "/messages/receive"
|
||||
self.sock = socket.socket()
|
||||
self.jwt = ""
|
||||
self.connected = False
|
||||
|
||||
def connect(self, jwt):
|
||||
self.jwt = jwt
|
||||
self.sock = socket.socket()
|
||||
|
||||
# Setup WebSocket
|
||||
addr_info = socket.getaddrinfo(self.host, self.port)
|
||||
addr = addr_info[0][-1]
|
||||
|
||||
self.sock.connect(addr)
|
||||
self.sock.setblocking(False)
|
||||
self.sock = ssl.wrap_socket(self.sock, server_hostname=self.host)
|
||||
|
||||
key = ubinascii.b2a_base64(os.urandom(16)).strip().decode()
|
||||
|
||||
handshake = (
|
||||
"GET {} HTTP/1.1\r\n"
|
||||
"Host: {}\r\n"
|
||||
"Upgrade: websocket\r\n"
|
||||
"Connection: Upgrade\r\n"
|
||||
"Sec-WebSocket-Key: {}\r\n"
|
||||
"Sec-WebSocket-Version: 13\r\n"
|
||||
"Authorization: Bearer {}\r\n"
|
||||
"\r\n"
|
||||
).format(self.websocket_route, self.host, key, jwt)
|
||||
|
||||
self.sock.send(handshake.encode())
|
||||
|
||||
switching_protocol_confirm = self.sock.recv(1024)
|
||||
print(switching_protocol_confirm)
|
||||
if switching_protocol_confirm is None:
|
||||
return True
|
||||
if "101 Switching Protocols" not in switching_protocol_confirm:
|
||||
return False
|
||||
self.connected = True
|
||||
return None
|
||||
|
||||
async def ping_pong(self):
|
||||
try:
|
||||
while True:
|
||||
print("ping - pong")
|
||||
await self.sock.send("ping") # oder ws.ping()
|
||||
await asyncio.sleep(15) # alle 20s
|
||||
except Exception as e:
|
||||
print("Verbindung geschlossen:", e)
|
||||
|
||||
async def listen(self):
|
||||
while True:
|
||||
try:
|
||||
response = self.sock.recv(1024)
|
||||
print(f"Received data: {response}") # Besseres Logging
|
||||
|
||||
|
||||
|
||||
# Ignoriere leere Nachrichten
|
||||
if not response and not response == b'':
|
||||
await asyncio.sleep(0.1)
|
||||
continue
|
||||
|
||||
if response == b'' or len(response) == 0 or response.strip() == b'':
|
||||
print("beadslfjdsalk")
|
||||
await self.do_reconnect()
|
||||
|
||||
try:
|
||||
payload = extract_times(response)
|
||||
print(f"Extracted payload: {payload}")
|
||||
|
||||
sleep_time = payload["paused"] / 1000
|
||||
# Zusätzliche Validierung
|
||||
if sleep_time < 10:
|
||||
await asyncio.sleep(sleep_time)
|
||||
print(f"Sleep time too long: {sleep_time}ms")
|
||||
|
||||
await on_message(payload["pressed"] / 1000)
|
||||
|
||||
except ValueError as e:
|
||||
print(f"Parsing error: {e}")
|
||||
await asyncio.sleep(0.1)
|
||||
|
||||
except OSError as e:
|
||||
print(f"Socket error: {e}")
|
||||
try:
|
||||
print("Attempting reconnect...")
|
||||
self.sock.close() # Explizit alte Verbindung schließen
|
||||
await asyncio.sleep(1) # Kurz warten vor Reconnect
|
||||
self.connect(self.jwt)
|
||||
except Exception as reconnect_error:
|
||||
print(f"Reconnect failed: {reconnect_error}")
|
||||
await asyncio.sleep(5) # Längere Wartezeit bei Reconnect-Fehler
|
||||
|
||||
|
||||
async def do_reconnect(self):
|
||||
self.connected = False
|
||||
try:
|
||||
print("Closing old connection...")
|
||||
self.sock.close()
|
||||
except:
|
||||
pass
|
||||
|
||||
retry_count = 0
|
||||
max_retries = 3
|
||||
while not self.connected and retry_count < max_retries:
|
||||
try:
|
||||
retry_count += 1
|
||||
print(f"Reconnect attempt {retry_count}/{max_retries}")
|
||||
self.connect(self.jwt)
|
||||
await asyncio.sleep(3)
|
||||
if self.connected:
|
||||
print("Reconnect successful!")
|
||||
return True
|
||||
except Exception as reconnect_error:
|
||||
print(f"Reconnect attempt {retry_count} failed: {reconnect_error}")
|
||||
if retry_count < max_retries:
|
||||
await asyncio.sleep(retry_count * 2) # Exponentieller Backoff
|
||||
|
||||
print("All reconnect attempts failed")
|
||||
return False
|
||||
Loading…
Reference in New Issue