mywifi.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import network
  2. from machine import Timer
  3. SSID = "Xiaomi_eng"
  4. # SSID = "Mi11_eng"
  5. PASSWORD = "88888888"
  6. class MyWifi():
  7. # _instance = None
  8. # _first_init = True
  9. # def __new__(cls, *args, **kwargs):
  10. # if cls._instance is None:
  11. # cls._instance = super().__new__(cls)
  12. # return cls._instance # 返回的是内存地址
  13. # WiFi 不能被初始化两次,否则会发生内部错误
  14. # 注意,在重复导入模块时,已经被算作初始化了,如果另一个模块又导入了这个类,很容易重复实例化一个新的WiFi对象
  15. # 避免重复 init,因为那些值会被重新初始化
  16. def __init__(self, ssid=SSID, password=PASSWORD) -> None:
  17. self.wlan = network.WLAN(network.STA_IF)
  18. self.ssid = ssid
  19. self.password = password
  20. self.tim = Timer(0)
  21. self.s = {'status': 'start connect', 'count': 0, 'check_count': 3}
  22. self.tim.init(period=1, mode=Timer.ONE_SHOT,callback=self.check_disconnect)
  23. def check_disconnect(self, timer):
  24. self.tim.init(period=1000, mode=Timer.ONE_SHOT,
  25. callback=self.check_disconnect)
  26. if self.s['status'] == 'start connect':
  27. if not self.wlan.isconnected():
  28. print("Start connect to wifi:", self.ssid)
  29. self.wlan.active(True)
  30. self.wlan.connect(self.ssid, self.password)
  31. print('connecting to network...', self.ssid)
  32. self.s['status'] = 'check isconnected'
  33. self.tim.init(period=1, mode=Timer.ONE_SHOT,
  34. callback=self.check_disconnect)
  35. elif self.s['status'] == 'check isconnected':
  36. if self.wlan.isconnected():
  37. self.s['count'] = 0
  38. self.s['status'] = 'recheck'
  39. print('Connection successful:', self.wlan.ifconfig())
  40. else:
  41. print('try to connect to network...', self.s['count'])
  42. self.s['count'] += 1
  43. # 设置连接超时时间
  44. if self.s['count'] > self.s['check_count']:
  45. self.s['status'] = 'recheck'
  46. self.s['count'] = 0
  47. elif self.s['status'] == 'recheck':
  48. if not self.wlan.isconnected():
  49. self.wlan.active(False)
  50. print('error: wifi disconnect')
  51. self.s['status'] = 'start connect'
  52. def _do_connect(self, recheck=False):
  53. if not self.wlan.isconnected():
  54. self.wlan.active(True)
  55. self.wlan.connect(self.ssid, self.password)
  56. print('connecting to network...', self.ssid)
  57. while not self.wlan.isconnected():
  58. pass
  59. print('network config:', self.wlan.ifconfig())
  60. def get_wifi_addr(self):
  61. return self.get_wifi_ifconfig()[0]
  62. def get_wifi_ifconfig(self):
  63. # 等待 check_disconnect() WiFi连接成功再返回
  64. while not self.s['status'] == 'recheck':
  65. pass
  66. # 返回: ('192.168.31.123', '255.255.255.0', '192.168.31.1', '192.168.31.1')
  67. return self.wlan.ifconfig()
  68. my_wifi = MyWifi()