第 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 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 連接、發送和接收,只是封裝層次不同。
各方案對比
| 方案 | 優點 | 缺點 |
|---|---|---|
| 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 學習 |
本教程建議選擇
本教程建議優先選擇:
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 上位機打基礎