跳到正文

Wiki

TCP通信

约 4 分钟阅读

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 上位机打基础