第 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 APILinux 原生接口最底层、依赖少、通用性强想深入理解网络通信机制
boost::asio通用 C++ 网络库支持同步/异步,适合 C++ 工程封装推荐用于 C++ 项目
Qt NetworkQt 网络模块和 Qt 界面程序结合方便Qt 上位机
Poco NetC++ 网络库封装完整,功能丰富中大型 C++ 服务程序
Python socketPython 标准库简单方便,适合测试Python 调试脚本
ROS 2 topic/service/actionROS 2 通信机制适合 ROS 2 内部节点通信ROS 2 系统内部通信

这些方案本质上都是为了完成 TCP 连接、发送和接收,只是封装层次不同。

各方案对比

方案优点缺点
Linux socket API原生、稳定、依赖少、通用性强代码相对繁琐,异步处理麻烦
boost::asioC++ 工程友好,异步通信方便,适合封装 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 上位机打基础
音乐页