一、连接WIFI
查阅MicroPython官方文档,可以找到连接wifi最基础的实例代码
- 设置工作模式
AP(AccessPoint),无线接入点,即家里的路由器类似的功能。
STA(Station),无线终端,即连接到AP的装置,手机、电脑等。这个模式不允许其他设备接入。
通过以下代码可以扫描到附近的设备
import network
wlan = network.WLAN() #默认即为STA模式
wlan.active(True)
# 扫描附近的wifi 2.4G按照list形式返回
wifiList = wlan.scan()
# 解包扫描的元组数据格式化打印(ssid, bssid, channel, RSSI, security, hidden)
for ssid, bssid, channel, rssi, security, hidden in wifiList:
print(f"SSID: {ssid}, bssid: {bssid}, channel:{channel}, rssi: {rssi}dBm, security: {security}, hidden: {hidden}")
PC端通过python建立udp通道后,可以直接等待ESP32发送数据
这里需要一些python网络通信相关的知识
- PC配置python环境,直接执行脚本,等待单片机发送数据即可
import socket
import time
# 创建一个UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地的相关信息
local_addr = ('192.168.17.237', 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)
# 等待接收对方发送的数据
recv_data, addr = udp_socket.recvfrom(1024)
# 打印接收到的数据
print(f"[From {addr[0]}:{addr[1]}]: {recv_data.decode('utf-8')}")
time.sleep(1)
#收到单片机数据之后,会送一次数据
des_addr = ("192.168.17.122", 8081)
send_data = "I'm here, my esp32." #发送的数据
udp_socket.sendto(send_data.encode('utf-8'), des_addr) #通过socket发送
# 关闭套接字
udp_socket.close()
基于之前已经连接的wifi,向PC发送数据
import network
import time
from socket import *
wlan = network.WLAN()
wlan.active(True)
# 扫描附近的wifi 2.4G按照list形式返回
wifiList = wlan.scan()
import network
import time
from socket import *
wlan = network.WLAN()
wlan.active(True)
# 扫描附近的wifi 2.4G按照list形式返回
wifiList = wlan.scan()
# 解包扫描的元组数据格式化打印(ssid, bssid, channel, RSSI, security, hidden)
for ssid, bssid, channel, rssi, security, hidden in wifiList:
# 解码SSID(bytes转string)
ssid_str = ssid.decode('utf-8') if ssid else "<隐藏网络>"
# 格式化BSSID(MAC地址)
bssid_str = ':'.join(['%02x' % b for b in bssid])
print(f"SSID: {ssid_str}, bssid: {bssid_str}, channel:{channel}, rssi: {rssi}dBm, \
security: {security}, hidden: {hidden}")
print("MAC:" + str(wlan.config("mac")))
print("IP:" + str(wlan.ipconfig("addr4"))) # 未连接时地址为空
print(wlan.isconnected())
wlan.connect("find", "0000000000")
time.sleep(5)
print(wlan.isconnected())
#连接成功之后向指定IP发送数据
udp_socket = socket(AF_INET, SOCK_DGRAM)
des_addr = ("192.168.17.237", 8081)
send_data = "hello my pc" #发送的数据
udp_socket.sendto(send_data.encode('utf-8'), des_addr) #通过socket发送
#发送信息之后,等待PC回信
# 绑定本地的相关信息
local_addr = ('192.168.17.122', 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)
# 等待接收对方发送的数据
recv_data, addr = udp_socket.recvfrom(1024)
# 打印接收到的数据
print(f"[From {addr[0]}:{addr[1]}]: {recv_data.decode('utf-8')}")
udp_socket.close() #关闭资源
运行效果:
二、PC控制LED
结合一的知识,可以实现一个简单的PC发送数据、ESP32接受数据的小Demo
# PC端
import socket
# 创建一个UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
des_addr = ("192.168.17.122", 8081)
print("Test Demo")
print("imput -> 0 to exit")
while True:
send_data = input("input send data:")
udp_socket.sendto(send_data.encode('utf-8'), des_addr) #通过socket发送
print(f"send: {send_data}")
if send_data == "0" : break
# 关闭套接字
udp_socket.close()
# ESP32端
import network
import time
from socket import *
wlan = network.WLAN()
wlan.active(True)
print(wlan.isconnected())
wlan.connect("find", "0000000000")
time.sleep(5)
print(wlan.isconnected())
print("MAC:" + str(wlan.config("mac")))
ip, mask = wlan.ipconfig("addr4")
print("IP:" + str(ip))
udp_socket = socket(AF_INET, SOCK_DGRAM)
local_addr = (ip, 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)
while True: #持续接收PC的数据
# 等待接收对方发送的数据
recv_data, addr = udp_socket.recvfrom(1024)
r_str = recv_data.decode('utf-8')
# 打印接收到的数据
print(f"[From {addr[0]}:{addr[1]}]: {r_str}")
if r_str == "0" : break
udp_socket.close() #关闭资源
先后运行PC与ESP32,实现PC与ESP32的多次通信
只需要在此基础上,对ESP32端进行稍加改造,便可实现PC控制LED的能力
import network
import time
from socket import *
from machine import Pin, PWM
pwm2 = PWM(Pin(2), freq = 10000)
'''
命令格式:LT [is_on] [duty]
is_on为LED状态 1-打开 0-关闭
duty为亮度 0-100% 可选
'''
def split_input(re_str) -> List[int]:
comm = re_str.split(' ')
if comm[0].startswith("LT") and len(comm) == 3 :
return [int(comm[1]), int(comm[2])]
return [];
def control_light(is_on, duty = 100):
if duty > 100 or duty < 0 : return
if is_on == 1 :
pwm2.duty(int(1023 * (duty / 100)))
elif is_on == 0:
pwm2.duty(0)
wlan = network.WLAN()
wlan.active(True)
wlan.connect("find", "0000000000") # 自己的wifi名称和密码
if not wlan.isconnected() : time.sleep(5)
print(wlan.isconnected())
ip, mask = wlan.ipconfig("addr4")
print("IP:" + str(ip))
udp_socket = socket(AF_INET, SOCK_DGRAM)
local_addr = (ip, 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)
while True: #持续接收PC的数据
# 等待接收对方发送的数据
recv_data, addr = udp_socket.recvfrom(1024)
r_str = recv_data.decode('utf-8')
# 打印接收到的数据
print(f"[From {addr[0]}:{addr[1]}]: {r_str}")
comms = split_input(r_str)
if len(comms) != 0 :
control_light(comms[0], comms[1])
if r_str == "0" : break
udp_socket.close() #关闭资源
PC端运行脚本,输入对应指令,即可控制LED亮灭