# ESP32
**Repository Path**: bh-feng/esp32
## Basic Information
- **Project Name**: ESP32
- **Description**: ESP32WIFI控制LED
- **Primary Language**: Python
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2022-06-12
- **Last Updated**: 2024-07-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ESP32工程
## 目录
1. [ESP32WIFI编程](# 1、ESP32WIFI编程)
2. [ESP32PC端控制LED](# 2、ESP32PC端控制LED)
---
### 1、ESP32WIFI编程
ESP32中自带WIFI功能模块,本工程事基于**Micropython**编写的。这里工程代码借鉴于[IT项目网](https://doc.itprojects.cn/0006.zhishi.esp32/02.doc/index.html#/README)。
ESP32Wifi编程主要有一下几个步骤:
>1. 设置工作模式
>2. 链接Wifi服务器
>3. 创建套接字以发送数据
#### (1)设置工作模式
`Wi-Fi`网络环境通常有两种设备:
* `Access Point(AP)` 无线接入点,提供无线接入的设备,家里的光猫就是结合WiFi和internet路由功能的AP。AP和AP可以相互连接。
* `Station(STA)` 无线终端,连接到AP的装置,手机,电脑等需要联网的设备都是出于STA模式,这个模式不允许其他设备接入
```PYTHON
import network
wlan = network.WLAN(network.STA_IF)
```
#### (2)链接Wifi服务器
以下是[官方文档][id]的例程:
```PYTHON
import network
wlan = network.WLAN(network.STA_IF) # create station interface
wlan.active(True) # activate the interface
wlan.scan() # scan for access points
wlan.isconnected() # check if the station is connected to an AP
wlan.connect('essid', 'password') # connect to an AP
wlan.config('mac') # get the interface's MAC address
wlan.ifconfig() # get the interface's IP/netmask/gw/DNS addresses
```
* `essid`其实和ssid相同,就相当于多个路由器公用这个名字,是一个总称。比如`nuaa.wifi6`。
* `ssid`就是手机上搜索到的wifi名(本质是一串**字符**)
#### (3)创建套接字以发送数据
使用套接字发送数据主要有以下几个步骤:
>1. 创捷套接字(socket)
>2. 发送/接收数据
>3. **关闭**套接字
想要深入了解什么是套接字Socket,可以参考以下链接: https://doc.itprojects.cn/0001.zhishi/python.0006.networkprogram/index.html#/03.pingifconfig
简而言之,套接字(socket)就是网络中运行的进程之间相互通信的一种方式,而不同PC端进程之间的通讯需要的条件有:
>1. 明确是哪台电脑到哪台电脑,即用ip地址来标记
>2. 明确电脑上的那个程序,即用端口来标记
>3. 还要明确怎样进行传送数据,即网络协议(可以通俗的理解为怎样发送数据,怎样接收数据的规范,这里我们主要使用UDP)
#### Step1:创建套接字
```python
import socket
s = socket.socket(AddressFamily, Type)
```
* `AddressFamily`:可以选择`AF_INET`(用于Internet进程之间通讯)或者`AF_UNIX`(用于同一台机器进程间通信),实际工作中常用的是`AF_INET`
* `Type`:套接字的类型,可以是`SOCK_STREAM`(流式套接字,主要用于 TCP 协议)或者 `SOCK_DGRAM`(数据报套接字,主要用于 UDP 协议)
```python
from socket import *
#创建UDP套接字
s = socket(AF_INET, SOCK_DGRAM)
#不使用时关闭套接字
s.close()
```
#### Step2:发送接收数据
发送接收数据时需要协议的,主要协议有:
* `udp`:只负责发送,不管是否成功接收
* `tcp`:每发送一个数据,接收方需要发送一个响应即收到了
```python
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 设置UDP套接字允许其广播(注意如果udp套接字需要广播,则一定要添加此语句)
#udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
#绑定端口号 端口号不能绑定1-1023,且这个端口不能被占用
#如果需要绑定端口,需要先绑定再接收发送
udp_socket.band('ip可以不绑定',7788)
# 2. 准备接收方的地址
dest_addr = ('192.168.31.56', 8080)
# 3. 从键盘获取数据
send_data = input("请输入需要发送的数据")
# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 接收数据并打印
recv_msg=udp_socket.recvfrom(1024)
#udp_socket.recvfrom(接收数据的最大数量)
print("%s(%d)>>>%s" % (recv_msg[1][0],recv_msg[1][1],(recv_msg[0].decode("gbk")))
# 6. 关闭套接字
udp_socket.close()
```
### 2、ESP32PC端控制LED
#### 2.1 运行代码
```python
#流程
#1.Connect wifi
#2.Create socket
#3.receive Udqp
#4.on/off led
import socket
import machine
import time
import network
#======================连接Wifi======================
def wifi_connect():
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
wlan.connect('Xiaomi_F627','12345678')
i=1
while not wlan.isconnected():
print("正在连接网络。。。{}".format(i))
time.sleep(1)#1s询问一次
print('network config:',wlan.ifconfig())
#======================创建套接字======================
def create_udp_socket():
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_socket.bind(("0.0.0.0",6789))
return udp_socket
def main():
led = machine.Pin(2, machine.Pin.OUT)
led.value(1)
time.sleep(1)
led.value(0)
#1.Connect wifi
wifi_connect()
#2.Create socket
udp_socket=create_udp_socket()
#3.receive Udqp
while True:
recv_data, sender_info = udp_socket.recvfrom(1024)
print("{}发送{}".format(sender_info, recv_data))
recv_data_str = recv_data.decode("utf-8")
try:
print(recv_data_str)
except Exception as ret:
print("error:", ret)
# 处理接收的数据
if recv_data_str == "light on":
print("这里是要灯亮的代码...")
led.value(1)
elif recv_data_str == "light off":
print("这里是要灯灭的代码...")
led.value(0)
elif recv_data_str == "light triggle":
print("这里是要灯闪烁的代码...")
for i in range(5) :
led.value(1)
time.sleep(0.5)
led.value(0)
time.sleep(0.5)
if __name__ == '__main__':
main()
```
#### 2.2 运行效果
|网络调试助手|python运行结果|
|:---:|:---:|
|
|
|
[id]:https://docs.micropython.org/en/latest/esp32/quickref.html#