跳到正文

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