Hi,
I am looking for example code for uasyncio SSL webserver. I went through every example in micropython-lib-master and internet. Still, I didn't manage to run uasyncio SSL webserver. I am looking for support.
Thanks.
No Example for uasyncio SSL webserver
Re: No Example for uasyncio SSL webserver
I don't think uasyncio supports this yet directly. However, the socket creation is a plain python wrapper around the "normal" socket:
https://github.com/micropython/micropyt ... eam.py#L74
So you can replicate an asyncio socket by just doing what uasyncio does itself.
https://github.com/micropython/micropyt ... eam.py#L74
So you can replicate an asyncio socket by just doing what uasyncio does itself.
Code: Select all
import uasyncio
from uasyncio.stream import Stream
from uasyncio import core
from uerrno import EINPROGRESS
import usocket as socket
import ussl as ssl
async def open_connection(host, port):
ai = socket.getaddrinfo(host, port)[0] # TODO this is blocking!
s = socket.socket()
s.setblocking(False)
ssls = ussl.wrap_socket(s) # Wrap raw socket in SSL socket
ss = Stream(ssls)
try:
s.connect(ai[-1])
except OSError as er:
if er.args[0] != EINPROGRESS:
raise er
yield core._io_queue.queue_write(s)
return ss, ss
- pythoncoder
- Posts: 5956
- Joined: Fri Jul 18, 2014 8:01 am
- Location: UK
- Contact:
Re: No Example for uasyncio SSL webserver
I don't think it's that simple. See roadmap to V1.14 which includes as an aim:
While I may be wrong or out of date, my understanding is that nonblocking sockets don't yet work with SSL/TLS. I believe they do work on the Pyboard D.non-blocking SSL support in uasyncio
Peter Hinch
Index to my micropython libraries.
Index to my micropython libraries.
Re: No Example for uasyncio SSL webserver
Thank you, everyone.
Sorry for forgot it. Actually, I am trying to work with ESP8266. I tried this code in ESP8266. But getting error like below.
"Traceback (most recent call last):
File "main.py", line 2, in <module>
ImportError: no module named 'uasyncio.stream'
MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
"
I spent much time on this and got my sample code working. But, it holds the asyncio other routines of the code while receiving the request.
Could you comment on this sample code? I know this code is not the perfect one .
Sorry for forgot it. Actually, I am trying to work with ESP8266. I tried this code in ESP8266. But getting error like below.
"Traceback (most recent call last):
File "main.py", line 2, in <module>
ImportError: no module named 'uasyncio.stream'
MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
"
I spent much time on this and got my sample code working. But, it holds the asyncio other routines of the code while receiving the request.
Code: Select all
import uasyncio as asyncio
from uasyncio import core
import ussl as ssl
import network
import uos
async def start_server(address, port):
s = socket.socket()
ai = socket.getaddrinfo(address, port, 0, socket.SOCK_STREAM)
print("Bind address info:", ai)
addr = ai[0][-1]
s.setblocking(False)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(5)
print("Listening, connect your browser to https://<this_host>:5978")
counter = 0
while True:
print("\n\nwait for request")
yield core.IORead(s)
s.settimeout(1)
res = s.accept()
client_s = res[0]
client_addr = res[1]
print("Client address:", client_addr)
print("Client socket:", client_s)
# CPython uses key keyfile/certfile arguments, but MicroPython uses key/cert
client_s = ssl.wrap_socket(
client_s, server_side=True, key=key, cert=cert)
print(client_s)
print("Request:")
try:
req = client_s.readline()
print(str(req))
while True:
h = client_s.readline()
if h == b"" or h == b"\r\n":
break
print(str(h))
if req:
client_s.write(CONTENT1 % counter)
#yield from writer.awrite( CONTENT1 % counter )
except Exception as e:
print("Exception serving request:", e)
client_s.close()
counter += 1
print()
await asyncio.sleep_ms(1)
CONTENT1 = b"""\
HTTP/1.0 200 OK
Hello #%d from MicroPython!
"""
def main( ):
loop = asyncio.get_event_loop()
loop.create_task(start_server(ipaddress, port))
loop.run_forever()
loop.close()
main()
- pythoncoder
- Posts: 5956
- Joined: Fri Jul 18, 2014 8:01 am
- Location: UK
- Contact:
Re: No Example for uasyncio SSL webserver
Calls to client_s.readline() are blocking. Consider using StreamReader. However I have no experience of using this with SSL/TLS on ESP8266. I think it should work as it uses polling on a blocking socket.
Peter Hinch
Index to my micropython libraries.
Index to my micropython libraries.
Re: No Example for uasyncio SSL webserver
Hm not quite sure. you can replace Stream with uasyncio.StreamReader as it is the same interface. I only have an ESP32 but it worked fine there.Asanga wrote: ↑Sun Jan 17, 2021 11:23 pmThank you, everyone.
Sorry for forgot it. Actually, I am trying to work with ESP8266. I tried this code in ESP8266. But getting error like below.
"Traceback (most recent call last):
File "main.py", line 2, in <module>
ImportError: no module named 'uasyncio.stream'
MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
"
Re: No Example for uasyncio SSL webserver
Thank you, everyone. I tried to work with stream and to edit asyncio library. But didn't do well. For now, I should wait for the implementation of ssl/ttl socket for asyncio ESP8266 library.