def webserver_start(): global scanlist from microWebSrv import MicroWebSrv lcd.clear() lcd.setCursor(0, 0) ssid_name = "M5Stack-" + node_id[-4:] wlan_ap.active(True) wlan_ap.config(essid=ssid_name, authmode=network.AUTH_OPEN) addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] print('WiFi AP WebServer Start!') print('Connect to Wifi SSID:' + ssid_name) print('And connect to esp via your web browser (like 192.168.4.1)') print('listening on', addr) lcd.image(0, 0, '/flash/img/1-1.jpg', type=lcd.JPG) lcd.font(lcd.FONT_DejaVu24) lcd.setTextColor(lcd.BLACK, lcd.WHITE) lcd.print('Wi-Fi SSID', 150, 145, lcd.BLACK) lcd.print(ssid_name, 125, 170, lcd.RED) webserver = MicroWebSrv(routeHandlers=routeHandlers) scanlist = wlan_sta.scan() if not wlan_sta.active(): wlan_sta.active(True) while True: if len(wlan_ap.status('stations')) > 0: break time.sleep_ms(200) lcd.image(0, 0, '/flash/img/1-2.jpg', type=lcd.JPG) webserver.Start(threaded=False)
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() firstname = formData["firstname"] lastname = formData["lastname"] content = """\ <!DOCTYPE html> <html lang=en> <head> <meta charset="UTF-8" /> <title>OHS Badge Configuration Post</title> </head> <body> <h1>Name sent to badge</h1> Firstname = %s<br /> Lastname = %s<br /> </body> </html> """ % (MicroWebSrv.HTMLEscape(firstname), MicroWebSrv.HTMLEscape(lastname)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content) writeName(firstname, lastname) epd.set_rotate(gxgde0213b1.ROTATE_90) namestr = firstname + "\n" + lastname epd.clear_frame(fb) epd.G_display_string_at(fb, 0, 0, namestr, G_FreeSans24pt7b, 1, gxgde0213b1.COLORED) epd.display_frame(fb) goto_deepsleep()
def run(self, app_config): self.led = machine.Pin(app_config['led'], machine.Pin.OUT) # Camera resilience - if we fail to init try to deinit and init again if app_config['camera'] == 'ESP32-CAM': camera.init(0, format=camera.JPEG) #ESP32-CAM elif app_config['camera'] == 'M5CAMERA': camera.init(0, d0=32, d1=35, d2=34, d3=5, d4=39, d5=18, d6=36, d7=19, href=26, vsync=25, reset=15, sioc=23, siod=22, xclk=27, pclk=21) #M5CAMERA camera.framesize(self.framesize) mws = MicroWebSrv(routeHandlers=self.routeHandlers, webPath="www/") mws.Start(threaded=True) gc.collect()
def _httpHandlerFinish(httpClient, httpResponse) : f = open( web_dir + 'config_1.html', 'r') content = str(f.read()) f.close() content += str("Reset Wifi Settings to Default") f = open( web_dir + 'config_2.html', 'r') content += str(f.read()) f.close() httpResponse.WriteResponseOk( headers = None, contentType = "text/html", contentCharset = "UTF-8", content = content ) print("User hit the RESET Page.") try: config = wifi_config.readConfig(wifi_config_file) custom_message = config["custom_message"] except OSError: custom_message = default_custom_message config_data = {'ssid': MicroWebSrv.HTMLEscape(default_ssid), 'password': MicroWebSrv.HTMLEscape(default_password), 'custom_message': MicroWebSrv.HTMLEscape(custom_message)} f = open(wifi_config_file, "w") json = ujson.dumps(config_data) f.write(json) f.close()
def _httpHandlerConfigurePost(httpClient, httpResponse) : formData = httpClient.ReadRequestPostedFormData() ssid = formData["ssid"] password = formData["password"] custom_message = formData["custom_message"] f = open( web_dir + 'config_1.html', 'r') content = str(f.read()) f.close() config_data = {'ssid': MicroWebSrv.HTMLEscape(ssid), 'password': MicroWebSrv.HTMLEscape(password), 'custom_message': MicroWebSrv.HTMLEscape(custom_message)} content += str(config_data) f = open( web_dir + 'config_2.html', 'r') content += str(f.read()) f.close() httpResponse.WriteResponseOk( headers = None, contentType = "text/html", contentCharset = "UTF-8", content = content) f = open(wifi_config_file, "w") json = ujson.dumps(config_data) f.write(json) f.close() print("User POSTED settings to /configure") print("Wrote the following to " + wifi_config_file + "\n" + json)
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() print(httpResponse) print("/test/post de data con: ", formData) flujo = formData["FLUJO"] corriente = formData["CORRIENTE"] content = """\ <!DOCTYPE html> <html lang=en> <head> <meta charset="UTF-8" /> <title>TEST POST</title> </head> <body> <h1>TEST POST</h1> Flujo = %s<br /> Corriente = %s<br /> </body> </html> """ % (MicroWebSrv.HTMLEscape(flujo), MicroWebSrv.HTMLEscape(corriente)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content)
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() display0 = formData["display0"] display1 = formData["display1"] display2 = formData["display2"] display3 = formData["display3"] db[b"display0"] = str.encode(display0) db[b"display1"] = str.encode(display1) db[b"display2"] = str.encode(display2) db[b"display3"] = str.encode(display3) db.flush() content = """\ <!DOCTYPE html> <html lang=fr> <head> <meta charset="UTF-8" /> <title>Settings saved</title> </head> <body> <h1>Settings saved</h1> Display0 = %s<br /> Display1 = %s<br /> Display2 = %s<br /> Display3 = %s<br /> </body> </html> """ % (MicroWebSrv.HTMLEscape(display0), MicroWebSrv.HTMLEscape(display1), MicroWebSrv.HTMLEscape(display2), MicroWebSrv.HTMLEscape(display3)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content)
def webserver_start(): global scanlist #lcd.clear() #lcd.setCursor(0, 0) # wlan_ap.eventCB(wlan_ap_cb) wlan_ap.active(True) # node_id = ubinascii.hexlify(machine.unique_id()) ssid_name = "M5Stack-" + node_id[-4:] # #lcd.font(#lcd.FONT_Comic, transparent=True) # #lcd.print(ssid_name, 0, 0, #lcd.RED) wlan_ap.config(essid=ssid_name, authmode=network.AUTH_OPEN) addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] print('WiFi AP WebServer Start!') print('Connect to Wifi ssid:'+ssid_name) print('And connect to esp via your web browser (like 192.168.4.1)') print('listening on', addr) #lcd.println('Connect to Wifi ssid:'+ssid_name) #lcd.println('via your web browser: 192.168.4.1') #lcd.println('listening on'+str(addr)) if not wlan_sta.active(): wlan_sta.active(True) scanlist = wlan_sta.scan() from microWebSrv import MicroWebSrv webserver = MicroWebSrv(routeHandlers=routeHandlers) webserver.Start(threaded=False)
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() devadd = formData["devadd"] nwskey = formData["nwskey"] appkey = formData["appkey"] content = """\ <!DOCTYPE html> <html lang=en> <head> <meta charset="UTF-8" /> <title>AlphaX MHM Configuration Page</title> <link rel="stylesheet" href="style.css" /> </head> <body style="min-width: 480px;text-align: center"> <div style="text-align: center;padding-top: 10px"> <img src="ax_logo.png" /> <h1>MHM4 LoRaWAN ABP Configuration</h1> </div><br> <div style="max-width:480px;padding:10px;margin: auto;text-align: center"> <form action="" method="post" accept-charset="ISO-8859-1"> <div style="padding:10px;text-align: center"> <label style="font-size:11px">Device Address: </label> <input type="text" name="devadd" style="color:#fff" value="%s" disabled> </div> <div width="480px" style="padding:10px;text-align: center"> <label style="font-size:11px">Network Session Key: </label> <input type="text" name="nwskey" style="color:#fff" value="%s" disabled> </div> <div style="padding:10px;text-align: center"> <label style="font-size:11px">App Session KEY: </label> <input type="text" name="appkey" style="color:#fff" value="%s" disabled> </div> <div style="padding:10px;"> <h5 style="color:green">Success. Device will reboot Now.</h5> </div> </form> <br> <p style="font-size:9px">If you wish to connect via ABP (which is the recommended method) the network will provide you with a Device ID, Network Key and Application Key. The former identifies what application your device is connecting to, the latter is a shared secret key unique to your device to generate the session keys that prove its identity on the network. </p> <br /> </div> </body> </html> """ % (MicroWebSrv.HTMLEscape(devadd), MicroWebSrv.HTMLEscape(nwskey), MicroWebSrv.HTMLEscape(appkey)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content) f = open('/flash/config.py', 'w') f.write('#############################################\n') f.write('####### sys generated file do not edit ######\n') f.write('#############################################\n') f.write('devadd = "' + str(devadd) + '"\n') f.write('nwskey = "' + str(nwskey) + '"\n') f.write('appkey = "' + str(appkey) + '"\n') f.close() machine.reset()
def main(): import uos import json import time import _thread import network from m5stack import lcd, buttonA from microWebSrv import MicroWebSrv from micropython import const def wifiCheck(): sta_if = network.WLAN(network.STA_IF) if sta_if.active() == False: sta_if.active(True) wifi = json.load(open('/flash/etc/wlan.json', 'r')) ssid = wifi['wifi']['ssid'] pwd = wifi['wifi']['password'] sta_if.connect(ssid, pwd) while sta_if.ifconfig()[0] == '0.0.0.0': time.sleep(.5) lcd.println('Connect to WLAN.') def __acceptWebSocketCallback(webSocket, httpClient): print("WS ACCEPT") webSocket.SendText(json.dumps(['login', 'SyncSyncSync'])) webSocket.RecvTextCallback = __recvTextCallback # webSocket.RecvBinaryCallback = self.__recvBinaryCallback # webSocket.ClosedCallback = self.__closedCallback def __recvTextCallback(webSocket, msg): msg = eval(msg) # ['command', 'parameter'] cmd = msg[0] para = msg[1] print('Receive command: %s' % cmd) if cmd == 'ls': webSocket.SendText(json.dumps(['ls', uos.listdir()])) elif cmd == 'cd': uos.chdir(para) webSocket.SendText(json.dumps(['cd', uos.listdir()])) elif cmd == 'get': with open(para, 'r') as o: webSocket.SendText(json.dumps(['get', o.read()])) elif cmd == 'post': with open(para, 'w') as o: o.write(msg[2]) webSocket.SendText(json.dumps(['post', 1])) wifiCheck() ws = MicroWebSrv(port=8000) ws.MaxWebSocketRecvLen = 256 # ws.WebSocketThreaded = False ws.AcceptWebSocketCallback = __acceptWebSocketCallback ws.Start(threaded=False)
def start_app(self, write_func, get_func): """ Функция запуска веб-приложения. На вход принимает 2 функции. 1. Функция записи данных. Должна иметь 3 аргумента: 1) Частота опроса датчиков 2) Новый датчик добавляемый в список 3) Датчик удаляемый из списка 2. Функция чтения данных. Должна возвращать 2 значения: 1) Частота опроса датчиков 2) Список адресов датчиков в памяти У веб-приложения 2 маршрута: 1. Форма 2. Обработчик формы Их нельзя объединить из-за особенности библиотеки """ from microWebSrv import MicroWebSrv # Форма @MicroWebSrv.route('/') def handlerFuncGet(httpClient, httpResponse): frequency, clients = get_func() clients_list = 'Clients:<br>' for client in clients: clients_list += client + '<br>' httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=self.page1.format( frequency, clients_list)) # Обработчик формы @MicroWebSrv.route('/post', 'POST') def post_data(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() if formData['frequency']: try: frequency = int(formData['frequency']) write_func(frequency, formData['add_client'], formData['remove_client']) except: pass httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=self.page2) # MicroWebSrv.SetNotFoundPageUrl('/') mws = MicroWebSrv() # Приложение запускается как отдельный поток mws.Start(threaded=True)
def start(self): @MicroWebSrv.route('/cmd', 'POST') def httpHandlerCmd(httpClient, httpResponse): sCmd = self.getParams(httpClient, 'cmd') print(sCmd) @MicroWebSrv.route('/sync', 'POST') def httpHandlerSync(httpClient, httpResponse): print('sync') mws = MicroWebSrv() mws.Start()
def start(_sdb): global dns, web, sdb sdb = _sdb ## Starting Wifi Access Poijnt wlan.active(1) ## Setting Up Capitve portal ip = wlan.ifconfig()[0] dns = MicroDNSSrv() web = MicroWebSrv() web.SetNotFoundPageUrl("http://my-fajr-clock.wifi/status") dns.SetDomainsList({"*": ip}) dns.Start() web.Start(True)
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() firstname = formData["firstname"] lastname = formData["lastname"] content = CONTENT_TEST_POST % (MicroWebSrv.HTMLEscape(firstname), MicroWebSrv.HTMLEscape(lastname)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content)
def start_web_server(): global ipaddress epd.display_string_at(fb, 0, 60, "Connect to badge AP to configure.", font12, gxgde0213b1.COLORED) epd.display_string_at(fb, 0, 72, "Enter this URL in your browser:", font12, gxgde0213b1.COLORED) epd.display_string_at(fb, 0, 84, "http://" + ipaddress + "/setup", font12, gxgde0213b1.COLORED) epd.display_frame(fb) srv = MicroWebSrv(webPath='www/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = False #srv.AcceptWebSocketCallback = _acceptWebSocketCallback srv.Start(threaded=False)
def network_connect(): sta_if = network.WLAN(network.STA_IF) sta_if.active(True) ssid = ConfigFile.get('wifi', {}).get('ssid') if ssid: sta_if.connect(ssid, ConfigFile.get('wifi', {}).get('pwd')) if not wifi_connected(sta_if): ap = network.WLAN(network.AP_IF) # create access-point interface ap.active(True) # activate the interface ap.config(essid='micropython_ap') # set the ESSID of the access point @MicroWebSrv.route('/aps', 'GET') def scan_ap(http_client, http_response): sta_if.active(True) ap_list = sta_if.scan() http_response.WriteResponseJSONOk([ap[0] for ap in ap_list]) @MicroWebSrv.route('/connect', 'POST') def connect(http_client, http_response): params = json.loads(http_client.ReadRequestContent()) ssid = params.get('ssid') if not ssid: http_response.WriteResponseJSONOk({ 'Success': False, 'Message': 'ssid不能为空!' }) return sta_if = network.WLAN(network.STA_IF) sta_if.active(True) sta_if.connect(ssid, params.get('pwd')) # Connect to an AP if wifi_connected(sta_if): print('connect success!') wifi_config = ConfigFile.get('wifi', {}) wifi_config['ssid'] = ssid wifi_config['pwd'] = params.get('pwd') ConfigFile.set('wifi', wifi_config) machine.reset() http_response.WriteResponseJSONOk({ 'Success': False, 'Message': '连接失败!' }) srv = MicroWebSrv(webPath='/templates/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = False srv.Start()
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() status = formData["status"] content = """\ <!DOCTYPE html> <html lang=en> <head> <meta charset="UTF-8" /> <title>MODE SWITCH</title> </head> <body style="background-color: lightgrey; text-align: center;"> <h1><b>===MODE SWITCH===</b></h1> Choice = %s<br /> </body> </html> """ % (MicroWebSrv.HTMLEscape(status)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content) if status == "mqtt": print(">>MQTT mode selected<<") mf = open("status.txt", "w") mf.write("yes") mf.close()
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() firstname = formData["firstname"] lastname = formData["lastname"] content = """\ <!DOCTYPE html> <html lang=en><head><meta charset="UTF-8" /><title>TEST POST</title></head> <body><h1>TEST POST</h1> Firstname = %s<br /> # MicroWebSrv.HTMLEscape(firstname) Lastname = %s<br /> # MicroWebSrv.HTMLEscape(lastname) </body></html> """ % (MicroWebSrv.HTMLEscape(firstname), MicroWebSrv.HTMLEscape(lastname)) # publie la page POST httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content)
def httpserver_init(): global server server = MicroWebSrv(webPath='www/') server.MaxWebSocketRecvLen = 256 server.WebSocketThreaded = False server.AcceptWebSocketCallback = _acceptWebSocketCallback server.Start(threaded=False)
def setup_web_server(accept_socket_cb): "Setup http webserver." mws = MicroWebSrv() mws.MaxWebSocketRecvLen = 256 mws.WebSocketThreaded = False mws.AcceptWebSocketCallback = accept_socket_cb mws.Start()
def main(): ap = AccessPoint() srv = MicroWebSrv(webPath='www/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = False srv.AcceptWebSocketCallback = _acceptWebSocketCallback srv.Start() del ap
def start(self): self.wlan_sta.active(True) self.wlan_ap.active(True) self.wlan_ap.config(essid=self.ap_name, password=self.ap_password) routeHandlers = [ ("/", "GET", self._httpHandlerIndexGet), ("/aplist", "GET", self._httpHandlerScanNetworks), ("/status", "GET", self._httpHandlerCheckStatus), ("/save", "POST", self._httpHandlerSaveConfig) ] srv = MicroWebSrv(routeHandlers=routeHandlers) srv.Start(threaded=True) print('Now enter config mode') print('Connect to Wifi ssid :' + self.ap_name + ' , default pass: '******'And connect to Blocky via at 192.168.4.1') gc.collect() print(gc.mem_free()) return True
def init_webserver(self): def httpHandlerGETState(httpClient, httpResponse): httpResponse.WriteResponseJSONOk( headers = None, obj = self.dev_state.get_state()) def httpHandlerPOSTsearchOnewire(httpClient, httpResponse): if self.dev_state.onewire_interface is not None: try: log('Request new search for one wire devices.') one_wire_inf = self.dev_state.onewire_interface one_wire_inf.interfacereset() one_wire_inf.getallid() one_wire_inf.checkdevices() self.dev_state.clear_sensors() one_wire_inf.update_state(self.dev_state) log('Find {} devices.'.format(one_wire_inf.num_devices)) res = { "numDevices": one_wire_inf.num_devices } httpResponse.WriteResponseJSONOk( headers = None, obj = res) except Exception as e: sys.print_exception(e) httpResponse.WriteResponseBadRequest() else: httpResponse.WriteResponseBadRequest() self.routeHandlers = [ ( '/state', 'GET', httpHandlerGETState), ( '/search_onewire', 'POST', httpHandlerPOSTsearchOnewire) ] self.mws = MicroWebSrv( webPath='www/', routeHandlers=self.routeHandlers )
def start_app(self, write_func, get_func): """ Функция запуска веб-приложения. На вход принимает 2 функции. 1. Функция записи данных. Должна иметь 1 аргумент (адрес датчика) 2. Функция чтения данных. Должна возвращать 1 значение (адрес датчика) У веб-приложения 2 маршрута: 1. Форма 2. Обработчик формы Их нельзя объединить из-за особенности библиотеки """ from microWebSrv import MicroWebSrv # Форма @MicroWebSrv.route('/') def handlerFuncGet(httpClient, httpResponse): httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=self.page1.format(get_func())) # Обработчик формы @MicroWebSrv.route('/post', 'POST') def post_data(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() write_func(formData['client']) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=self.page2) # MicroWebSrv.SetNotFoundPageUrl('/') mws = MicroWebSrv() # Приложение запускается как отдельный поток mws.Start(threaded=True)
def start(): global gUart gUart = machine.UART(1, rx=14, tx=12) srv = MicroWebSrv(webPath='www/') #srv = MicroWebSrv(routeHandlers=routeHandlers, webPath='/www/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = True #False srv.AcceptWebSocketCallback = _acceptWebSocketCallback srv.Start()
def _httpHandlerTestPost(httpClient, httpResponse): formData = httpClient.ReadRequestPostedFormData() ssid = formData["ssid"] lines = ssid.split("\r") content = """\ <!DOCTYPE html> <html lang=en> <head> <meta charset="UTF-8" /> <title>TEST POST</title> </head> <body> <h1>WiFi Config</h1> SSID = %s<br /> </body> </html> """ % (MicroWebSrv.HTMLEscape(ssid)) httpResponse.WriteResponseOk(headers=None, contentType="text/html", contentCharset="UTF-8", content=content)
def __init__(self, device=None, settings=None, storage=None): log.info('Setting up HTTP API') TerkinHttpApi.device = device TerkinHttpApi.settings = settings TerkinHttpApi.storage = storage TerkinHttpApi.headers = { # Work around troubles with CORS in development. 'Access-Control-Allow-Origin': '*', # Put application name and version into HTTP headers. 'Application-Name': TerkinHttpApi.device.application_info.name, 'Application-Version': TerkinHttpApi.device.application_info.version, } # Conditionally initialize webserver. # TCP port 80 and files in /flash/www. # TODO: Make port and htdocs folder configurable. global webserver if webserver is None: webserver = MicroWebSrv() self.webserver = webserver
def start_server(_relay=None, _dht11=None, _debugMode=False): """Run server at configured device""" print('Starting regular server...') global relay global dht11 global srv global DEBUG_MODE if (_relay!=None and _dht11!=None): relay = _relay dht11 = _dht11 DEBUG_MODE = _debugMode srv = MicroWebSrv(webPath='www/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = True srv.AcceptWebSocketCallback = _acceptWebSocketCallback srv.Start(threaded=True)
from microWebSrv import MicroWebSrv import esp32 # ---------------------------------------------------------------------------- @MicroWebSrv.route('/temperature') def _httpHandlerTempGet(httpClient, httpResponse): temp = (esp32.raw_temperature() - 32) * 5.0 / 9.0 httpResponse.WriteResponseOk(headers=({ 'Cache-Control': 'no-cache' }), contentType='text/html', contentCharset='UTF-8', content="Temperatur ist: {}".format(temp)) srv = MicroWebSrv(webPath='www/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = False srv.Start() # ----------------------------------------------------------------------------
def _recvTextCallback(webSocket, msg): print("WS RECV TEXT : %s" % msg) webSocket.SendText("Reply for %s" % msg) def _recvBinaryCallback(webSocket, data): print("WS RECV DATA : %s" % data) def _closedCallback(webSocket): print("WS CLOSED") # ---------------------------------------------------------------------------- # routeHandlers = [ # ( "/test", "GET", _httpHandlerTestGet ), # ( "/test", "POST", _httpHandlerTestPost ) # ] p = 80 if sys.platform == 'linux' else 8080 srv = MicroWebSrv(port=p, webPath='www/') srv.MaxWebSocketRecvLen = 256 srv.WebSocketThreaded = True srv.AcceptWebSocketCallback = _acceptWebSocketCallback srv.Start(threaded=True) while True: time.sleep(72000) # ----------------------------------------------------------------------------