第 13.3 節
TCP通信
0瀏覽次數0訪問次數--跳出率--平均停留
Linux TCP 通信
TCP 通信是 Linux 网络编程中最常见的通信方式之一。
在机器人和嵌入式 Linux 项目中,TCP 常用于上位机之间、机器人和服务器之间、机器人和调试软件之间的可靠通信。
相比串口和 CAN,TCP 更偏向网络通信。它通常运行在以太网、Wi-Fi 或本机回环网络上,适合传输控制命令、配置参数、日志、状态信息、文件数据等。
在实际项目中,TCP 通信常见于:
- Qt 上位机和机器人主控通信
- 机器人和远程服务器通信
- 工控机和网络设备通信
- 多个程序之间进行可靠数据交换
- 远程发送控制命令
- 上传日志、配置文件、地图文件
- 和某些雷达、相机、工业设备的 SDK 通信
TCP 的特点是可靠、按顺序传输、不容易丢数据,适合对数据完整性要求较高的场景。
TCP 通信是什么
TCP,全称 Transmission Control Protocol,是一种面向连接的可靠传输协议。
在使用 TCP 通信之前,客户端和服务端需要先建立连接。连接建立后,双方就可以像读写文件一样进行数据收发。
典型结构如下:
TCP Server
↑↓
TCP Client
常见概念包括:
| 概念 | 说明 |
|---|---|
| IP 地址 | 用来定位网络中的设备,例如 192.168.1.10 |
| 端口号 | 用来区分同一设备上的不同服务,例如 8080 |
| Server | 服务端,负责监听端口并等待连接 |
| Client | 客户端,主动连接服务端 |
| Socket | 网络通信的抽象接口 |
| 连接 | TCP 通信前需要先建立连接 |
| 粘包 | TCP 是字节流协议,需要自己设计应用层协议 |
需要注意的是,TCP 不是一条消息对应一次接收。TCP 本质上是字节流协议,所以实际工程中通常需要设计自己的数据协议,例如帧头、长度、命令字、数据区、校验等。
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 连接、发送和接收,只是封装层次不同。
各方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 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 学习 |
本教程建议选择
本教程建议优先选择:
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
↓
远程设备 / 服务器 / 调试软件
与 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 负责和外部系统、网络设备、远程服务进行交互。
本章学习目标
学习完本章后,应该能够掌握:
- TCP 通信的基本概念
- IP 地址、端口号、服务端、客户端的含义
- Linux socket 和 Boost.Asio 的基本关系
- 使用 C++ 创建 TCP 客户端和服务端
- 理解 TCP 字节流和粘包问题
- 设计简单的 TCP 应用层协议
- 将 TCP 通信封装成可复用的 C++ 类
- 为后续网络设备通信、远程控制、Qt 上位机打基础