Skip to content

Commit 2e9f948

Browse files
authored
feat (wifi): add esp8266 function code - WLAN.py (#8)
固件版本: N/A 是否需要文案翻译: 否
1 parent 7c0258a commit 2e9f948

File tree

1 file changed

+230
-0
lines changed

1 file changed

+230
-0
lines changed

network-comm/nic/wifi/WLAN.py

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
import usocket
2+
import log
3+
import utime
4+
import slip
5+
from machine import UART
6+
import _thread
7+
from queue import Queue
8+
9+
# 设置日志输出级别
10+
log.basicConfig(level=log.INFO)
11+
ESP8266_log = log.getLogger("ESP8266")
12+
13+
14+
class ESP8266:
15+
AP = 0 # SLIP_INNER
16+
STA = 1 # SLIP_OUTER
17+
18+
def __init__(self, uart=UART.UART2, mode=STA, callback=None):
19+
self.__uart = uart
20+
self.__mode = mode
21+
self.__message = ''
22+
self.__err = 0
23+
self.__callback = callback
24+
self.__value = None
25+
self.__wait_resp = 0
26+
slip.destroy()
27+
28+
ret = slip.construct(self.__uart, self.__mode, 0)
29+
if ret != 0:
30+
#print('slip netif construct fail')
31+
return None
32+
#print('slip network card create success')
33+
self.__queue = Queue(1)
34+
self.__sock = self.__socket_init()
35+
self.__threadid = _thread.start_new_thread(self.__Socket_Thread, ())
36+
return None
37+
38+
def __socket_init(self):
39+
# 创建一个socket实例
40+
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM, usocket.TCP_CUSTOMIZE_PORT)
41+
sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1)
42+
# 绑定IP
43+
bind_addr = ('172.16.1.2', 5000)
44+
sock.bind(bind_addr)
45+
sock.settimeout(10)
46+
return sock
47+
48+
def __socket_reinit(self):
49+
return self.__socket_init()
50+
51+
# station模式
52+
def station(self, user, password):
53+
self.clear_remain()
54+
__head = 'F3'
55+
self.user = str(user)
56+
self.password = str(password)
57+
if self.__mode == self.STA:
58+
self.__message = self.user + ',' + self.password
59+
else:
60+
#print('Not match station mode')
61+
return -1
62+
self.__Socket_UDP(__head, self.__message)
63+
if self.__err == 1 or self.__value[2] != 'OK':
64+
return -1
65+
return 0
66+
67+
#ap 模式
68+
def ap(self, user, password):
69+
self.clear_remain()
70+
__head = 'F2'
71+
self.user = str(user)
72+
self.password = str(password)
73+
74+
if self.__mode == self.AP:
75+
self.__message = self.user + ',' + self.password
76+
else:
77+
#print('Not match ap mode')
78+
return -1
79+
self.__Socket_UDP(__head, self.__message)
80+
if self.__err == 1 or self.__value[2] != 'OK':
81+
return -1
82+
return 0
83+
84+
# web配网模式
85+
def web_config(self, user, password):
86+
self.clear_remain()
87+
__head = 'F0'
88+
if user == '' and password == '':
89+
self.__message = '0'
90+
else:
91+
self.user = str(user)
92+
self.password = str(password)
93+
self.__message = self.user + ',' + self.password
94+
self.__Socket_UDP(__head, self.__message)
95+
if self.__err == 1 or self.__value[2] != 'OK':
96+
return -1
97+
return 0
98+
99+
def clear_remain(self):
100+
if self.__queue.empty() == False:
101+
self.__queue.get()
102+
self.__err = 0
103+
self.__value = None
104+
105+
# 查询网卡状态
106+
def status(self):
107+
self.clear_remain()
108+
self.__Socket_UDP('F1', '0')
109+
if self.__err == 1:
110+
return 0
111+
return int(self.__value[2])
112+
113+
# 查询网卡版本信息
114+
def version(self):
115+
self.clear_remain()
116+
self.__Socket_UDP('F5', '0')
117+
if self.__err == 1:
118+
return -1
119+
return self.__value[2]
120+
121+
# ota升级
122+
def ota(self, url):
123+
self.clear_remain()
124+
__head = 'F4'
125+
self.__message = str(url)
126+
self.__Socket_UDP(__head, self.__message)
127+
if self.__err == 1 or self.__value[2] != 'OK':
128+
return -1
129+
return 0
130+
# smartconfig配置
131+
def smartconfig(self, mode):
132+
self.clear_remain()
133+
__head = 'F6'
134+
self.__message = str(mode)
135+
self.__Socket_UDP(__head, self.__message)
136+
if self.__err == 1 or self.__value[2] != 'OK':
137+
return -1
138+
return 0
139+
140+
#添加路由信息
141+
def router_add(self, ip='192.168.4.1', mask='255.255.255.0'):
142+
self.ip = ip
143+
self.mask = mask
144+
return slip.router_add('192.168.4.1', '255.255.255.0')
145+
146+
# 获取slip的网络配置
147+
def ipconfig(self):
148+
return slip.ipconfig()
149+
150+
# 设置dns服务器
151+
def set_dns(self, pri_dns='8.8.8.8', sec_dns='114.114.114.114'):
152+
self.pri_dns = pri_dns
153+
self.sec_dns = sec_dns
154+
return slip.set_dns(self.pri_dns,self.sec_dns)
155+
156+
# 设置默认网卡
157+
def set_default_NIC(self, ip_str):
158+
self.ip_str = ip_str
159+
return slip.set_default_netif(self.ip_str)
160+
161+
# 释放slip网卡
162+
def stop(self):
163+
slip.destroy()
164+
return 0
165+
166+
167+
# 封装tlv数据包
168+
def __pack_tlv_format(self, head, content):
169+
self.head = head
170+
self.content = content
171+
if len(self.content) == 0 or len(self.content) > 9999 or len(self.head) != 2:
172+
#print('illegal tlv content')
173+
return -1
174+
len_str ='%04d' % len(self.content)
175+
tlv_pack = self.head+len_str+self.content
176+
return tlv_pack
177+
178+
# 解码tlv数据包
179+
def __unpack_tlv_format(self, msg):
180+
self.msg = str(msg)
181+
tag = self.msg[0:2]
182+
length = self.msg[2:6]
183+
value = self.msg[6:]
184+
len_str ='%04d' % len(value)
185+
if len(value) == 0 or len(value) > 9999 or len(tag) != 2 or len_str != self.msg[2:6]:
186+
#print('illegal tlv content')
187+
return -1
188+
unpack = (tag,length,value)
189+
return unpack
190+
191+
# socket通信(UDP)模块
192+
def __Socket_UDP(self, head, content):
193+
self.head = head
194+
self.content = content
195+
196+
# 消息处理
197+
msg = self.__pack_tlv_format(self.head, self.content)
198+
199+
# 向服务端发送消息
200+
server_addr = ('172.16.1.5',1000)
201+
#print(msg)
202+
self.__err = 0
203+
self.__sock.sendto(msg,server_addr)
204+
self.__wait_resp = 1
205+
data = self.__queue.get()
206+
self.__wait_resp = 0
207+
return data
208+
209+
# socket通信(UDP)模块
210+
def __Socket_Thread(self):
211+
while True:
212+
try:
213+
data=self.__sock.recv(1024)
214+
except Exception as recverr:
215+
if "110" in str(recverr):
216+
self.__err = 1
217+
if self.__wait_resp == 1:
218+
self.__queue.put('0')
219+
else:
220+
utime.sleep(1)
221+
self.__sock = self.__socket_reinit()
222+
else :
223+
value = self.__unpack_tlv_format(data.decode())
224+
#print('mode: {0}, recv {1} bytes, Data: {2}'.format (value[0],len(data), value[2]))
225+
if value[0] == 'FF':
226+
if self.__callback != None:
227+
self.__callback(value[2])
228+
else:
229+
self.__value = value
230+
self.__queue.put('1')

0 commit comments

Comments
 (0)