MicroPython-On-ESP8266——WIFI与网络

22 篇文章 1 订阅
19 篇文章 1 订阅

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库。

request库地址

用法上面基本一致,简单是我辈福音

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模式,启动服务后,电脑或手机连接上热点并查看网关地址效果如下:
在这里插入图片描述

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值