在前面的 MQTT 案例中,电脑和 CoCube 通过 MQTT 服务器交换消息。这一次,我们使用 UDP,让同一局域网中的电脑和 CoCube 直接通信。
本教程会完成三个任务:
- 用电脑向 CoCube 发送文字。
- 让 CoCube 向电脑回复消息。
- 通过 UDP 消息远程调用 CoCube 的函数。
1. 准备工作
你需要准备:
- 一台 CoCube
- 一台 Windows、macOS 或 Linux 电脑
- 一个 2.4 GHz Wi-Fi 网络
- Packet Sender
Packet Sender 是一款免费、开源的网络调试工具,可以发送和接收 UDP 数据包。
电脑和 CoCube 必须连接到同一个 Wi-Fi 网络。UDP 通信不需要注册账号,也不需要连接公共服务器。
在 MicroBlocks 中添加以下积木库:
- “添加积木库”→“网络”→“UDP”
- “CoCube”
- “添加积木库”→“其他”→“调用方法”
2. 启动 CoCube 的 UDP 服务
搭建下面的程序,并填写 Wi-Fi 名称和密码:

同时按下 A、B 键后,CoCube 会:
- 连接 Wi-Fi。
- 在 MicroBlocks 中报告自己的 IP 地址。
- 启动 UDP 服务,并监听
5000端口。

图中的 172.20.10.2 只是示例。你的 CoCube 会得到不同的 IP 地址,请记录 MicroBlocks 实际显示的地址。
可以把 IP 地址和端口理解成收件地址:
- IP 地址用于找到局域网中的 CoCube。
- 端口
5000用于把消息交给 CoCube 的 UDP 程序。
Wi-Fi 名称和密码会保存在程序中。分享程序或截图前,请删除自己的密码。
3. 电脑向 CoCube 发送消息
3.1 编写接收程序
搭建下面的程序:

按下 A 键后,程序会不断检查是否收到了 UDP 数据包:
- 没有新消息时,接收到的内容长度为
0。 - 收到消息时,程序会报告消息,并把它显示到 TFT 屏幕上。
循环末尾等待 50 毫秒,可以避免程序过于频繁地检查数据。
3.2 使用 Packet Sender 发送
打开 Packet Sender,在发送区域填写:
| 设置 | 内容 |
|---|---|
| ASCII | Hello CoCube! |
| Address | CoCube 的实际 IP 地址 |
| Port | 5000 |
| Protocol | UDP |
确认 CoCube 已经按下 A 键开始接收,然后点击“Send”。

如果通信成功,CoCube 的 TFT 屏幕会显示:
Hello CoCube!
4. CoCube 向电脑发送消息
Packet Sender 窗口顶部会显示电脑的 IP 地址,底部会显示当前监听的 UDP 端口。请记录这两个值。
在示例截图中:
| 项目 | 示例值 |
|---|---|
| 电脑 IP | 172.20.10.4 |
| 电脑 UDP 端口 | 50843 |
把程序中的 IP 地址和端口替换成你在 Packet Sender 中看到的实际数值:

按下 B 键后,CoCube 会向电脑发送 Hello!。收到的数据包会出现在 Packet Sender 下方的日志中。
172.20.10.4和50843都是示例。电脑重新联网或重新打开软件后,这些数值可能发生变化,需要重新查看并修改程序。
到这里,我们已经完成了双向通信:
- Packet Sender 向
CoCube:5000发送Hello CoCube!。 - CoCube 向 Packet Sender 回复
Hello!。
5. 用 UDP 消息控制 CoCube
收到的数据不一定只是文字,也可以把它当作控制命令。
用下面的程序替换第 3 节的接收程序:

在 Packet Sender 中保持 CoCube 的 IP、端口 5000 和 UDP 协议不变,依次发送:
| 消息 | CoCube 的动作 |
|---|---|
forward |
向前移动 |
backward |
向后移动 |
left |
向左旋转 |
right |
向右旋转 |
这种写法很容易理解:收到什么文字,就执行对应的动作。但是每增加一个命令,都要增加一次判断。
6. 通过 UDP 调用函数
如果希望调用更多积木,可以把函数名和参数一起放进 UDP 消息中:
call,函数名,参数1,参数2……
使用下面的通用接收程序替换第 5 节的固定命令程序:

程序会:
- 接收一个 UDP 数据包。
- 检查消息开头是不是
call。 - 用英文逗号分割消息。
- 取出第 2 项作为函数名。
- 取出第 3 项及后面的内容作为参数列表。
- 使用“调用”积木执行函数。
在 Packet Sender 中发送:
call,CoCube move for msecs,cocube;forward,40,1000
这条消息会让 CoCube 以速度 40 向前移动 1000 毫秒。
还可以尝试:
call,CoCube move for msecs,cocube;backward,40,1000
call,CoCube rotate for msecs,cocube;left,30,1000
call,CoCube rotate for msecs,cocube;right,30,1000
scriptImage04_control.png 和 scriptImage05_function_call.png 是接收程序的两个版本。完成固定命令实验后,请用通用函数调用程序替换它,不要同时运行。
7. 查看积木的函数名
UDP 消息中的函数名和参数必须与积木实际使用的内容一致。
在 MicroBlocks 中右键点击积木,选择“复制至剪贴板”,再把内容粘贴到注释中,就可以查看它对应的 GP Script。

图中的内容是:
'CoCube move for msecs' 'cocube;forward' 40 1000
因此:
- 函数名是
CoCube move for msecs。 - 参数是
cocube;forward、40、1000。
把它们用英文逗号连接,并在开头加上 call,就得到了完整的 UDP 控制消息。
函数调用的详细原理,可以参考:高级程序调用。
8. UDP 通信的特点
与 MQTT 相比,UDP 的通信过程更直接:
- 不需要 MQTT 服务器。
- 不需要账号或主题。
- 适合在同一局域网内快速传递消息。
- 发送时必须知道接收设备的 IP 地址和端口。
UDP 不会确认消息是否成功到达,也不保证消息一定按顺序到达。因此,它适合遥控命令、位置数据等允许偶尔丢失的实时信息,不适合直接传输必须完整保存的重要文件。
9. 常见问题
Packet Sender 发出消息,但 CoCube 没有收到
- 确认电脑和 CoCube 连接到同一个 Wi-Fi。
- 确认填写的是 CoCube 当前显示的 IP 地址。
- 确认目标端口为
5000,协议为 UDP。 - 确认已经按 A 键运行接收程序。
- 检查电脑或路由器是否启用了设备隔离功能。
CoCube 发出消息,但 Packet Sender 没有收到
- 检查程序中的电脑 IP 和 Packet Sender 底部的 UDP 端口。
- 如果 Packet Sender 的端口发生变化,请同步修改 MicroBlocks 程序。
- 第一次运行时,允许 Packet Sender 通过系统防火墙。
函数调用没有反应
- 确认已经添加“调用方法”积木库。
- 确认消息使用英文逗号。
- 确认消息以小写
call开头。 - 检查函数名、参数数量和参数顺序。