4. TCP/UDP通信:地面站到底该用哪种协议?
做地面站开发,绕不开TCP和UDP这两个协议。很多新手问我:「老师,到底用哪个好?」我的回答永远是——看场景。今天我就把这两个协议掰开揉碎了讲清楚,再结合地面站的实际通信模式,聊聊端口配置和防火墙那些坑。
4.1 TCP与UDP的核心区别
先看一张对比表,把差异说透:
| 对比维度 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接(直接发) |
| 可靠性 | 保证送达,丢包重传 | 不保证送达,丢了就丢了 |
| 数据顺序 | 保证顺序 | 不保证顺序 |
| 传输效率 | 较低(有确认机制) | 较高(无确认机制) |
| 适用场景 | 文件传输、指令下发 | 视频流、遥测广播 |
说白了,TCP像个快递员——必须你签收他才走,没签收就再送一次。UDP像个扔纸飞机的人——扔出去就不管了,接不接得到看运气。
我在项目中遇到过一件事:有个团队用UDP传飞控参数,结果丢包导致参数写了一半,飞机直接失控。嗯,从那以后,参数配置我坚决用TCP。
4.2 地面站中的网络通信模式
地面站通信,常见三种模式。我画了张图,一看就明白:
4.3 端口配置——别小看这个数字
端口配置看似简单,但坑不少。地面站常用端口:
| 协议 | 默认端口 | 用途 | 备注 |
|---|---|---|---|
| MAVLink TCP | 5760 | 地面站与飞控通信 | Pixhawk默认 |
| MAVLink UDP | 14550 | 遥测广播 | Mission Planner默认 |
| RTK基站 | 2101 | 差分GPS数据 | UDP传输 |
| 视频流 | 5600 | 图传数据 | UDP传输 |
配置端口时,记住三个原则:
- 端口不能冲突——两个程序不能占同一个端口
- 端口不能乱改——改了要同步修改飞控和地面站
- 端口要避开系统保留端口——0-1023是系统端口,别用
我的习惯:地面站开发时,我会把端口号写在配置文件里,不要硬编码。这样换环境时改个配置文件就行,不用重新编译。我曾经吃过硬编码的亏——客户现场端口冲突,我远程指导改了半小时才搞定。
4.4 防火墙设置——地面站连不上的罪魁祸首
地面站连不上无人机,十有八九是防火墙在搞鬼。你想想看,Windows防火墙默认会拦截所有入站连接,地面站作为客户端去连飞控没问题,但飞控主动发数据回来就可能被拦。
排查步骤:
- 先ping一下——看网络通不通
- 再telnet一下——看端口通不通
- 最后看防火墙日志——看有没有被拦截的记录
具体操作:
# 测试网络连通性
ping 192.168.1.100
# 测试端口是否开放(Windows)
telnet 192.168.1.100 5760
# 测试端口是否开放(Linux)
nc -zv 192.168.1.100 5760
注意:telnet在Windows 10/11默认没安装,需要去「启用或关闭Windows功能」里开启。或者直接用PowerShell的Test-NetConnection命令。
防火墙配置建议:
- 开发环境:直接关闭防火墙(仅限内网测试)
- 生产环境:添加入站规则,放行地面站使用的端口
- 公网环境:只放行特定IP的访问,别全开
我曾经踩过的坑:有一次在客户现场部署地面站,怎么都连不上无人机。折腾了两个小时,最后发现是客户IT部门统一部署了企业版防火墙,把UDP 14550端口全封了。从那以后,我每次去现场都先问一句:「防火墙谁管的?」
4.5 实战:地面站通信模式选择指南
最后给个选择建议,你直接照着用就行:
| 场景 | 推荐协议 | 原因 |
|---|---|---|
| 参数读写 | TCP | 必须可靠,丢一个参数飞机就废了 |
| 遥测数据 | UDP | 丢几帧没关系,实时性更重要 |
| 视频图传 | UDP | 延迟敏感,丢包可以容忍 |
| 指令下发 | TCP | 起飞、降落这种指令不能丢 |
| 日志下载 | TCP | 文件传输必须完整 |
说白了,关键数据用TCP,实时数据用UDP。这个原则我用了十年,没出过问题。
一个小技巧:如果你不确定用哪个,那就用TCP。TCP虽然慢一点,但至少不会丢数据。UDP用不好,调试起来很痛苦——你根本不知道是没发出去还是丢了。