-
福利一海量deepseek资料包(持续更新)
-
福利二ComfyUI工作流&模型&插件
-
福利三AI工具集合包以及AI绘画解决方案
在 ESP32 上搭建一个 Web 服务,并通过这个服务实现点灯的效果。
说到 Socket,就不得不提两个计算机专业词汇最糟糕的翻译:鲁棒性(Robustness) 和 套接字(Socket),翻译之后与没有翻译的效果一样,依然看不懂什么意思。
当涉及到网络通信时,Socket 是一个常见的概念。它是在计算机网络中实现通信的一种抽象概念或编程接口。通过 Socket,不同计算机之间可以建立连接并进行数据交换。
Socket 可以看作是一种通信端点,它使用 IP 地址和端口号来标识不同的设备和应用程序。每个 Socket 都与一个特定的协议相关联,例如 TCP 或 UDP,用于在网络上进行数据传输。
Socket 是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议(通常是 TCP 或 UDP),本地主机的IP地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。
从上图可以看到,建立 Socket 通信需要一个服务器端和一个客户端。对于客户端,则需要知道电脑端的 IP 和端口即可建立连接。(端口可以自定义,范围在 0~65535,注意不占用常用的80等端口即可。)
下面是 Socket 的一些关键概念:
-IP地址:
在计算机网络中,每个设备都有一个唯一的 IP 地址,用于标识设备的位置。IP 地址由一系列数字组成,例如 IPv4 地址是由四个十进制数(0-255)组成,中间用点分隔,如 192.168.0.1。
端口号
:端口号用于标识一个特定的应用程序或服务,使数据可以传输到正确的目的地。端口号是一个数字,范围从 0 到 65535。0 到 1023 的端口号是为一些特定的服务保留的,例如HTTP的端口号是80,HTTPS的端口号是443。Socket
类型:在 Socket 编程中,有两种常见的套接字类型:Stream Socket(流套接字)和 Datagram Socket(数据报套接字)。Stream Socket
(流套接字) 使用 TCP 协议,提供可靠的、面向连接的通信,确保数据的可靠性和按顺序的传输。Datagram Socket
(数据报套接字) 使用 UDP 协议,提供无连接的通信,适用于实时性要求高的应用,如音视频传输。app = Microdot()
在 Microdot 中,使用路由来指定 URL 与视图函数之间的关系。视图函数是处理请求并生成响应的函数。可以使用 @app.route 装饰器来定义路由,例如:
```python
@app.route('/')
def home():
return 'Hello, MicroDot!'
在上述示例中,@app.route(‘/‘)定义了一个根路由,它对应于网站的根 URL。home()函数是视图函数,当访问根 URL 时,该函数将被执行。在此示例中,它简单地返回一个字符串作为响应。
最后就是运行这个应用,只需要在 Python 文件的末尾,添加一个简单的代码块:
if __name__ == '__main__':
app.run()
这样我们就会启动 Microdot 开发服务器,并且监听默认的 5000 端口。你可以在手机端或者浏览器中访问 http://ESP32的局域网IP:5000 来查看应用程序的响应
from machine import Pin
from common.wifi import wifi_connect
from libs.microdot import Microdot
led_pin = Pin(2, Pin.OUT)
# 定义 WIFI 的账号密码
ssid = 'wifi'
password = '123456qq.'
# 连接 WiFi
wifi_connect(ssid, password)
app = Microdot()
htmldoc = '''<!DOCTYPE html>
<html>
<head>
<title>ESP32 MicroPython Microdot Web 服务</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div>
<h1>ESP32 MicroPython Microdot Web 服务</h1>
<p>你好,Microdot!</p>
<p><a href="/shutdown">关闭服务</a></p>
<p><a href="/led">开关灯</a></p>
</div>
</body>
</html>
'''
@app.route('/')
def hello(request):
return htmldoc, 200, {'Content-Type': 'text/html'}
@app.route('/shutdown')
def shutdown(request):
request.app.shutdown()
return 'The server is shutting down...'
@app.route('/led')
def led(request):
led_pin.value(not led_pin.value())
return htmldoc, 200, {'Content-Type': 'text/html'}
app.run(host='0.0.0.0', port=5000, debug=True)