Esempio n. 1
0
    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()
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
def httpserver_init():
    global server
    server = MicroWebSrv(webPath='www/')
    server.MaxWebSocketRecvLen = 256
    server.WebSocketThreaded = False
    server.AcceptWebSocketCallback = _acceptWebSocketCallback
    server.Start(threaded=False)
Esempio n. 5
0
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()
Esempio n. 6
0
def main():
    ap = AccessPoint()
    srv = MicroWebSrv(webPath='www/')
    srv.MaxWebSocketRecvLen = 256
    srv.WebSocketThreaded = False
    srv.AcceptWebSocketCallback = _acceptWebSocketCallback
    srv.Start()

    del ap
Esempio n. 7
0
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)
Esempio n. 8
0
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()
Esempio n. 9
0
    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)
Esempio n. 10
0
    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 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()
Esempio n. 14
0
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)
Esempio n. 15
0
    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)
Esempio n. 16
0
  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
    obj = {
        'temperature': str(tmp),
    }
    httpResponse.WriteResponseJSONOk(obj=obj, headers=headers)


@MicroWebSrv.route('/SAD')
def _httpHandlerTestGet(httpClient, httpResponse):
    params = httpClient.GetRequestQueryParams()
    display.show(Image.SAD)


@MicroWebSrv.route('/scroll')
def _httpHandlerTestGet(httpClient, httpResponse):
    params = httpClient.GetRequestQueryParams()
    display.scroll(str(params['text']))


if __name__ == '__main__':
    if 'srv' in locals():
        reset()
    pin13.write_digital(0)
    import time
    while True:
        time.sleep(2)
        if wifi.isconnected():
            srv = MicroWebSrv(webPath='www/')
            srv.Start(True)
            pin13.write_digital(1)
        else:
            pin13.write_digital(0)
Esempio n. 18
0
def run_web(threaded):
    from microWebSrv import MicroWebSrv

    def delayed_reboot(delay=3.5):
        from time import sleep
        from machine import reset
        sleep(delay)
        reset()
####################################### URL Route handling #################################
    @MicroWebSrv.route('/config')
    def _httpHandlerConfig(httpClient, httpResponse, args={}) :
        from utils import sys_config_html
        content = """\
            <!DOCTYPE html>
            <html lang=en>
            <head>
                <meta charset="UTF-8" />
                <title>CONFIG DUMP</title>
            </head>
            <body><PRE>"""
        content += sys_config_html()
        content += '<div style="alignt: center; text-align: center;">\n'
        content += '<P><h3><a href="/stats">status</a></h3></P>'
        content += "<br /><h5><a href=\"/config/reboot\">REBOOT?</A></h5>\n"
        content += "</div>"
        content += """\
            </PRE>
            </body>
            </html>
            """
        httpResponse.WriteResponseOk( headers            = None,
                                      contentType    = "text/html",
                                      contentCharset = "UTF-8",
                                      content                = content )
##############################################
    @MicroWebSrv.route('/config/reboot')
    @MicroWebSrv.route('/config/restart')
    def _httpHandlerReboot(httpClient, httpResponse, args={}) :
        from _thread import start_new_thread
        start_new_thread(delayed_reboot, ())
        content = """\
            <!DOCTYPE html>
            <html lang=en>
            <head>
                <meta charset="UTF-8" />
                <meta http-equiv="refresh" content="8;url=/" />
                <title>C U NEXT TUESDAY...</title>
            </head>
            <body><BR /><HR /><br />
            <P><center><img src="/reboot.gif"></center></P>
            <BR /><HR /><br /></body>
            </html>
            """
        httpResponse.WriteResponseOk( headers            = None,
                                      contentType    = "text/html",
                                      contentCharset = "UTF-8",
                                      content                = content )
############################################################
    @MicroWebSrv.route('/config/toggleAP')
    def _httpHandlerToggle(httpClient, httpResponse, args={}) :
        from os import rename
        apMode = None
        try:
            x = open('/client.cfg')
            x.close()
            apMode = False
            rename("/client.cfg","/client.disable")
        except:
            try:
                x = open('client.disable')
                x.close()
                apMode = True
                rename("/client.disable","/client.cfg")
            except:
                return()
        content = """\
            <!DOCTYPE html>
            <html lang=en>
            <head>
                    <meta charset="UTF-8" />
                <title>TEST EDIT</title>
            </head>
            <body>
            """
        if(apMode):
            content += "<H2>Switched to Wifi Client Mode</H2>"
            content += '<div style="alignt: center; text-align: center;">\n'
            content += '<P><h3><a href="/config/">config</a></h3></P>'
            content += "<br /><h5><a href=\"/config/reboot\">REBOOT?</A></h5>\n"
            content += "</div>"
        else:
            content += "<H2>Switched to Wifi AP Mode</H2>"
            content += '<div style="alignt: center; text-align: center;">\n'
            content += '<P><h3><a href="/config/">config</a></h3></P>'
            content += "<br /><h5><a href=\"/config/reboot\">REBOOT?</A></h5>\n"
            content += "</div>"
        content += """\
            </body>
        </html>
            """
        httpResponse.WriteResponseOk( headers            = None,
                                      contentType    = "text/html",
                                      contentCharset = "UTF-8",
                                      content                = content )
##############################################
    @MicroWebSrv.route('/config/<param>/<value>')
    def _httpHandlerEditParams(httpClient, httpResponse, args={}) :
        from utils import replaceLine, findValue
        content = """\
            <!DOCTYPE html>
            <html lang=en>
            <head>
                    <meta charset="UTF-8" />
                <title>-=DAT CONFIG=-</title>
            </head>
            <body>
            """
        content += "<h3>CONFIG UPDATE</h3>"
        if 'param' in args :
            param = args['param'].strip()
            oldline = findValue('/config.py',param)
            content += "<p>[config: {}]</p>".format(oldline)
            content += "<br />"
        if 'value' in args :
            if(type(args['value']) == int):
                value = str(args['value'])
            else:
                value = args['value'].strip()
            content += "<p>[new value is {}]</p>".format(value)
            content += "<br />"
        if( ('value' in args) and ('param' in args) ):
            #re = args['param'].strip() + " = ([A-Za-z\"]+)"
            re = oldline
            if((value == str(1)) or ('rue' in value)):
                value = "True"
            elif((value == str(0)) or ('alse' in value)):
                value = "False"
            else:
                value = '"' + value + '"'
            newline = args['param'].strip() + " = " + value + "\n"
            content += "<P>" + newline + "</P><BR />"
            print("CONFIGURE:",param,' - ',value,' - ', re, '\n',newline)

            replaceLine("/config.py",re,newline)

            content += "<p>parameters updated.</p>"
            content += '<div style="alignt: center; text-align: center;">\n'
            content += '<P><h3><a href="/config/">config</a></h3></P>'
            content += "<br /><h5><a href=\"/config/reboot\">REBOOT?</A></h5>\n"
            content += "</div>"
        content += """
            </body>
        </html>
            """
        httpResponse.WriteResponseOk( headers            = None,
                                      contentType    = "text/html",
                                      contentCharset = "UTF-8",
                                      content                = content )

############################################################
    @MicroWebSrv.route('/config/<param>')
    def _httpHandlerEditParams(httpClient, httpResponse, args={}) :
        from utils import findValue
        content = """\
            <!DOCTYPE html>
            <html lang=en>
            <head>
                    <meta charset="UTF-8" />
                <title>-=DAT CONFIG=-</title>
            </head>
            <body>
            """
        content += "<h3>CONFIG REQUEST</h3>"
        if 'param' in args :
            param = args['param'].strip()
            oldline = findValue('/config.py',param)
            content += "<p>[config: {}]</p>".format(oldline)
            content += "<br />"
            content += '<div style="alignt: center; text-align: center;">\n'
            content += "<P><h5><a href='/config/" + param + "/1'>enable</a> / <a href='/config/" + param + "/0'>disable</a></h5></P>"
            content += '<P><h3><a href="/config/">config</a></h3></P>'
            content += "</div>"
        content += """
            </body>
        </html>
            """
        httpResponse.WriteResponseOk( headers            = None,
                                      contentType    = "text/html",
                                      contentCharset = "UTF-8",
                                      content                = content )
############################################################
    @MicroWebSrv.route('/stats')
    @MicroWebSrv.route('/status')    
    def _httpHandlerStats(httpClient, httpResponse, args={}) :
        from utils import sys_stats, sys_config
        global MyName, debug, debugDNS, ip, runREPL, runDNS, runWeb, threaded
        content = """\
            <!DOCTYPE html>
            <html lang=en>
            <head>
                    <meta charset="UTF-8" />
                    <meta http-equiv="refresh" content="2" />
                <title>STATUS O****M</title>
            </head>
            <body>
            """

        content += "<h2>SYSTEM STATS</h2>\n<PRE>" + sys_stats() + "</PRE>\n"
        content += "<H2>SYSTEM CONFIG</H2>\n<PRE>" + sys_config() + "</PRE>\n"
        content += "<h5><a href='/config'>configure</a></h5>"
        content += "<h3><a href='/'>HOME</a></h5>"
        content += """
            </body>
        </html>
            """
        httpResponse.WriteResponseOk( headers            = None,
                                      contentType    = "text/html",
                                      contentCharset = "UTF-8",
                                      content                = content )

############################################ End of Routes ##################################################

    mws = MicroWebSrv(port=80, bindIP='0.0.0.0', webPath="/www")
    mws.SetNotFoundPageUrl("http://"+ip)
    print("web server starting at http://" + ip + "/ .")
    mws.Start(threaded=threaded)
Esempio n. 19
0
                                    content = html)

# route handler for index.html with method POST
@MicroWebSrv.route('/', 'POST')
def _httpHandlerPost(httpClient, httpResponse) :
    # read posted form data. If data (dictionary) received, convert to string and send threadMessage to mainThread
    formData = httpClient.ReadRequestPostedFormData()
    if formData:
        print(formData)
        message = str(formData)
        _thread.sendmsg(_thread.getReplID(), message)

    # get system time and save it t datetime_dict
    datetime = utime.localtime()
    #print(datetime)
    datetime_dict = { "year" : datetime[0], "month" : datetime[1], "mday" : datetime[2],
                    "hour": datetime[3], "minute" : datetime[4], "second" : datetime[5],
                    "weekday" : datetime[6], "yearday" : datetime[7]}

    htmlSite = htmlSite.format(**datetime_dict)
    # send htmlSite as response to client
    httpResponse.WriteResponseOk(   headers         = ({'Cache-Control': 'no-cache'}),
                                    contentType     = 'text/html',
                                    contentCharset  = 'UTF-8',
                                    content = htmlSite)


# create instance of MicroWebSrv and start server
srv = MicroWebSrv(webPath = 'www')
srv.Start(threaded = srv_run_in_thread, stackSize= 8192)
Esempio n. 20
0
from microWebSrv import MicroWebSrv

mws = MicroWebSrv(routeHandlers=[], port=80, bindIP='0.0.0.0', webPath="/www")
mws.Start(threaded=True)

Esempio n. 21
0
class HttpServer:
    def __init__(self, process_obj, wifi_obj, rtc_obj, user_settings_dict):
        self.process = process_obj
        self.wifi = wifi_obj
        self.rtc = rtc_obj
        self.settings = user_settings_dict
        self.app = None
        self.gravity_sg = None
        self.set_temp = None
        self.chamber_temp = None
        self.wort_temp = None
        self.time_mark = None

    def start(self):
        process = self.process
        wifi = self.wifi
        rtc = self.rtc
        settings = self.settings
        this = self

        @MicroWebSrv.route('/connecttest')
        def test_get(httpClient, httpResponse):
            """
            测试前端和后端之间的网络连接
            """
            httpResponse.WriteResponseOk()

        # Define the web routes and functions
        @MicroWebSrv.route('/overview')
        def overview_get(httpClient, httpResponse):
            """
            提供首页所有数据显示,前端每1分钟请求1次
            """
            brewery_name = settings['breweryName']
            wifi_connected = wifi.is_connected()
            real_date = rtc.get_localdate()
            real_time = rtc.get_localtime()
            basic_info = {
                'breweryName': brewery_name,
                'wifiIsConnected': wifi_connected,
                'realDate': real_date,
                'realTime': real_time,
            }
            process_info = process.get_process_info()
            overview = basic_info.copy()
            overview.update(process_info)
            # 以下数据更新用于前端绘制echarts折线图
            this.set_temp = process_info.get('setTemp')
            this.chamber_temp = process_info.get('chamberTemp')
            this.wort_temp = process_info.get('wortTemp')
            this.gravity_sg = process_info.get('hydrometerData').get(
                'currentGravity')
            this.time_mark = real_date + ' ' + real_time
            httpResponse.WriteResponseJSONOk(obj=overview, headers=None)

        @MicroWebSrv.route('/fermentation', 'POST')
        def fermentation_post(httpClient, httpResponse):
            """
            前台向后台提交发酵步骤数据,并且开始发酵过程
            """
            json = httpClient.ReadRequestContentAsJSON()
            beerName = json['beerName']
            fermentationSteps = json['fermentationSteps']
            try:
                process.set_beer_name(beerName)
                process.load_steps(fermentationSteps)
                process.start()
            except:
                # throw 500 error code
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/abort')
        def abort_get(httpClient, httpResponse):
            try:
                process.abort()
            except:
                # throw 500 error code
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/settings')
        def settings_get(httpClient, httpResponse):
            """
            从后台读取设置参数
            """
            wifi_list = wifi.scan_wifi_list()
            temp_sensor_list = process.fermenter_temp_ctrl.chamber_sensor.ds_obj.get_device_list(
            )
            # open user_settings.json and read settings
            with open('user_settings.json', 'r') as f:
                settings_dict = ujson.load(f)
            wort_sensor_dev_num = settings_dict.get('wortSensorDev')
            chamber_sensor_dev_num = settings_dict.get('chamberSensorDev')
            wort_sensor_rom_code = ''
            chamber_sensor_rom_code = ''
            for sensor_dict in temp_sensor_list:
                detail_list = sensor_dict.values()
                if wort_sensor_dev_num in detail_list:
                    wort_sensor_rom_code = sensor_dict.get('label')
                elif chamber_sensor_dev_num in detail_list:
                    chamber_sensor_rom_code = sensor_dict.get('label')

            wort_sensor_dev = {
                'value': wort_sensor_dev_num,
                'label': wort_sensor_rom_code
            }
            chamber_sensor_dev = {
                'value': chamber_sensor_dev_num,
                'label': chamber_sensor_rom_code
            }
            settings_added = {
                'wifiList': wifi_list,
                'wortSensorDev': wort_sensor_dev,
                'chamberSensorDev': chamber_sensor_dev,
                'tempSensorList': temp_sensor_list
            }
            settings_combined = settings_dict.copy()
            settings_combined.update(settings_added)
            # settings_json = ujson.dumps(settings_combined)
            httpResponse.WriteResponseJSONOk(obj=settings_combined,
                                             headers=None)
            # httpResponse.WriteResponseOk(
            #     headers=None,
            #     contentType="application/json",
            #     contentCharset="UTF-8",
            #     content=settings_json
            # )

        @MicroWebSrv.route('/settings', 'POST')
        def settings_post(httpClient, httpResponse):
            """
            向后台保存设置参数,并且重启ESP32
            """
            # json = httpClient.ReadRequestContentAsJSON()
            # settings_dict = ujson.loads(json)
            settings_dict = httpClient.ReadRequestContentAsJSON()
            settings_dict['wortSensorDev'] = settings_dict['wortSensorDev'][
                'value']
            settings_dict['chamberSensorDev'] = settings_dict[
                'chamberSensorDev']['value']
            try:
                with open('user_settings.json', 'w') as f:
                    ujson.dump(settings_dict, f)
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/reboot')
        def reboot_get(httpClient, httpResponse):
            tim = machine.Timer(-1)
            try:
                tim.init(period=3000,
                         mode=machine.Timer.ONE_SHOT,
                         callback=lambda t: machine.reset())
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/wifi')
        def wifi_get(httpClient, httpResponse):
            """
            获取WIFI热点列表,用于刷新热点列表
            """
            wifi_list = wifi.scan_wifi_list()
            wifi_dict = {'wifiList': wifi_list}
            httpResponse.WriteResponseJSONOk(obj=wifi_dict, headers=None)

        @MicroWebSrv.route('/wifi', 'POST')
        def wifi_post(httpClient, httpResponse):
            """
            连接WIFI热点
            """
            wifi_dict = httpClient.ReadRequestContentAsJSON()
            try:
                new_ip = wifi.sta_connect(wifi_dict['ssid'], wifi_dict['pass'])
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                if wifi.is_connected():
                    httpResponse.WriteResponseOk()
                else:
                    httpResponse.WriteResponseInternalServerError()

        @MicroWebSrv.route('/ip')
        def ip_get(httpClient, httpResponse):
            """
            获取IP地址
            """
            ap_ip = wifi.get_ap_ip_addr()
            sta_ip = wifi.get_sta_ip_addr()
            sta_ssid = wifi.get_sta_ssid()
            ip_dict = {'apIp': ap_ip, 'staIp': sta_ip, 'staSsid': sta_ssid}
            httpResponse.WriteResponseJSONOk(obj=ip_dict, headers=None)

        @MicroWebSrv.route('/ftp')
        def ftp_get(httpClient, httpResponse):
            """
            Start FTP service
            """
            try:
                import uftpd
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/mqtttest', 'POST')
        def mqtt_post(httpClient, httpResponse):
            """
            Send test message to MQTT server
            """
            settings_dict = httpClient.ReadRequestContentAsJSON()
            test_msg = ujson.dumps({'test-message': 200})
            from mqtt_client import MQTT
            try:
                test_mqtt = MQTT(settings_dict)
                test_mqtt.publish(test_msg)
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/actuator', 'POST')
        def actuactor_post(httpClient, httpResponse):
            """
            手动控制制冷压缩机或制热器,主要用于测试
            """
            actuactor_dict = httpClient.ReadRequestContentAsJSON()
            heater = process.fermenter_temp_ctrl.heater
            cooler = process.fermenter_temp_ctrl.cooler
            led = process.fermenter_temp_ctrl.led
            try:
                if actuactor_dict.get('element') == 'heater':
                    element = heater
                else:
                    element = cooler
                action = actuactor_dict.get('action')
                if action:
                    element.force_on()
                else:
                    element.force_off()
                if heater.is_on() and not cooler.is_on():
                    led_color = 'red'
                elif not heater.is_on() and cooler.is_on():
                    led_color = 'blue'
                elif not heater.is_on() and not cooler.is_on():
                    led_color = 'green'
                else:
                    led_color = 'orange'
                led.set_color(led_color)
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/tempsensors', 'POST')
        def temp_post(httpClient, httpResponse):
            """
            获取温度传感器读数
            """
            # 获取前端发来的设备序号
            sensor_dict = httpClient.ReadRequestContentAsJSON()
            new_wort_romcode = sensor_dict.get('wortSensorDev').get('value')
            new_chamber_romcode = sensor_dict.get('chamberSensorDev').get(
                'value')
            # 获取温感对象实例
            wort_sensor = process.fermenter_temp_ctrl.wort_sensor
            chamber_sensor = process.fermenter_temp_ctrl.chamber_sensor
            # 更新温感设备序号
            wort_sensor.update_romcode(new_wort_romcode)
            chamber_sensor.update_romcode(new_chamber_romcode)
            try:
                # 测量温度
                wort_temp = wort_sensor.read_temp()
                chamber_temp = chamber_sensor.read_temp()
            except:
                # throw 500 error code
                httpResponse.WriteResponseInternalServerError()
            else:
                temp_dict = {
                    'wortTemp': wort_temp,
                    'chamberTemp': chamber_temp
                }
                httpResponse.WriteResponseJSONOk(obj=temp_dict, headers=None)

        @MicroWebSrv.route('/hydrometer', 'POST')
        def gravity_post(httpClient, httpResponse):
            hydrometer_dict = httpClient.ReadRequestContentAsJSON()
            process.save_hydrometer_data(hydrometer_dict)
            httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/chart')
        def chart_get(httpClient, httpResponse):
            data = {
                'timeMark': this.time_mark,
                'setTemp': this.set_temp,
                'wortTemp': this.wort_temp,
                'chamberTemp': this.chamber_temp,
                'gravitySg': this.gravity_sg
            }
            httpResponse.WriteResponseJSONOk(obj=data, headers=None)

        # Initialize the Web server
        self.app = MicroWebSrv(webPath='/sd/www')
        self.app.Start(threaded=True)  # Starts the server

    def stop(self):
        if self.app:
            self.app.Stop()

    def is_started(self):
        if self.app:
            return self.app.IsStarted()
        else:
            return False
Esempio n. 22
0

def _closedCallback(webSocket):
    with _thread.allocate_lock():
        websockets.remove(webSocket)
    gc.collect()
    print('closing stale websocket')
    print('number of connections: {}'.format(len(websockets)))
    print('free mem: {}'.format(gc.mem_free()))


def _acceptWebSocketCallback(webSocket, httpClient):
    with _thread.allocate_lock():
        websockets.append(webSocket)
    gc.collect()

    print('new connection from {}'.format(httpClient.GetIPAddr()))
    print('number of connections: {}'.format(len(websockets)))
    webSocket.RecvTextCallback = _recvTextCallback
    webSocket.ClosedCallback = _closedCallback
    webSocket.SendText(str(hue))
    print('free mem: {}'.format(gc.mem_free()))


mws = MicroWebSrv(webPath='/www')
mws.MaxWebSocketRecvLen = 256
mws.AcceptWebSocketCallback = _acceptWebSocketCallback
mws.Start()

_thread.start_new_thread(run_main_loop, ())
Esempio n. 23
0
 def run(self):
     mws = MicroWebSrv(routeHandlers=self.routeHandlers, webPath="/flash/www")
     mws.Start(threaded=True)
     gc.collect()
Esempio n. 24
0
        color_name = all_colors_json.keys()[all_colors_json.values().index(
            color)]
        httpResponse.WriteResponseJSONError(409,
                                            obj={
                                                "error":
                                                "Color already exists",
                                                "content": color_name
                                            })
        #send color already exists error with name
    else:
        colors_raw['user_set'].update({name: color})
        with open('/JSON-files/colors.json', 'w') as colors_json:
            json.dump(colors_raw, colors_json)
        httpResponse.WriteResponseJSONOk()
        with open('/JSON-files/colors.json') as colors_json:
            print(json.load(colors_json))


def _httpHandlerColorTryPost(httpClient, httpResponse):
    content = httpClient.ReadRequestContent()  # Read JSON color data
    colors = json.loads(content)
    show_color(colors['color'])
    httpResponse.WriteResponseJSONOk()


routeHandlers = [("/color-try", "POST", _httpHandlerColorTryPost),
                 ("/color-append", "POST", _httpHandlerAddColorPost),
                 ("/colors-json", "GET", _httpHandlerJsoncolorRequest)]
srv = MicroWebSrv(routeHandlers=routeHandlers, webPath='/www/')
srv.Start(threaded=False)
Esempio n. 25
0
class HttpServer:
    def __init__(self, gy521_obj, wifi_obj, user_settings_dict):
        self.gy521 = gy521_obj
        self.wifi = wifi_obj
        self.settings = user_settings_dict
        self.app = None

    def start(self):
        gy521 = self.gy521
        wifi = self.wifi
        settings = self.settings

        @MicroWebSrv.route('/connecttest')
        def test_get(httpClient, httpResponse):
            """
            测试前端和后端之间的网络连接
            """
            httpResponse.WriteResponseOk()

        # Define the web routes and functions
        @MicroWebSrv.route('/tilt')
        def tilt_get(httpClient, httpResponse):
            """
            读取比重计倾角,前端每10秒请求1次
            """
            try:
                _, tilt, _ = gy521.read_angles()
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseJSONOk(obj={'tilt': tilt},
                                                 headers=None)

        @MicroWebSrv.route('/calibration', 'POST')
        def calibration_post(httpClient, httpResponse):
            """
            前台进行倾角与比重的拟合计算后,将比重单位和拟合系数发回后台保存
            """
            result = httpClient.ReadRequestContentAsJSON()
            try:
                with open('regression.json', 'w') as f:
                    ujson.dump(result, f)
            except:
                # throw 500 error code
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/calibration')
        def calibration_get(httpClient, httpResponse):
            """
            将上一次保存的校准参数从json文件中读取并发送到前台
            """
            try:
                with open('regression.json', 'r') as f:
                    params = ujson.load(f)
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseJSONOk(obj={'params': params},
                                                 headers=None)

        @MicroWebSrv.route('/settings')
        def settings_get(httpClient, httpResponse):
            """
            从后台读取设置参数
            """
            wifi_list = wifi.scan_wifi_list()
            settings_added = {'wifiList': wifi_list}
            settings_combined = settings.copy()
            settings_combined.update(settings_added)
            httpResponse.WriteResponseJSONOk(obj=settings_combined,
                                             headers=None)

        @MicroWebSrv.route('/settings', 'POST')
        def settings_post(httpClient, httpResponse):
            """
            向后台保存设置参数
            """
            settings_dict = httpClient.ReadRequestContentAsJSON()
            try:
                with open('user_settings.json', 'w') as f:
                    ujson.dump(settings_dict, f)
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/reboot')
        def reboot_get(httpClient, httpResponse):
            """
            重启ESP32
            """
            tim = machine.Timer(-1)
            try:
                tim.init(period=3000,
                         mode=machine.Timer.ONE_SHOT,
                         callback=lambda t: machine.reset())
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/deepsleep')
        def deepsleep_get(httpClient, httpResponse):
            """
            使ESP32进入深度睡眠,唤醒后便进入工作模式
            """
            with open('hardware_config.json', 'r') as f:
                json = f.read()
            config = ujson.loads(json)

            FIRSTSLEEP_TRIGGER = config['firstsleep_trigger']

            def first_sleep():
                with open(FIRSTSLEEP_TRIGGER, 'w') as s:
                    pass
                machine.reset()

            tim = machine.Timer(-1)
            try:
                tim.init(period=3000,
                         mode=machine.Timer.ONE_SHOT,
                         callback=lambda t: first_sleep())
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/wifi')
        def wifi_get(httpClient, httpResponse):
            """
            获取WIFI热点列表,用于刷新热点列表
            """
            wifi_list = wifi.scan_wifi_list()
            wifi_dict = {'wifiList': wifi_list}
            httpResponse.WriteResponseJSONOk(obj=wifi_dict, headers=None)

        @MicroWebSrv.route('/wifi', 'POST')
        def wifi_post(httpClient, httpResponse):
            """
            连接WIFI热点
            """
            wifi_dict = httpClient.ReadRequestContentAsJSON()
            new_ip = wifi.sta_connect(wifi_dict['ssid'], wifi_dict['pass'])
            if new_ip:
                # 200
                httpResponse.WriteResponseOk()
            else:
                # throw 500 error code
                httpResponse.WriteResponseInternalServerError()

        @MicroWebSrv.route('/ftp')
        def ftp_get(httpClient, httpResponse):
            """
            Start FTP service
            """
            with open('hardware_config.json', 'r') as f:
                json = f.read()
            config = ujson.loads(json)

            FTP_TRIGGER = config['ftp_trigger']

            def start_ftp():
                with open(FTP_TRIGGER, 'w') as s:
                    pass
                machine.reset()

            tim = machine.Timer(-1)
            try:
                tim.init(period=3000,
                         mode=machine.Timer.ONE_SHOT,
                         callback=lambda t: start_ftp())
            except:
                httpResponse.WriteResponseInternalServerError()
            else:
                httpResponse.WriteResponseOk()

        @MicroWebSrv.route('/mqtttest', 'POST')
        def mqtt_post(httpClient, httpResponse):
            """
            Send test message to MQTT server
            """
            settings_dict = httpClient.ReadRequestContentAsJSON()
            test_msg = {'test-message': 200}
            str_data = ujson.dumps(test_msg)
            from mqtt_client import MQTT
            try:
                client = MQTT(settings_dict)
                client.publish(str_data)
            except:
                print('Failed to send the message to the MQTT broker.')
                httpResponse.WriteResponseInternalServerError()
            else:
                print('The test message has been sent successfully.')
                httpResponse.WriteResponseOk()

        # Initialize the Web server
        self.app = MicroWebSrv(webPath='/www')
        self.app.Start(threaded=True)  # Starts the server

    def stop(self):
        if self.app:
            self.app.Stop()

    def is_started(self):
        if self.app:
            return self.app.IsStarted()
        else:
            return False
Esempio n. 26
0
    dict['internal'] = machine.internal_temp()[1]  # Read ESP32 internal temp
    dict['time'] = rtc.now()  # Record current time
    # Convert data to JSON and send
    websocket.SendText(json.dumps(dict))


def cb_accept_ws(webSocket, httpClient):
    print("WS ACCEPT")
    webSocket.RecvTextCallback = cb_receive_text
    webSocket.RecvBinaryCallback = cb_receive_binary
    webSocket.ClosedCallback = cb_closed
    # Use lambda to pass websocket to timer callback
    cb = lambda timer: cb_timer(timer, webSocket)
    # Init and start timer to poll temperature sensor
    tm.init(period=3000, callback=cb)


mws = MicroWebSrv()  # TCP port 80 and files in /flash/www
mws.MaxWebSocketRecvLen = 256  # Default is set to 1024
mws.WebSocketThreaded = True  # WebSockets with new threads
mws.WebSocketStackSize = 4096
mws.AcceptWebSocketCallback = cb_accept_ws  # Function to receive WebSockets
mws.Start(threaded=False)  # Blocking call (CTRL-C to exit)

print('Cleaning up and exiting.')
mws.Stop()
tm.deinit()
rtc.clear()
ds.deinit()
ow.deinit()
Esempio n. 27
0
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)

# ----------------------------------------------------------------------------
class WebThingServer:
    """Server to represent a Web Thing over HTTP."""

    def __init__(self, things, port=80, hostname=None, ssl_options=None,
                 additional_routes=None):
        """
        Initialize the WebThingServer.

        For documentation on the additional route format, see:
        https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo/wiki/microWebSrv

        things -- list of Things managed by this server
        port -- port to listen on (defaults to 80)
        hostname -- Optional host name, i.e. mything.com
        ssl_options -- dict of SSL options to pass to the tornado server
        additional_routes -- list of additional routes to add to the server
        """
        self.ssl_suffix = '' if ssl_options is None else 's'

        self.things = things
        self.name = things.get_name()
        self.port = port
        self.hostname = hostname

        station = network.WLAN()
        mac = station.config('mac')
        self.system_hostname = 'esp32-upy-{:02x}{:02x}{:02x}'.format(
          mac[3], mac[4], mac[5])

        self.hosts = [
            'localhost',
            'localhost:{}'.format(self.port),
            '{}.local'.format(self.system_hostname),
            '{}.local:{}'.format(self.system_hostname, self.port),
        ]

        for address in get_addresses():
            self.hosts.extend([
                address,
                '{}:{}'.format(address, self.port),
            ])

        if self.hostname is not None:
            self.hostname = self.hostname.lower()
            self.hosts.extend([
                self.hostname,
                '{}:{}'.format(self.hostname, self.port),
            ])

        if isinstance(self.things, MultipleThings):
            log.info('Registering multiple things')
            for idx, thing in enumerate(self.things.get_things()):
                thing.set_href_prefix('/{}'.format(idx))

            handlers = [
                (
                    '/',
                    'GET',
                    self.thingsGetHandler
                ),
                (
                    '/<thing_id>',
                    'GET',
                    self.thingGetHandler
                ),
                (
                    '/<thing_id>/properties',
                    'GET',
                    self.propertiesGetHandler
                ),
                (
                    '/<thing_id>/properties/<property_name>',
                    'GET',
                    self.propertyGetHandler
                ),
                (
                    '/<thing_id>/properties/<property_name>',
                    'PUT',
                    self.propertyPutHandler
                ),
            ]
        else:
            log.info('Registering a single thing')
            handlers = [
                (
                    '/',
                    'GET',
                    self.thingGetHandler
                ),
                (
                    '/properties',
                    'GET',
                    self.propertiesGetHandler
                ),
                (
                    '/properties/<property_name>',
                    'GET',
                    self.propertyGetHandler
                ),
                (
                    '/properties/<property_name>',
                    'PUT',
                    self.propertyPutHandler
                ),
            ]

        if isinstance(additional_routes, list):
            handlers = additional_routes + handlers

        self.server = MicroWebSrv(webPath='/flash/www',
                                  routeHandlers=handlers,
                                  port=port)
        self.server.MaxWebSocketRecvLen = 256
        self.WebSocketThreaded = ws_run_in_thread
        self.server.WebSocketStackSize = 8 * 1024
        self.server.AcceptWebSocketCallback = self._acceptWebSocketCallback

    def start(self):
        """Start listening for incoming connections."""
        # If WebSocketS used and NOT running in thread, and WebServer IS
        # running in thread make shure WebServer has enough stack size to
        # handle also the WebSocket requests.
        log.info('Starting Web Server on port {}'.format(self.port))
        self.server.Start(threaded=srv_run_in_thread, stackSize=12*1024)

        mdns = network.mDNS()
        mdns.start(self.system_hostname, 'MicroPython with mDNS')
        mdns.addService('_webthing', '_tcp', 80, self.system_hostname,
                        {
                          'board': 'ESP32',
                          'path': '/',
                        })

    def stop(self):
        """Stop listening."""
        self.server.Stop()

    def getThing(self, routeArgs):
        """Get the thing ID based on the route."""
        thing_id = routeArgs['thing_id'] if 'thing_id' in routeArgs else None
        return self.things.get_thing(thing_id)

    def getProperty(self, routeArgs):
        """Get the property name based on the route."""
        thing = self.getThing(routeArgs)
        if thing:
            property_name = routeArgs['property_name']
            if thing.has_property(property_name):
                return thing, thing.find_property(property_name)
        return None, None

    def validateHost(self, headers):
        """Validate the Host header in the request."""
        host = headers.get('host', None)
        if host is not None and host.lower() in self.hosts:
            return True

        return False

    @print_exc
    def thingsGetHandler(self, httpClient, httpResponse):
        """Handle a request to / when the server manages multiple things."""
        if not self.validateHost(httpClient.GetRequestHeaders()):
            httpResponse.WriteResponseError(403)
            return

        ws_href = 'ws{}://{}'.format(
            self.ssl_suffix,
            httpClient.GetRequestHeaders().get('host', '')
        )

        descriptions = []
        for thing in self.things.get_things():
            description = thing.as_thing_description()
            description['links'].append({
                'rel': 'alternate',
                'href': '{}{}'.format(ws_href, thing.get_href()),
            })
            descriptions.append(description)

        httpResponse.WriteResponseJSONOk(
            obj=descriptions,
            headers=_CORS_HEADERS,
        )

    @print_exc
    def thingGetHandler(self, httpClient, httpResponse, routeArgs=None):
        """Handle a GET request for an individual thing."""
        if not self.validateHost(httpClient.GetRequestHeaders()):
            httpResponse.WriteResponseError(403)
            return

        thing = self.getThing(routeArgs)
        if thing is None:
            httpResponse.WriteResponseNotFound()
            return

        ws_href = 'ws{}://{}'.format(
            self.ssl_suffix,
            httpClient.GetRequestHeaders().get('host', '')
        )

        description = thing.as_thing_description()
        description['links'].append({
            'rel': 'alternate',
            'href': '{}{}'.format(ws_href, thing.get_href()),
        })

        httpResponse.WriteResponseJSONOk(
            obj=description,
            headers=_CORS_HEADERS,
        )

    @print_exc
    def propertiesGetHandler(self, httpClient, httpResponse, routeArgs=None):
        """Handle a GET request for a property."""
        thing = self.getThing(routeArgs)
        if thing is None:
            httpResponse.WriteResponseNotFound()
            return
        httpResponse.WriteResponseJSONOk(thing.get_properties())

    @print_exc
    def propertyGetHandler(self, httpClient, httpResponse, routeArgs=None):
        """Handle a GET request for a property."""
        if not self.validateHost(httpClient.GetRequestHeaders()):
            httpResponse.WriteResponseError(403)
            return

        thing, prop = self.getProperty(routeArgs)
        if thing is None or prop is None:
            httpResponse.WriteResponseNotFound()
            return
        httpResponse.WriteResponseJSONOk(
            obj={prop.get_name(): prop.get_value()},
            headers=_CORS_HEADERS,
        )

    @print_exc
    def propertyPutHandler(self, httpClient, httpResponse, routeArgs=None):
        """Handle a PUT request for a property."""
        if not self.validateHost(httpClient.GetRequestHeaders()):
            httpResponse.WriteResponseError(403)
            return

        thing, prop = self.getProperty(routeArgs)
        if thing is None or prop is None:
            httpResponse.WriteResponseNotFound()
            return
        args = httpClient.ReadRequestContentAsJSON()
        if args is None:
            httpResponse.WriteResponseBadRequest()
            return
        try:
            prop.set_value(args[prop.get_name()])
        except PropertyError:
            httpResponse.WriteResponseBadRequest()
            return
        httpResponse.WriteResponseJSONOk(
            obj={prop.get_name(): prop.get_value()},
            headers=_CORS_HEADERS,
        )

    # === MicroWebSocket callbacks ===

    @print_exc
    def _acceptWebSocketCallback(self, webSocket, httpClient):
        reqPath = httpClient.GetRequestPath()
        if WS_messages:
            print('WS ACCEPT reqPath =', reqPath)
            if ws_run_in_thread or srv_run_in_thread:
                # Print thread list so that we can monitor maximum stack size
                # of WebServer thread and WebSocket thread if any is used
                _thread.list()
        webSocket.RecvTextCallback = self._recvTextCallback
        webSocket.RecvBinaryCallback = self._recvBinaryCallback
        webSocket.ClosedCallback = self._closedCallback
        things = self.things.get_things()
        if len(things) == 1:
            thing_id = 0
        else:
            thing_id = int(reqPath.split('/')[1])
        thing = things[thing_id]
        webSocket.thing = thing
        thing.add_subscriber(webSocket)

    @print_exc
    def _recvTextCallback(self, webSocket, msg):
        if WS_messages:
            print('WS RECV TEXT : %s' % msg)

    @print_exc
    def _recvBinaryCallback(self, webSocket, data):
        if WS_messages:
            print('WS RECV DATA : %s' % data)

    @print_exc
    def _closedCallback(self, webSocket):
        if WS_messages:
            if ws_run_in_thread or srv_run_in_thread:
                _thread.list()
            print('WS CLOSED')
Esempio n. 29
0
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()

# ----------------------------------------------------------------------------
Esempio n. 30
0
        ssid_file.close()
    except:
        Log.i("Cant save the new ssid")
    wlan.deinit()
    wlan = WLAN(mode=WLAN.AP,
                ssid=lopy_ssid,
                auth=(WLAN.WPA2, config.WIFI_PASS),
                channel=11,
                antenna=WLAN.INT_ANT)
    wlan.ifconfig(id=1,
                  config=(config.API_HOST, '255.255.255.0', '10.42.31.1',
                          '8.8.8.8'))


mws = MicroWebSrv()  # TCP port 80 and files in /flash/www
mws.Start(threaded=True)  # Starts server in a new
############################################################################

############################## MONITORING REQ ##############################


def sendToMonitors(req: str, typeRequest: str):
    global lora_monitors_ip
    for monitor in lora_monitors_ip:
        wCli = MicroWebCli("http://" + monitor + ":6666/lopyrequests",
                           method='POST')
        try:
            wCli.OpenRequestFormData(formData={
                'type': typeRequest,
                'request': ubinascii.b2a_base64(req)
            })