Wiki
TCP通信
An English translation is not available yet. The latest Simplified Chinese source is shown without triggering paid translation.
1.Linux TCP 通信
TCP 通信是 Linux 网络编程中最常见的通信方式之一。
在机器人和嵌入式 Linux 项目中,TCP 常用于上位机之间、机器人和服务器之间、机器人和调试软件之间的可靠通信。
相比串口和 CAN,TCP 更偏向网络通信。它通常运行在以太网、Wi-Fi 或本机回环网络上,适合传输控制命令、配置参数、日志、状态信息、文件数据等。
在实际项目中,TCP 通信常见于:
- Qt 上位机和机器人主控通信
- 机器人和远程服务器通信
- 工控机和网络设备通信
- 多个程序之间进行可靠数据交换
- 远程发送控制命令
- 上传日志、配置文件、地图文件
- 和某些雷达、相机、工业设备的 SDK 通信
TCP 的特点是可靠、按顺序传输、不容易丢数据,适合对数据完整性要求较高的场景。
1.1.TCP 通信是什么
TCP,全称 Transmission Control Protocol,是一种面向连接的可靠传输协议。
在使用 TCP 通信之前,客户端和服务端需要先建立连接。连接建立后,双方就可以像读写文件一样进行数据收发。
典型结构如下:
TCP Server
↑↓
TCP Client
常见概念包括:
| 概念 | 说明 |
|---|---|
| IP 地址 | 用来定位网络中的设备,例如 192.168.1.10 |
| 端口号 | 用来区分同一设备上的不同服务,例如 8080 |
| Server | 服务端,负责监听端口并等待连接 |
| Client | 客户端,主动连接服务端 |
| Socket | 网络通信的抽象接口 |
| 连接 | TCP 通信前需要先建立连接 |
| 粘包 | TCP 是字节流协议,需要自己设计应用层协议 |
需要注意的是,TCP 不是一条消息对应一次接收。TCP 本质上是字节流协议,所以实际工程中通常需要设计自己的数据协议,例如帧头、长度、命令字、数据区、校验等。
1.2.Linux 下常见 TCP 库
Linux 下进行 TCP 通信有多种方案,常见的包括:
| 方案 | 类型 | 特点 | 适合场景 |
|---|---|---|---|
| Linux socket API | Linux 原生接口 | 最底层、依赖少、通用性强 | 想深入理解网络通信机制 |
| boost::asio | 通用 C++ 网络库 | 支持同步/异步,适合 C++ 工程封装 | 推荐用于 C++ 项目 |
| Qt Network | Qt 网络模块 | 和 Qt 界面程序结合方便 | Qt 上位机 |
| Poco Net | C++ 网络库 | 封装完整,功能丰富 | 中大型 C++ 服务程序 |
| Python socket | Python 标准库 | 简单方便,适合测试 | Python 调试脚本 |
| ROS 2 topic/service/action | ROS 2 通信机制 | 适合 ROS 2 内部节点通信 | ROS 2 系统内部通信 |
这些方案本质上都是为了完成 TCP 连接、发送和接收,只是封装层次不同。
1.3.各方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| Linux socket API | 原生、稳定、依赖少、通用性强 | 代码相对繁琐,异步处理麻烦 |
| boost::asio | C++ 工程友好,异步通信方便,适合封装 driver | 需要理解 io_context、socket、回调等概念 |
| Qt Network | 和 Qt 程序结合自然,信号槽使用方便 | 不适合脱离 Qt 的底层 driver |
| Poco Net | 封装完整,工程能力强 | 对初学者略重 |
| Python socket | 上手快,适合测试 | 不适合作为 C++ 底层主线 |
| ROS 2 通信 | ROS 2 内部集成方便 | 不适合替代通用 TCP 学习 |
1.4.本教程建议选择
本教程建议优先选择:
boost::asio
原因是:
- 适合 C++ 工程开发
- 同时支持 TCP、UDP、串口、定时器等功能
- 可以写同步代码,也可以写异步代码
- 不依赖 ROS 2,方便在普通 C++、OpenCV、Qt、嵌入式 Linux 项目中复用
- 后续可以和串口、UDP、定时器形成统一的 I/O 编程风格
推荐的工程结构是:
上层项目:ROS 2 / OpenCV / Qt / 普通 C++ 程序
↓
自己封装的 TcpClient / TcpServer 类
↓
boost::asio
↓
TCP socket
↓
远程设备 / 服务器 / 调试软件
1.5.与 ROS 2 的关系
学习 TCP 通信,并不代表要用 TCP 替代 ROS 2 的 topic、service、action。
在 ROS 2 系统内部,节点之间通信通常优先使用 ROS 2 自己的通信机制。而 TCP 更适合用在 ROS 2 系统之外的设备、程序或服务之间。
例如:
ROS 2 节点
↓
自己封装的 TcpClient
↓
boost::asio
↓
远程服务器 / Qt 调试软件 / 网络设备
也就是说,ROS 2 负责机器人系统内部通信,TCP 负责和外部系统、网络设备、远程服务进行交互。
1.6.本章学习目标
学习完本章后,应该能够掌握:
- TCP 通信的基本概念
- IP 地址、端口号、服务端、客户端的含义
- Linux socket 和 Boost.Asio 的基本关系
- 使用 C++ 创建 TCP 客户端和服务端
- 理解 TCP 字节流和粘包问题
- 设计简单的 TCP 应用层协议
- 将 TCP 通信封装成可复用的 C++ 类
- 为后续网络设备通信、远程控制、Qt 上位机打基础