自学读本:跟着读、照着做,卡住就问 AI
你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:用"楼/房间"比喻说出 IP 和端口的关系;说出 TCP 和 UDP 的区别并各举一个例子;解释
server.available()和udp.parsePacket()各自在干什么;亲手让板子当 TCP 服务器、UDP 监听者、TCP 客户端,并从电脑和它对话。用时:60–90 分钟。准备:板子、数据线、已接入板卡 Skill 的 WorkBuddy、一台连在同一 WiFi 的电脑(用来和板子对话)。
一、从"门牌号"再往前走一步
上一课板子连上 WiFi,拿到了 IP 地址——我说是网里的"门牌号"。
今天先想一个问题:板子有了门牌号,数据就知道往哪送了吗?
一栋楼有地址,楼里还住着好几户。邮差送到楼下,还得知道敲哪扇门。板子也一样:它能同时跑好几个服务(WiFi 是一个、聊天是一个、以后网页又是一个),数据只凭 IP 找到板子还不够,还得知道找板子上的哪个服务。
这就是今天第一个主角:端口(port)。
二、一个接得住的比喻:端口是"楼里的房间号"
| 名字 | 通俗说法 | 干什么用 |
|---|---|---|
| IP 地址 | 楼的地址 | 数据先靠它找到"哪块板子" |
| 端口 | 楼里的房间号 | 再靠它找到"板子上的哪个服务" |
一句记牢:IP 找楼,端口找房间里的某个服务。 同一块板子,聊天服务住 10000 号房间、网页服务住 80 号房间,靠"IP + 端口"才能精准敲门。
💡 本课一句话:板子有 IP 只是"能被找到",加上端口才知道"找哪个服务"——IP 是门牌号,端口是房间号。
小目标:让板子开一个聊天服务在 10000 号房间,你从电脑敲它家门,看文字怎么传过去。
三、两条送信的路:TCP 和 UDP
- TCP 像打电话:先拨号接通,对方接了才聊;说出去的话保证按顺序到、丢了重发。慢一点,但可靠。
- UDP 像扔纸条:写好直接扔过去,不保证收到、不保证顺序,但快、省事。
⚠️ 比喻有边界:TCP "像打电话"是"先建立连接再传数据",不是真有电话线;UDP "像扔纸条"也可能到,只是它不打包票;"可靠"要代价——TCP 比 UDP 多花时间步骤。
什么场景用哪个?先别背,用现象自己体会。
四、让板子当 TCP 服务器(先接通,再说话)
请使用课程的 esp32s3-touchboard-hardware-dev Skill,
烧录本课配套程序 assets/codes/demo01_tcp_server:
板子以 TCP 服务器启动,连上 WiFi 后屏幕打印 IP 和端口 10000。
烧录前把 YOUR_WIFI_SSID / YOUR_WIFI_PASSWORD 改成教室真实 WiFi。
烧录后把板子屏幕显示的 IP 告诉我。
板子显示 IP 和"Waiting for PC..."后,在电脑上连它(<板子IP> 换成屏幕上的 IP):
telnet <板子IP> 10000
# 或: nc <板子IP> 10000
敲一行回车,板子把这行原样回显给你,也打到自己屏幕。
| 我观察到的现象 | 勾选 |
|---|---|
| 连上前,板子一直"Waiting for PC..." | |
| 我敲一行,电脑收到同样回显 | |
| 板子屏幕也出现我发的那行 | |
| 我关掉连接,板子显示"PC left." |
停下想:为什么我还没打字,板子就"知道我在了"? 因为 TCP 先接通再说话——你敲 telnet 那下,电脑和板子先完成"握手",之后才聊。代码里 server.available() 就是板子一直问"有谁敲门吗?",谁敲了才开门。
五、让板子当 UDP 监听者(扔纸条)
请改烧录 assets/codes/demo02_udp_listener:
板子以 UDP 在端口 10001 监听;电脑发来的文字,板子打印来源和内容,回 "ACK:..." 回执。
WiFi 占位符同样改成教室真实 WiFi。烧录后告诉我板子 IP。
电脑端发一条(<板子IP> 换屏幕 IP):
# Linux/macOS
echo "hi board" | nc -u -w1 <板子IP> 10001
# Windows 用 Python
python -c "import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.sendto(b'hi board',('<板子IP>',10001))"
板子屏幕跳出 From <你电脑IP>:<端口> hi board。多试几次。
| 我观察到的现象 | 勾选 |
|---|---|
| 我没"接通"任何东西,板子直接收到字 | |
| 板子回了一张 "ACK:..." 回执 | |
| 有时发一条,板子没反应(偶尔丢) | |
| 来源 IP 是我电脑的 IP |
和 TCP 的反差:上一份你要先 telnet 接通;这一份啥也没"连",纸条就飞过去了。 代码里 udp.parsePacket() 就是"有没有纸条飞进来?"——有就拆开看,没有就过。没有"敲门"这一步,所以叫"无连接"。
六、让板子当 TCP 客户端(主动拨号)
请改烧录 assets/codes/demo03_tcp_client:
板子作为 TCP 客户端,主动连电脑(端口 10002)。
烧录前把 WiFi 占位符改成教室 WiFi,并把 YOUR_PC_IP 改成你电脑局域网 IP
(Windows 跑 ipconfig 看 IPv4)。烧录后告诉我板子屏幕显示什么。
先在电脑端起一个 TCP 服务器(一行 Python):
python -c "import socket;s=socket.socket();s.bind(('',10002));s.listen(1);c,a=s.accept();print('got:',c.recv(1024));c.sendall(b'Hi board\n')"
给板子上电。板子发 "Hello from board!",把电脑回的 "Hi board" 打到屏幕。
| 我观察到的现象 | 勾选 |
|---|---|
| 板子"Dialing PC..."然后"Connected!" | |
| 屏幕出现"PC said: Hi board" | |
| 把 YOUR_PC_IP 填错,显示"Connect FAILED" |
收口:客户端和服务器只是"谁先拨号"的区别——服务器等敲门(server.available()),客户端去敲门(client.connect(ip, port)),敲通了两边都能说,本质都是 TCP。
七、改一个条件:关掉"确认",看消息缺一块
先预测:发送端故意每发 3 个丢 1 个,用 UDP 传 10 句话,接收端会看到什么?
| 我改了什么 | 我预测 | 实际看到 |
|---|---|---|
| UDP 发送端每 3 个丢 1 个 | 自己填(如"收到 7 句,缺 3 句") | 讨论后填 |
关键反转:其实"编号 + 确认"我们也能在 UDP 上自己加!
- 发送端给每条消息编号:
Msg#1、Msg#2…… - 接收端收到回:
ACK#2 - 发送端超时没收到
ACK#3,就重发 3 号
同样是 UDP 这条"快但不保证"的路,自己加了编号和确认,就能做出 TCP 那种"不丢"的可靠感。 TCP 不过是把这套动作"内置"了。
💡 收口:TCP = UDP + 编号 + 确认 + 顺序(协议帮你做好)。选通信方式,真正要问的是——"我在乎到不到,还是快不快?"
八、一条完整的"对话"链路
TCP(可靠,先接通):
客户端 client.connect(对方IP, 端口)
三次握手 → 接通
发数据,每条编号,等 ACK
对方按序收到,丢了重发
UDP(快,无连接):
直接往对方 IP+端口 扔数据
不等接通、不确认
对方 udp.parsePacket() 收到就用
想要可靠?自己加"编号 + 确认 + 重发"
真正记牢一句:IP+端口 决定"敲哪扇门",TCP/UDP 决定"怎么把话送到"。
九、故障排查:没收到怎么办
| 现象 | 先检查 |
|---|---|
| 板子一直 Waiting/Listening,电脑连不上 | 电脑和板子同一 WiFi 吗?IP 对吗?防火墙挡端口? |
| TCP 连上立刻断 | 电脑服务器有 accept 吗?端口被占用? |
| UDP 发了没回 | UDP 不保证到,多试;IP/端口没填反?板子真连上 WiFi 了吗? |
| 显示"Connect FAILED" | YOUR_PC_IP 是电脑局域网 IP 吗?电脑服务器起好了吗? |
把现象如实告诉 AI,一次让它教你查一件事。
💡 老规矩:"没收到"是观察,"板子没连上 WiFi"是推测。 推测靠日志和实验验证。串口波特率 115200。
十、过关检查
不看 AI,自己说:
- IP 和端口分别像楼里的什么?为什么光有 IP 不够?
- TCP "像打电话"在哪点像?"握手"是你在代码里写的吗?
server.available()和udp.parsePacket()各自在问什么?一个要先接通、一个不用,差别在哪?- UDP 为什么"快但不保证"?加什么能在 UDP 上做出可靠感?
- 客户端和服务器本质区别是"谁先拨号"吗?举生活例子。
- 聊天、传感器上报、视频直播,分别更适合 TCP 还是 UDP?说理由。
十一、还能玩什么
| 方向 | 想法 | 继续想 |
|---|---|---|
| 局域网文字传话器 | 电脑打字,板子屏幕实时显示聊天 | 怎样给每条消息加"编号 + 已读回执"? |
| 谁是离板子最近的设备 | 板子 UDP 广播,谁先回谁就近 | 用 RSSI(第 17 课)能更准判断远近吗? |
| 可靠的"慢"通道 | 用 TCP 传一张小图片/一段笔记 | 图片太大时,TCP 的可靠会不会变慢? |
| 广播大喇叭 | 一块板 UDP 广播,十块板同时收到 | 哪些场景"一对多"比"一对一"更合适? |
想做"板子去网上找一个 AI 聊天"?那需要板子会一套"网上对话"规则(HTTP/JSON)——第 19 课的事。这课的"端口 + TCP/UDP",就是那扇门的第二道缝。