本教材以 RTI Connext DDS 的免費取得方案為基礎,說明 DDS 的核心概念、在 Raspberry Pi 5 上建立 DDS 節點的方法,以及在 Pico W2 上建立 DDS 應用程式時的可行架構。
實作安排以 Python 為主;若微控制器端沒有可直接使用的 Python / MicroPython DDS Framework,則補充 C 語言與 Connext Micro 的實作方向。
DDS(Data Distribution Service)是一種資料導向、即時、去中心化的通訊架構。它很常用在機器人、自駕車、工業控制、分散式感測系統與需要低延遲協作的系統中。
| 觀念 | 說明 |
|---|---|
| Domain | 一個邏輯通訊空間,不同 Domain 彼此隔離。 |
| Topic | 資料主題,例如 Temperature、MotorCommand。 |
| Publisher / DataWriter | 負責送出資料。 |
| Subscriber / DataReader | 負責接收資料。 |
| QoS | 控制可靠性、歷史深度、deadline、durability 等行為。 |
| Discovery | DDS 節點可自動發現彼此,不一定需要集中式 Broker。 |
| 比較項目 | DDS | MQTT |
|---|---|---|
| 核心架構 | 去中心化資料匯流排 | 以 Broker 為中心 |
| 即時性 | 高,適合控制與協作 | 中等,適合 IoT 遙測 |
| QoS 粒度 | 細緻且完整 | 相對簡化 |
| 自動發現 | 有 | 通常由 Broker 管理 |
| 資源需求 | 較高 | 較低 |
| 適用場景 | 機器人、車載、工控、數位分身 | IoT 遙測、雲端上傳、輕量訊息 |
apt 安裝 Connext,再用 pip install rti.connext 安裝 Python API,這與 Raspberry Pi OS 的實作流程相容。Pico W2 感測器 / 控制器
│
├─(UART / HTTP / MQTT / UDP)
│
Raspberry Pi 5 橋接程式(Python)
│
└─ RTI Connext DDS Domain
├─ Python Subscriber
├─ Python Publisher
└─ 其他 DDS 節點
Pico W2(C / C++) + 網路堆疊
│
└─ RTI Connext Micro / 類似 DDS for MCU 架構
│
└─ DDS Domain with Raspberry Pi 5
sudo curl -sSL -o /usr/share/keyrings/rti-official-archive.gpg \
https://packages.rti.com/deb/official/repo.key
printf -- "deb [arch=%s, signed-by=%s] %s %s main\n" \
$(dpkg --print-architecture) \
/usr/share/keyrings/rti-official-archive.gpg \
https://packages.rti.com/deb/official \
$(. /etc/os-release && echo ${VERSION_CODENAME}) | \
sudo tee /etc/apt/sources.list.d/rti-official.list >/dev/null
sudo apt update
sudo apt install rti-connext-dds-7.7.0
Get Connext Free 頁面申請。rti_license.dat。~/rti/rti_license.dat。eval $(rtienv -l ~/rti/rti_license.dat)
echo $NDDSHOME
connextdds-py 前需要先能正確取得 NDDSHOME;若使用 Ubuntu / Debian 類系統,也建議明確使用 python3 與 pip3。python3 -m venv ~/venvs/connext
source ~/venvs/connext/bin/activate
pip3 install --upgrade pip
pip3 install setuptools wheel cmake patchelf-wrapper
connextdds-pycd ~/dds-lab
git clone --recurse-submodules https://github.com/rticommunity/connextdds-py.git
cd connextdds-py
python3 configure.py --nddshome "$NDDSHOME" <platform>
pip3 install .
<platform> 是 RTI Connext DDS 的目標平台字串,需與目前安裝的 Connext 平台一致;configure.py 也支援 --jobs、--tcp、--monitoring、--secure 與 --debug 等選項。# 建立 wheel
pip3 wheel .
# 若要升級前先移除舊版
pip3 uninstall rti -y
pip install .、pip wheel . 與開發安裝流程分開說明;在 Raspberry Pi 5 課堂環境中,先完成 simple installation 再跑 DDS 範例,通常較容易驗證。先在新資料夾建立 HelloWorld.idl:
struct HelloWorld
{
int32 value;
};
mkdir -p ~/dds-lab/hello
cd ~/dds-lab/hello
cat > HelloWorld.idl <<'EOF'
struct HelloWorld
{
int32 value;
};
EOF
rtiddsgen -language python -example universal HelloWorld.idl
source ~/venvs/connext/bin/activate
cd ~/dds-lab/hello
eval $(rtienv -l ~/rti/rti_license.dat)
python HelloWorld_subscriber.py
source ~/venvs/connext/bin/activate
cd ~/dds-lab/hello
eval $(rtienv -l ~/rti/rti_license.dat)
python HelloWorld_publisher.py
HelloWorld(value=n)。可把 HelloWorld 換成溫度、濕度、光照等資料結構,例如:
struct SensorReading
{
string device_id;
float temperature;
float humidity;
int64 timestamp_ms;
};
之後讓 Pi 5 端的 Python Publisher 寫入這些資料,而另一個 Subscriber 顯示或存入資料庫。
就目前查到的 RTI 官方公開文件與頁面來看:
pip install rti.connext 後跑 Python DDS。rticonnextdds-examples 的 Python publisher 視為「模擬感測器」;等學生看懂範例後,再把 publisher 換成 Pico W2 → Pi 5 bridge。temperatureled_command 回來rtiddsgen 產生 Python 範例,讓學生熟悉 Topic 型別、Publisher / Subscriber 與 Domain ID。examples/connext_dds/using_qos_profiles/py 執行官方範例,學會用 dds.QosProvider("my_custom_qos_profiles.xml") 載入 XML QoS,並比較 transient_local 與 volatile 的差異。examples/connext_dds/partitions/py 執行範例,理解「同一個 Topic 也能用 partition 做邏輯分群」,很適合拿來模擬不同小組、不同教室或不同設備群。examples/connext_dds/content_filtered_topic/py 執行 publisher / subscriber,觀察 subscriber 端如何只接收符合條件的資料,並在程式中動態修改 topic.filter_parameters。examples/connext_dds/waitset_query_cond/py 執行範例,理解事件驅動式等待與條件篩選,適合銜接即時監控、告警條件與邊緣分析。examples/connext_dds/request_reply/py 執行 primes_replier.py 與 primes_requester.py 100,理解 DDS 不只可做資料發布,也能做服務式互動。git clone --depth 1 https://github.com/rticommunity/rticonnextdds-examples.git
cd rticonnextdds-examples/examples/connext_dds/using_qos_profiles/py
python3 profiles_program.py --pub
python3 profiles_program.py --sub
cd ../../partitions/py
python3 partitions_program.py -p
python3 partitions_program.py -s
cd ../../content_filtered_topic/py
python3 cft_publisher.py
python3 cft_subscriber.py
cd ../../waitset_query_cond/py
python3 waitset_query_cond_publisher.py
python3 waitset_query_cond_subscriber.py
cd ../../request_reply/py
python3 primes_replier.py
python3 primes_requester.py 100
USER_QOS_PROFILES.xml 或自訂 XML 檔;因此上課時要提醒學生「必須在範例自己的目錄中執行」,否則 QoS 設定可能不會被正確載入。不一定。DDS 常見的是節點自動發現彼此,不是像 MQTT 那樣預設依賴 Broker。
因為它有完整 Linux、較多記憶體、可直接安裝 RTI 工具與 Python API,也更容易除錯。
因為微控制器的開發與除錯成本較高,且目前沒有查到 RTI 官方提供給 Pico W2 的現成 MicroPython DDS 框架。
若目標是理解即時分散式系統,可選 DDS;若目標是快速完成 IoT 實驗,MQTT 仍然是較低門檻的起點。
apt install 說明。Building and Installing〉說明了 connextdds-py 的需求條件、configure.py、pip install .、pip wheel . 與開發安裝流程。rticommunity/rticonnextdds-examples repo 提供多個可直接用於 Python 教學的範例,特別適合安排成 QoS、Partitions、ContentFilteredTopic、WaitSet 與 Request-Reply 的循序課程。USER_QOS_PROFILES.xml 或自訂 XML,因此教學時必須強調執行目錄與 QoS 載入方式。