81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
# deck.net: T-Deck network helper library for CircuitPython
|
|
# Depends on some Adafruit Bundle libs
|
|
# Normal flow (provided Wi-Fi creds are in settings.toml):
|
|
#
|
|
# from deck import net
|
|
# status, stext, myip = net.wifi_connect_wait()
|
|
# if status:
|
|
# requests = net.init_requests()
|
|
# # or socket = net.init_socket() if raw sockets are necessary
|
|
# while net.my_ip():
|
|
# ...
|
|
#
|
|
# Created by Luxferre in 2025, released into public domain
|
|
|
|
import os, time # standard modules
|
|
import wifi # CircuitPython builtins
|
|
# Adafruit Bundle libs
|
|
import adafruit_connection_manager
|
|
import adafruit_requests, adafruit_ntp
|
|
|
|
def wifi_connect(ssid=None, password=None):
|
|
'''
|
|
Connect to a Wi-Fi SSID
|
|
Use settings.toml for default credentials
|
|
'''
|
|
ssid = ssid or os.getenv('CIRCUITPY_WIFI_SSID')
|
|
password = password or os.getenv('CIRCUITPY_WIFI_PASSWORD')
|
|
try:
|
|
wifi.radio.connect(ssid=ssid, password=password)
|
|
except ConnectionError as e:
|
|
return (False, e)
|
|
return (True, 'Connected')
|
|
|
|
def my_ip():
|
|
'Get the local IP address'
|
|
return wifi.radio.ipv4_address
|
|
|
|
def wifi_connect_wait(ssid=None, password=None, tmout=15, retries=3):
|
|
'''
|
|
Connect to a Wi-Fi SSID and wait for successful connection
|
|
Usually, you'll want to use this function to connect
|
|
'''
|
|
r = 0
|
|
status = wifi.radio.connected
|
|
stext = ''
|
|
while not wifi.radio.ipv4_address and r < retries:
|
|
status, stext = wifi_connect(ssid, password)
|
|
if not status:
|
|
time.sleep(tmout)
|
|
r += 1
|
|
if not status:
|
|
stext = 'Could not connect, out of attempts. Last error: ' + stext
|
|
return (status, stext, wifi.radio.ipv4_address)
|
|
|
|
def wifi_scan():
|
|
'Scan for Wi-Fi networks (returns (SSID, rssi) tuple list from strongest to weakest)'
|
|
networks = []
|
|
for network in wifi.radio.start_scanning_networks():
|
|
networks.append(network)
|
|
wifi.radio.stop_scanning_networks()
|
|
networks = sorted(networks, key=lambda net: net.rssi, reverse=True)
|
|
return [(net.ssid, net.rssi) for net in networks]
|
|
|
|
def ssl_context():
|
|
'Get the default SSL context for wrapping a raw socket'
|
|
return adafruit_connection_manager.get_radio_ssl_context(wifi.radio)
|
|
|
|
def init_socket():
|
|
'Get a socket pool and instantiate a Socket library'
|
|
return adafruit_connection_manager.get_radio_socketpool(wifi.radio)
|
|
|
|
def init_requests():
|
|
'Instantiate a Requests library'
|
|
return adafruit_requests.Session(init_socket(), ssl_context())
|
|
|
|
def init_ntp(tz=0):
|
|
'Instantiate an NTP time client'
|
|
pool = init_socket()
|
|
return adafruit_ntp.NTP(pool, tz_offset=tz, cache_seconds=3600)
|
|
|