admin 管理员组文章数量: 887021
MicroPython
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 utimesta_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:breaks.close()
http_get("/")
2.2.2 已封装好的socket模块urequests
python语言中requests模块简直是网络功能使用的首选模块,特别是广泛应用于爬虫圈。
micropython里面大神们也参考requests库将socket封装出一个urequests
库。
request库地址
用法上面基本一致,简单是我辈福音
import urequests
rep = urequests.get("/")
print(rep.text)rep = urequest.post("", 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':breakrows = ['<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模式,启动服务后,电脑或手机连接上热点并查看网关地址效果如下:
本文标签: MicroPython
版权声明:本文标题:MicroPython 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1687373192h95221.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论