MicroPython-On-ESP8266——WIFI与网络
1 WIFI功能
esp8266芯片的核心就是与wifi功能,对应使用micropython里面的network
模块。
wifi模块有两种模式
- STA_IF 也就是station站点模式,将本芯片作为客户端连接到已知的无线网络上
- AP_IF 也就是AP/热点模式,将本芯片作为无线热点,等待其他客户端连接上来
配置wifi模式的基本代码如下
>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
>>> ap_if = network.WLAN(network.AP_IF)
后面就结合代码示例来具体了解两种模式
1.1 WIFI热点网络创建
import network
ap = network.WLAN(network.AP_IF) # 指定用ap模式
ap.active(True) # 启用wifi前需要先激活接口
ap.config(essid="EUROPA-AP") # 设置热点名称
ap.config(authmode=3, password='1234567890') # 设置认证模式与密码
1.1.1 config可设置参数
- mac, MAC地址
- essid, 热点名称
- channel, wifi通道
- hidden, 是否隐藏
- authmode, 认证模式
- 0 – 无密码
- 1 – WEP认证
- 2 – WPA-PSK
- 3 – WPA2-PSK
- 4 – WPA/WPA2-PSK
- password, 连接密码
- dhcp_hostname, DHCP主机名
config函数,参数指定值时为设定对应配置,不指定参数时就是读取配置
1.1.2 其他限制
使用AP热点模式时,esp8266芯片可提供的连接数量是有限的,像我使用的青蛙创客europa开发板它限制最多支持4个客户端连接。
1.2 连接现有WIFI网络
import network
import utime
sta_if = network.WLAN(network.STA_IF) # 配置wifi模式为station
if not sta_if.isconnected(): # 判断有无连接
print('connecting to network...')
sta_if.active(True) # 激活wifi接口
sta_if.connect('<essid>', '<password>') # 连接现有wifi网络,需要替换为已知的热点名称和密码
while not sta_if.isconnected():
utime.sleep(1) # 未连接上就等待一下,直到连接成功
print('network config:', sta_if.ifconfig()) # 输出当前wifi网络给自己分配的网络参数
# ('192.168.1.100', '255.255.255.0', '192.168.1.1', '8.8.8.8')
2 连接网络 (TCP sockets)
一旦wifi网络连接成功,那咱们就可以畅游网络,网络连接在micropython中主要是使用或封装socket
模块来实现。
七层网络协议知道吧,socket
模块应该是介于应用层
和网络层+传输层
中间的一个抽象封装,为上层应用层提供直接使用底层网络的能力。
2.1 socket通信的基本流程
既然是通信,那就是两方之间对话。socket通信中需要区分是服务端还是客户端,服务端自然是提供一个网络服务,等待其他客户连接上来并请求数据,
客户端自然是主动的那一方,连接到指定的服务端然后干一些不可描述的事情。
咱们看一下通信的流程图
这里姑且只放此流程图大家粗品一下,要细品的还是得从度娘下手,这里不扩展了。毕竟把不可描述的手伸向度娘,大家都熟。
2.2 socket客户端
2.2.1 使用socket来收发数据
def http_get(url):
import socket
_, _, host, path = url.split('/', 3)
addr = socket.getaddrinfo(host, 80)[0][-1]
s = socket.socket()
s.connect(addr)
s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
while True:
data = s.recv(100)
if data:
print(str(data, 'utf8'), end='')
else:
break
s.close()
http_get("https://www.baidu.com/more/")
2.2.2 已封装好的socket模块urequests
python语言中requests模块简直是网络功能使用的首选模块,特别是广泛应用于爬虫圈。
micropython里面大神们也参考requests库将socket封装出一个urequests
库。
用法上面基本一致,简单是我辈福音
import urequests
rep = urequests.get("https://www.baidu.com/more/")
print(rep.text)
rep = urequest.post("http://xxx.com", date=...)
2.4 socket服务端
import machine
pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]
html = """<!DOCTYPE html>
<html>
<head> <title>ESP8266 Pins</title> </head>
<body> <h1>ESP8266 Pins</h1>
<table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
</body>
</html>
"""
import socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('listening on', addr)
while True:
cl, addr = s.accept()
print('client connected from', addr)
cl_file = cl.makefile('rwb', 0)
while True:
line = cl_file.readline()
if not line or line == b'\r\n':
break
rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
response = html % '\n'.join(rows)
cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
cl.send(response)
cl.close()
开发板作为socket服务端使用时,需要结合wifi使用。用AP模式开热点或者连接上现有wifi都是可以的。
我这边用AP模式,启动服务后,电脑或手机连接上热点并查看网关地址效果如下: