跳到正文

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 上位機打基礎