# webcontrol.py # Fernsteuerung vom Browser via TCP # (C) 2021 Juergen Grzesina # released under MIT-License (MIT) # http://www.grzesina.de/az/weihnachtsbaum/MIT-License.txt # from machine import Pin, I2C from oled import OLED # ******************** Network stuff ******************** from time import sleep,ticks_ms, sleep_ms try: import usocket as socket except: import socket import ubinascii import network statusLed=Pin(18,Pin.OUT,value=0) # blau=2 onairLed=Pin(19,Pin.OUT,value=0) # gruen=1 errorLed=Pin(23,Pin.OUT,value=0) # rot=0 led=[errorLed,onairLed,statusLed ] red,green,blue=0,1,2 request = bytearray(50) response="" taste=Pin(0,Pin.IN,Pin.PULL_UP) # Auswahl der Betriebsart Netzwerk oder Tastatur: # -------------------------------------------------------- # Netzwerk: Setzen Sie genau !_EINE_! Variable auf True WLANconnect=True # Netzanbindung ueber lokales WLAN ownAP=False # Netzanbindung ueber eigenen Accessppoint # beide False ->> Befehlseingabe ueber PC + USB in Testphase # Falls WLANconnect=True: # Geben Sie hier die Credentials Ihres WLAN-Accesspoints an mySid = 'YOUR_SSID'; myPass = "YOUR_PASSWORD" myIP="10.0.1.181" myPort=9002 # Initialisieren der Schnittstellen ********************** i2c=I2C(-1,scl=Pin(22),sda=Pin(21)) d=OLED(i2c) #schichtPin = [32,33,25,27,26,12] # sortiert schichtPin = [32,26,33,27,25,12] # verteilt schicht=[0]*6 for i in range(6): schicht[i]=Pin(schichtPin[i],Pin.OUT) schicht[i].value(0) zustand=["aus","an "] color=["red","lightgreen"] eState=[0,0,0,0,0,0] connectStatus = { 1000: "STAT_IDLE", 1001: "STAT_CONNECTING", 1010: "STAT_GOT_IP", 202: "STAT_WRONG_PASSWORD", 201: "NO AP FOUND", 5: "GOT_IP" } # Funktionen defnieren *********************************** def TimeOut(t): start=ticks_ms() def compare(): return int(ticks_ms()-start) >= t return compare def switch(n,val): schicht[n].value(val) def stop(): d.writeAt("ALL LEDS OFF",2,5) for i in range(6): switch(i,0) def alle(): d.writeAt("ALL LEDS ON ",2,5) for i in range(6): sleep_ms(300) switch(i,1) def tree(n): d.writeAt("TREE PROGR. ",2,5) for i in range(6): if i <=n: switch(i,1) else: switch(i,0) def hexMac(byteMac): """ Die Funktion hexMAC nimmt die MAC-Adresse im Bytecode entgegen und bildet daraus einen String fuer die Rueckgabe """ macString ="" for i in range(0,len(byteMac)): # Fuer alle Bytewerte macString += hex(byteMac[i])[2:] # ab Position 2 bis Ende if i 2: try: ebene,state=q[1:].split("&") _,ebene= ebene.split("=") _,state= state.split("=") ebene=(int(ebene) if 0<=int(ebene)<=5 else 0) state=(int(state) if 0<=int(state)<=1 else 0) switch(ebene,state) eState[ebene]=state except: pass else: pass antwort="" for i in range(6): h="

E{} {}.

".format(color[eState[i]],i, zustand[eState[i]]) antwort=antwort+h antwort=antwort+"" html1 = """

Hallo,
ich bin dein Weihnachtsbäumchen

""" html2=""" """ html3=""" """ html9 = "

E0 An

E1 An

E2 An

E3 An

E4 An

E5 An

ALLE AN

E0 Aus

E1 Aus

E2 Aus

E3 Aus

E4 Aus

E5 Aus

ALLE AUS

" html=html1+html2+antwort+html3+html9 return html if taste.value()==0: print("Mit Flashtaste abgebrochen") ledsOff() d.writeAt("Abbruch d. User ",0,5) sys.exit() # ******************************************************** # Netzwerk einrichten # ******************************************************** # Eigener ACCESSPOINT # ******************************************************** if ownAP and (not WLANconnect): # nic = network.WLAN(network.AP_IF) nic.active(True) ssid="christbaum" passwd="don't_care" # Start als Accesspoint nic.ifconfig((myIP,"255.255.255.0",myIP,\ myIP)) print(nic.ifconfig()) # Authentifizierungsmodi ausser 0 werden nicht unterstuetzt nic.config(authmode=0) MAC=nic.config("mac") # liefert ein Bytes-Objekt # umwandeln in zweistellige Hexzahlen MAC=ubinascii.hexlify(MAC,"-").decode("utf-8") print(MAC) nic.config(essid=ssid, password=passwd) while not nic.active(): print(".",end="") sleep(0.5) print("Unit1 listening") # *************** Setup accesspoint end ***************** # ******************************************************** # WLAN-Connection # ******************************************************** if WLANconnect and (not ownAP): nic = network.WLAN(network.STA_IF) # erzeuge WiFi-Objekt nic.active(True) # Objekt nic einschalten # MAC = nic.config('mac') # binaere MAC-Adresse abrufen + myMac=hexMac(MAC) # in Hexziffernfolge umwandeln print("STATION MAC: \t"+myMac+"\n") # ausgeben # Verbindung mit AP im lokalen Netzwerk aufnehmen, # falls noch nicht verbunden, dann # connect to LAN-AP if not nic.isconnected(): nic.connect(mySid, myPass) # warten bis die Verbindung zum Accesspoint steht print("connection status: ", nic.isconnected()) while not nic.isconnected(): blink(0.8,0.2,0) print("{}.".format(nic.status()),end='') sleep(1) # zeige Verbindungsstatus & Config-Daten print("\nconnected: ",nic.isconnected()) print("\nVerbindungsstatus: ",connectStatus[nic.status()]) print("Weise neue IP zu:",myIP) nic.ifconfig((myIP,"255.255.255.0",myIP, \ myIP)) STAconf = nic.ifconfig() print("STA-IP:\t\t",STAconf[0],"\nSTA-NETMASK:\t",\ STAconf[1],"\nSTA-GATEWAY:\t",STAconf[2] ,sep='') # *********** Setup Router connection end *************** # ******************************************************** # TCP-Web--Server # ******************************************************** # ----------------- Server starten -------------------------- if WLANconnect or ownAP: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind(('', myPort)) print("Socket established, waiting on port",myPort) d.clearAll() # 0123456789012345 d.writeAt("SOCK ESTABLISHED",0,0) d.writeAt("LISTENING AT",0,1) d.writeAt(myIP+":"+str(myPort),0,2) s.settimeout(0.9) s.listen(2) if taste.value()==0: print("Mit Flashtaste abgebrochen") ledsOff() d.writeAt("Abbruch d. User ",0,5) sys.exit() # ------------------- Serverschleife ---------------------- while True: try: # wegen timeout r="" if WLANconnect or ownAP: c, addr = s.accept() print('Got a connection from {}:{}\n'.\ format(addr[0],addr[1])) request=c.recv(1024) else: request=input("Kommando:") addr="999.999.999.999:99999" try: # decodieren und parsen r=request.decode("utf8") getPos=r.find("GET /") if r.find("favicon")==-1: print("***********************************") print("Position:",getPos) print("Request:") print(r) print("***********************************") pos=r.find(" HTTP") if getPos == 0 and pos != -1: query=r[5:pos] # nach ? bis HTTP print("*********QUERY:{}*********\n\n".\ format(query)) response = web_page(query) print("---------------\n",response,\ "\n----------------") c.send('HTTP/1.1 200 OK\n'.encode()) c.send('Content-Type: text/html\n'.encode()) c.send('Connection: close\n\n'.encode()) c.sendall(response.encode()) else: print("##########\nNOT HTTP\n###########") c.send('HTTP/1.1 400 bad request\n'.encode()) else: print("favicon request found") c.send('HTTP/1.1 200 OK\n'.encode()) except: # decodieren und parsen request = rawRequest c.send('HTTP/1.1 200 OK\n'.encode()) c.close() except: # wegen timeout pass if taste.value()==0: print("Mit Flashtaste abgebrochen") ledsOff() d.writeAt("Abbruch d. User ",0,5) sys.exit() blink(0.05,0.05,1)