第 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 上位機打基礎
音乐页