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