4. TCP/UDP通信:地面站到底该用哪种协议?

做地面站开发,绕不开TCP和UDP这两个协议。很多新手问我:「老师,到底用哪个好?」我的回答永远是——看场景。今天我就把这两个协议掰开揉碎了讲清楚,再结合地面站的实际通信模式,聊聊端口配置和防火墙那些坑。

4.1 TCP与UDP的核心区别

先看一张对比表,把差异说透:

对比维度 TCP UDP
连接方式 面向连接(三次握手) 无连接(直接发)
可靠性 保证送达,丢包重传 不保证送达,丢了就丢了
数据顺序 保证顺序 不保证顺序
传输效率 较低(有确认机制) 较高(无确认机制)
适用场景 文件传输、指令下发 视频流、遥测广播

说白了,TCP像个快递员——必须你签收他才走,没签收就再送一次。UDP像个扔纸飞机的人——扔出去就不管了,接不接得到看运气。

我在项目中遇到过一件事:有个团队用UDP传飞控参数,结果丢包导致参数写了一半,飞机直接失控。嗯,从那以后,参数配置我坚决用TCP。

4.2 地面站中的网络通信模式

地面站通信,常见三种模式。我画了张图,一看就明白:

地面站网络通信模式 模式1:直连(TCP) 地面站 飞控 USB / 串口转网口 模式2:局域网(UDP) 地面站 无人机 WiFi / 数传电台 模式3:云端(TCP) 地面站 云服务器 4G / 卫星链路 各模式详解: 1. 直连模式:地面站通过USB或串口转以太网,直接连接飞控。 我建议用TCP,因为参数配置必须可靠,丢一个字节都可能炸机。 2. 局域网模式:地面站和无人机通过WiFi或数传电台组网。 遥测数据用UDP广播,效率高;指令下发用TCP,确保送达。 3. 云端模式:地面站通过4G/卫星链路连接云服务器。 必须用TCP,因为公网环境丢包率高,UDP基本不可用。 我曾经在海上测试卫星链路,UDP丢包率高达40%,换成TCP才稳定。

4.3 端口配置——别小看这个数字

端口配置看似简单,但坑不少。地面站常用端口:

协议 默认端口 用途 备注
MAVLink TCP 5760 地面站与飞控通信 Pixhawk默认
MAVLink UDP 14550 遥测广播 Mission Planner默认
RTK基站 2101 差分GPS数据 UDP传输
视频流 5600 图传数据 UDP传输

配置端口时,记住三个原则:

  • 端口不能冲突——两个程序不能占同一个端口
  • 端口不能乱改——改了要同步修改飞控和地面站
  • 端口要避开系统保留端口——0-1023是系统端口,别用
我的习惯:地面站开发时,我会把端口号写在配置文件里,不要硬编码。这样换环境时改个配置文件就行,不用重新编译。我曾经吃过硬编码的亏——客户现场端口冲突,我远程指导改了半小时才搞定。

4.4 防火墙设置——地面站连不上的罪魁祸首

地面站连不上无人机,十有八九是防火墙在搞鬼。你想想看,Windows防火墙默认会拦截所有入站连接,地面站作为客户端去连飞控没问题,但飞控主动发数据回来就可能被拦。

排查步骤:

  1. 先ping一下——看网络通不通
  2. 再telnet一下——看端口通不通
  3. 最后看防火墙日志——看有没有被拦截的记录

具体操作:

# 测试网络连通性
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用不好,调试起来很痛苦——你根本不知道是没发出去还是丢了。