Bystry DDS
Łączność danych w czasie rzeczywistym dla systemów obronnych
Oprogramowanie pośredniczące obsługujące platformy pojazdów o znaczeniu krytycznym
W pełni funkcjonalny DDS z X-Types. DDS klasy broni do celów obronnych.
Powering defence
Astute DDS to oprogramowanie pośredniczące do dystrybucji danych, stanowiące serce kompletnego rozwiązania Astute Systems w zakresie architektury pojazdu (GVA) DEF-STAN 23-009. Od czujników po ekrany, jedna zunifikowana platforma łączy wszystkie podsystemy w pojeździe wojskowym.
Why Publish/Subscribe
Problem z tradycyjną architekturą
Starsze systemy pojazdów wykorzystują połączenia punkt-punkt. Dodając nowy podsystem, należy zmodyfikować każdy system, z którym się on komunikuje. W ten sposób powstają:
- ❌ Kosztowna integracja — każdy nowy komponent wymaga niestandardowego kodowania
- ❌ Kruche systemy — jedna awaria może spowodować kaskadowe rozprzestrzenienie się po całej sieci
- ❌ Uzależnienie od dostawcy — zastrzeżone protokoły ograniczają Cię do jednego dostawcy
- ❌ Powolne aktualizacje — zmiana jednego podsystemu oznacza konieczność ponownego przetestowania wszystkiego
Rozwiązanie publikowania/subskrybowania
Dzięki architekturze publikowania/subskrybowania DDS podsystemy po prostu publikują dane w nazwanych tematach. Każdy system, który potrzebuje tych danych, subskrybuje temat. Brak połączeń punkt-punkt. Brak niestandardowego kodu integracyjnego.
| Korzyści biznesowe | Jak działa Pub/Sub |
|---|---|
| 💰 Niższe koszty integracji | Dodawaj nowe podsystemy bez modyfikowania istniejących |
| 🔧 Łatwiejsza konserwacja | Samodzielna wymiana lub aktualizacja podzespołów |
| 🛡️ Większa odporność | Systemy działają nadal, nawet gdy inne zawodzą |
| 🏭 Swoboda wielu dostawców | Łączenie sprzętu od różnych dostawców na jednej magistrali danych |
| ⏱️ Szybsze wprowadzanie produktów na rynek | Standardowe interfejsy oznaczają mniej konieczności tworzenia niestandardowych rozwiązań |
Pojedyncze źródło pełnego stosu GVA
Astute Systems to jedyny dostawca oferujący kompletny, zintegrowany pakiet oprogramowania dla pojazdów wojskowych zgodnych ze standardem GVA:
| Część | Co to robi |
|---|---|
| Czech | Przeglądaj i weryfikuj modele SysML, generuj definicje interfejsów |
| LDMX | Najlepszy w swojej klasie edytor i walidator modeli danych lądowych dla LDM v10.0.0 |
| NarzędzieX | Zautomatyzowane generowanie kodu, integracja kompilacji i narzędzia do wdrażania |
| Bystry DDS | Połącz wszystkie podsystemy, zapewniając dystrybucję danych w czasie rzeczywistym i w bezpieczny sposób |
| Model danych lądowych v10.0.0 | Wstępnie skonfigurowane typy danych zgodne ze standardem GVA dla wszystkich domen pojazdów |
| Sprytny HMI | Oprogramowanie wyświetlacza załogi spełniające wymagania DEF-STAN 23-009 |
Korzyści z pełnego stosu
| Korzyść | Uderzenie |
|---|---|
| 🎯 Pojedynczy punkt odpowiedzialności | Jedna umowa, jeden zespół wsparcia, jeden partner integracyjny |
| 📋 Udowodniona zgodność | Wstępnie zweryfikowane pod kątem wymagań DEF-STAN 23-009 |
| 🔄 Bezproblemowe aktualizacje | Ulepsz dowolny komponent bez uszkadzania pozostałych |
| 💰 Przewidywalne koszty | Brak niespodziewanych opłat integracyjnych i pułapek licencyjnych |
| ⏱️ Szybsza dostawa | Zacznij od działającego oprogramowania, a nie pustych frameworków |
Comparison
Rozważania dotyczące zamówień publicznych
| Czynnik | Bystry DDS | RTI Connext | Cyklon DDS | OpenDDS | Szybki DDS |
|---|---|---|---|---|---|
| Model licencji | Elastyczne opcje | Reklama na miejsce | Zaćmienie EPL 2.0 | LGPL | Apache 2.0 |
| Koszt licencji | Konkurencyjny | $$$ za wdrożenie | Bezpłatny | Bezpłatny | Bezpłatny |
| Model wsparcia | Umowa z australijskim dostawcą | Globalne przedsiębiorstwo | Fundacja Eclipse | OCI komercyjne | Reklama eProsima |
| Wsparcie z siedzibą w Australii | ✅ Tak | ❌ Z siedzibą w USA | ❌ Nie | ❌ Z siedzibą w USA | ❌ Z siedzibą w Hiszpanii |
| GVA Pre-Integracja | ✅ Wbudowany | ❌ Praca na zamówienie | ❌ Zrób to sam | ❌ Zrób to sam | ❌ Zrób to sam |
| Dostępny pełny stos | ✅ Jedno źródło: HMI + LDM + DDS + Narzędzia | ❌ Tylko oprogramowanie pośredniczące | ❌ Tylko oprogramowanie pośredniczące | ❌ Tylko oprogramowanie pośredniczące | ❌ Tylko oprogramowanie pośredniczące |
| Narzędzia SysML | ✅ Bohemian + LDMX + ToolX | ❌ Żaden | ❌ Żaden | ❌ Żaden | ❌ Żaden |
| Kontrola eksportu | Jurysdykcja australijska | Rozważania dotyczące ITAR w USA | UE | NAS | UE |
Porównanie cech technicznych
| Funkcja | Bystry DDS | RTI Connext | Cyklon DDS | OpenDDS | Szybki DDS |
|---|---|---|---|---|---|
| DDSI-RTPS 2.5 | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ |
| Zabezpieczenia DDS 1.1 | ✅ Zakończ | ✅ Zakończ | ⚠️ Częściowo | ✅ Zakończ | ✅ Zakończ |
| X-Types 1.3 | ✅ Zakończ | ✅ Zakończ | ⚠️ Częściowo | ⚠️ Częściowo | ⚠️ Częściowo |
| Dynamiczny interfejs API danych | ✅ Zakończ | ✅ Zakończ | ❌ Żaden | ⚠️ Podstawowy | ⚠️ Podstawowy |
| Usługa TypeLookup | ✅ Zakończ | ✅ Zakończ | ❌ Żaden | ❌ Żaden | ⚠️ Częściowo |
| Filtrowanie treści | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ |
| Transport pamięci współdzielonej | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ❌ Żaden | ✅ Zakończ |
| Transport TCP | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ | ✅ Zakończ |
| Zero-Copy | ✅ Wspierane | ✅ Wspierane | ✅ Wspierane | ❌ Żaden | ✅ Wspierane |
Zgodność ze standardami
| Standard | Bystry DDS | RTI Connext | Cyklon DDS | OpenDDS | Szybki DDS |
|---|---|---|---|---|---|
| O mój Boże, DDS 1.4 | ✅ | ✅ | ✅ | ✅ | ✅ |
| O mój Boże DDSI-RTPS 2.5 | ✅ | ✅ | ✅ | ✅ | ✅ |
| O mój Boże, DDS-XTypes 1.3 | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ |
| O mój Boże, zabezpieczenia DDS 1.1 | ✅ | ✅ | ⚠️ | ✅ | ✅ |
| O mój Boże, IDL 4.2 | ✅ | ✅ | ✅ | ✅ | ✅ |
| DEF-STAN 23-009 (GVA) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Model danych lądowych v10.0.0 | ✅ | ❌ | ❌ | ❌ | ❌ |
Obsługa języków i platform
| Zdolność | Bystry DDS | RTI Connext | Cyklon DDS | OpenDDS | Szybki DDS |
|---|---|---|---|---|---|
| C++ | C++20 | C++11 | Opakowanie C99 | C++11 | C++11 |
| C | Przez C++ | ✅ Natywny | ✅ Natywny | ❌ | ✅ Natywny |
| Pyton | ✅ | ✅ | ✅ | ✅ | ✅ |
| Rdza | ✅ | ❌ | ✅ | ❌ | ❌ |
| Linux | ✅ | ✅ | ✅ | ✅ | ✅ |
| Okna | ✅ | ✅ | ✅ | ✅ | ✅ |
| VxWorks | Mapa drogowa | ✅ | ⚠️ | ✅ | ⚠️ |
| Wbudowany/RTOS | ✅ Zaprojektowany dla | ✅ Wariant mikro | ⚠️ | ⚠️ | ⚠️ |
| Łączenie statyczne | ✅ Pojedyncza biblioteka | ⚠️ | ⚠️ Biblioteki współdzielone | ⚠️ Biblioteki współdzielone | ⚠️ Biblioteki współdzielone |
Dlaczego Astute DDS wygrywa
| vs RTI Connext | vs CycloneDDS | w porównaniu z OpenDDS | vs Fast DDS |
|---|---|---|---|
| Elastyczne opcje licencjonowania | Pełne wsparcie dla typów X | Kompletny interfejs API danych dynamicznych | Wsparcie z siedzibą w Australii |
| Australijski dostawca, brak obaw dotyczących ITAR | Wbudowane zabezpieczenia | Usługa TypeLookup | Pełna zgodność z GVA |
| Pełny stos GVA z jednego źródła | Najlepszy w swojej klasie LDMX + ToolX | Najlepszy w swojej klasie LDMX + ToolX | Prostsze wdrożenie |
| Dołączona wersja LDM 10.0.0 | Wsparcie komercyjne | Jurysdykcja australijska | Kompletne typy X |
Why Astute DDS
„Skróciliśmy czas integracji GVA o 40% dzięki pakietowi Astute. Jeden dostawca odpowiedzialny za oprogramowanie pośredniczące, interfejs HMI i model danych wyeliminował wzajemne oskarżanie się, które było plagą poprzednich programów”.
— Kierownik programu, brytyjski premier obronny
Gwarancja interoperacyjności
Astute DDS jest w pełni interoperacyjny ze wszystkimi głównymi implementacjami DDS. Twój pojazd może bezproblemowo komunikować się z:
Brak uzależnienia od dostawcy. Jeśli system partnera korzysta z innej implementacji DDS, Astute DDS połączy się bez modyfikacji.
Zgodność ze standardami obronnymi
Zbudowany do wymagań wojskowych
| Standard | Status |
|---|---|
| DEF-STAN 23-009 | ✅ Pełna zgodność z GVA |
| Model danych lądowych v10.0.0 | ✅ Kompletne typy domen |
| STANAG NATO | ✅ Gotowy do interoperacyjności |
| Cybernetyczne podstawy | ✅ Certyfikowane bezpieczeństwo |
Bezpieczeństwo, któremu możesz zaufać
- 🔐 Szyfrowana komunikacja — wszystkie dane chronione podczas przesyłu
- 🎫 Uwierzytelnianie oparte na certyfikatach — łączą się tylko autoryzowane systemy
- 📋 Zasady kontroli dostępu — określ, kto może publikować lub subskrybować każdy temat
- 📝 Pełne rejestrowanie audytu — kompletny ślad przeglądów bezpieczeństwa
Sprawdzone w produkcji
Wdrożone w wielu programach
Astute DDS cieszy się zaufaniem czołowych producentów sprzętu obronnego w Australii, Wielkiej Brytanii i krajach sojuszniczych:
| Domena | Aplikacje |
|---|---|
| 🎖️ Pojazdy opancerzone | Wyświetlacze załogi, łączenie czujników, integracja uzbrojenia |
| 🤖 Robotyka i systemy autonomiczne | Bezzałogowe pojazdy naziemne, platformy robotyczne, autonomiczna nawigacja |
| 🛡️ Przeciwdziałanie bezzałogowym statkom powietrznym (CUAS) | Systemy wykrywania, śledzenia i omijania dronów |
| ✈️ Naziemne stacje kontroli | Dowodzenie i kontrola bezzałogowego statku powietrznego, sygnały z czujników |
| 🚢 Systemy morskie | Wyświetlacze na mostku, kontrola uszkodzeń, nawigacja |
| 🏭 Szkolenia i symulacje | Środowiska syntetyczne, przegląd po akcji, odprawa |
🎬 Poproś o demo
Zobacz Astute DDS i cały pakiet GVA w akcji. Dowiedz się więcej o naszym pakiecie lub zamów demonstrację już teraz.
Frequently Asked Questions
Oto najczęściej zadawane pytania przez programistów wdrażających Astute DDS.
1. Czym jest Astute DDS?
Astute DDS to implementacja usługi dystrybucji danych OMG w języku C++20
(DDS) API DCPS, protokół DDSI-RTPS 2.5, system typu DDS-XTypes 1.3,
Wtyczki DDS-Security 1.1/1.2 i IDL 4.2. Dostarczane jako statyczne
biblioteka libastutedds.a (oraz powiązania z C, Pythonem i Rustem) i jest dostarczana z
graficzny interfejs użytkownika narzędzia diagnostycznego astutedds-inspect i interoperacyjna wersja demonstracyjna Shapes.
2. Jak opublikować i zasubskrybować temat?
Utwórz DomainParticipant , Topic , a następnie DataWriter (strona wydawcy)
lub DataReader (strona subskrybenta):
using namespace astutedds::dcps;
auto dpf = DomainParticipantFactory::get_instance();
auto dp = dpf->create_participant(0, PARTICIPANT_QOS_DEFAULT, nullptr, 0);
auto topic = dp->create_topic("Hello", "HelloMsg", TOPIC_QOS_DEFAULT, nullptr, 0);
// Publisher
auto pub = dp->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr, 0);
auto writer = pub->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, nullptr, 0);
writer->write(sample, HANDLE_NIL);
// Subscriber
auto sub = dp->create_subscriber(SUBSCRIBER_QOS_DEFAULT, nullptr, 0);
auto reader = sub->create_datareader(topic, DATAREADER_QOS_DEFAULT, nullptr, 0);Zobacz Pierwsze kroki › Pierwsza aplikacja .
3. Jaka jest różnica między read() i take() ?
-
read()zwraca próbki, ale **pozostawia je w pamięci podręcznej czytnika**, dzięki czemu późniejsze wywołania (lub inni czytelnicy w tym samym subskrybencie) mogą je ponownie odczytać. -
take()zwraca próbki i **usuwa je** z pamięci podręcznej.
Użyj read() , gdy temat reprezentuje współdzielony stan, który chcesz sprawdzić
wielokrotnie; użyj take() , gdy temat reprezentuje zdarzenia, które chcesz uwzględnić
spożyć dokładnie raz.
4. Dlaczego subskrybenci, którzy dołączyli później, nie otrzymują próbek wcześniej?
Domyślnie DURABILITY jest VOLATILE , więc próbki są zapisywane przed subskrybentem
nie są dostarczane. Aby dostarczyć historyczne próbki osobom, które dołączyły później,
skonfiguruj autora i czytelników dopasowujących za pomocą TRANSIENT_LOCAL
trwałość (która wymaga również RELIABLE niezawodności):
DataWriterQos qos;
writer->get_qos(qos);
qos.durability().kind = TRANSIENT_LOCAL_DURABILITY_QOS;
qos.reliability().kind = RELIABLE_RELIABILITY_QOS;
writer->set_qos(qos); Aby zachować trwałość po ponownym uruchomieniu programu zapisującego, użyj
Usługa trwałości lub usługa TRANSIENT / PERSISTENT
rodzaje trwałości.
5. Do czego służy QoS RELIABILITY ?
-
BEST_EFFORT(domyślne dla wielu wbudowanych tematów): próbki utracone w sieci nie są retransmitowane. Najniższy narzut. -
RELIABLE: program zapisujący śledzi potwierdzenia (ACKNACK/heartbeat) od każdego dopasowanego czytnika i ponownie przesyła pominięte numery sekwencji, aż do
Czytelnik nadrobi zaległości lub historia się zakończy.
Niezawodność jest ustalana na podstawie osoby piszącej/czytelnika i musi być zgodna: BEST_EFFORT
Czytelnik może dorównać RELIABLE pisarzowi, ale nie odwrotnie.
6. Do czego służy DURABILITY QoS?
DURABILITY kontroluje, czy próbki są zachowywane w celu dostarczenia ich czytelnikomktóre łączą się po napisaniu przykładu:
| Uprzejmy | Dostępne dla osób, które dołączyły później? |
|---|---|
VOLATILE | NIE |
TRANSIENT_LOCAL | Tak, póki pisarz żyje |
TRANSIENT | Tak, przez cały okres istnienia pisarza (za pośrednictwem usługi trwałości) |
PERSISTENT | Tak, podczas ponownych uruchomień procesów (na dysku) |
7. Jaka jest różnica między HISTORY a DURABILITY ?
HISTORY ( KEEP_LAST(depth) lub KEEP_ALL ) kontroluje liczbę próbek pamięć podręczna pisarza/czytnika jest utrzymywana w dowolnym momencie. DURABILITY kontroluje, czy
Autor oferuje czytelnikom próbki, które później do siebie pasują. Pracują razem, ale
rozwiązuj różne problemy: samo KEEP_ALL nie udostępnia próbek
do tych, którzy dołączyli później.
8. Jak określić identyfikator domeny?
Przekaż identyfikator domeny jako pierwszy argument funkcji create_participant :
auto dp = DomainParticipantFactory::get_instance()
->create_participant(42, PARTICIPANT_QOS_DEFAULT, nullptr, 0); Uczestnicy z różnych domen nie komunikują się. Port DDSI-RTPS
wzór 7400 + 250 * domain_id określa podstawowe porty UDP używane dla
odkrycie.
9. Dlaczego mój wydawca i subskrybent nie mogą się wzajemnie odkryć?
Najczęstsze przyczyny:
- Różne identyfikatory domen — obaj uczestnicy muszą używać tego samego identyfikatora.
- Zablokowano multicast — SPDP używa multicastu UDP na
239.255.0.1przez
Domyślnie. Sprawdź zaporę hosta i przełącz podsłuch IGMP. - Nieprawidłowy interfejs sieciowy — na hostach wielodostępnych ustaw
ASTUTEDDS_NETWORK_INTERFACE=lub skonfiguruj go w profilu wykrywania JSON/XML (zobacz Konfiguracja wykrywania JSON ). - Niezgodna jakość usług — patrz pytanie 15.
- Różne transporty — sprawdź, czy obaj partnerzy korzystają z protokołu UDPv4 (lub obu protokołów UDPv6,
(TCP, SHM).
Włącz rejestrowanie śledzenia za pomocą ASTUTEDDS_LOG_LEVEL=trace i sprawdź pakiet
przechwyć za pomocą astutedds-inspect .
10. Jakie funkcje IDL są obsługiwane?
Dołączony kompilator astutedds-idl implementuje OMG IDL 4.2, w tym:
- Typy prymitywne (
boolean,octet, typy całkowiteint8–uint64,float/double/long double,char/wchar,string/wstring). - Struktury, unie, wyliczenia, maski bitowe, definicje typów.
- Sekwencje ograniczone i nieograniczone, tablice, mapy.
-
@key,@id,@optional,@default,@range,@min,@max,@unit,@extensibility(FINAL|APPENDABLE|MUTABLE),@nested. - Stałe i przestrzenie nazw
module.
Wygenerowany kod C++ domyślnie używa XCDR2 z opcjonalnym XCDR1 w celu zapewnienia współdziałania.
11. Jak filtrować próbki, które sam opublikowałem?
Dwie opcje:
- Ignoruj na poziomie uczestnika : wywołaj
dp->ignore_publication(handle)
przekazując lokalnyInstanceHandle_tpisarza. - Filtruj w wywołaniu zwrotnym czytnika za pomocą
SampleInfo::publication_handle
i porównując go zget_instance_handle()Twojego pisarza.
Temat filtrowany według treści może również wykluczać pole klucza samodzielnie opublikowanego.
12. Jakie znaki są dozwolone w nazwach tematów?
Nazwy tematów mogą zawierać znaki alfanumeryczne ASCII, _ i / jako
separator hierarchii. Długość jest ograniczona do 256 znaków. Unikaj wprowadzania znaków na początku.
Cyfry i zarezerwowane wbudowane prefiksy DDS ( DCPS , dds ). Nazwy typów następują
ta sama zasada.
13. Jak wykryć, że zdalny autor lub czytelnik zniknie?
Zainstaluj DataReaderListener i zaimplementuj on_subscription_matched /
on_liveliness_changed lub poll reader->get_subscription_matched_status() . current_count_changepole jest ujemne, gdy odpowiednik nie jest zgodny.
Żywotność jest regulowana przez LIVELINESS QoS — zestaw
kind = AUTOMATIC_LIVELINESS_QOS z czasem lease_duration do wykryciamilczących rówieśników w ograniczonym czasie.
14. Jak mogę otrzymać powiadomienie zwrotne, gdy otrzymam nowe dane?
Dołącz obiekt nasłuchujący za pomocą maski DATA_AVAILABLE_STATUS :
class MyListener : public DataReaderListener {
void on_data_available(DataReader* reader) override {
// call reader->take(...) here
}
};
reader->set_listener(&listener, DATA_AVAILABLE_STATUS); on_data_available uruchamia się zarówno dla nowych próbek, jak i cyklu życia instancji zmiany; zawsze sprawdzaj SampleInfo::valid_data przed dereferencją
próbka ładunku.
15. Co oznacza „niezgodne QoS”?
Nagrywarka i czytnik pasują tylko wtedy, gdy każde żądanie/oferowana jakość usługi jest
zgodny:
| Polityka | Poproszono ≤ Zaoferowano |
|---|---|
RELIABILITY | czytelnik BEST_EFFORT ≤ pisarz RELIABLE |
DURABILITY | rodzaj czytelnika ≤ rodzaj pisarza (w kolejności specyfikacji) |
DEADLINE | period czytelnika ≥ period pisarza |
LATENCY_BUDGET | duration czytelnika ≥ duration pisarza |
OWNERSHIP | musi być równy ( SHARED lub EXCLUSIVE ) |
PARTITION | co najmniej jedna nazwa partycji musi się pokrywać |
Nasłuchuj on_offered_incompatible_qos / on_requested_incompatible_qos
aby znaleźć dokładny identyfikator zasad w czasie wykonywania.
16. Jak wysyłać próbki większe niż datagram UDP?
Astute DDS automatycznie fragmentuje próbki większe niż skonfigurowane
fragment_size (domyślnie 1344 bajtów dla IPv4) i ponownie je składa Czytnik wykorzystujący podkomunikaty DDSI-RTPS DATA_FRAG . Protokół niezawodności
odzyskuje brakujące fragmenty bez konieczności ponownego wysyłania całej próbki.
W przypadku bardzo dużych próbek (≥ 1 MB) należy zwiększyć bufory gniazd systemu operacyjnego:
sudo sysctl -w net.core.rmem_max=8388608
sudo sysctl -w net.core.wmem_max=8388608i rozważyć przejście na transport w pamięci współdzielonej dla czytelników lokalnych.
17. Jak skonfigurować używany interfejs sieciowy?
Trzy opcje, w kolejności pierwszeństwa:
- Zmienna środowiskowa:
ASTUTEDDS_NETWORK_INTERFACE=eth0. - Konfiguracja wykrywania JSON — zobacz Konfiguracja wykrywania JSON .
- Profil QoS XML — zobacz Profile QoS DDS-XML .
Jeżeli nie ustawiono żadnej opcji, Astute DDS wybiera pierwszy interfejs bez pętli zwrotnej z
adres obsługujący multicast.
18. Czy mogę używać Astute DDS w sieci bez multicastu?
Tak. Dwie alternatywy:
- Lista równorzędnych połączeń SPDP w trybie jednokierunkowym : zapewnia listę par równorzędnych hostów/portów
konfiguracja wykrywania; Astute DDS jednokierunkowo wysyła ogłoszenia SPDP do każdego węzła. - Transport TCP : przełącz uczestnika na transport TCP RTPS
środowiska, które całkowicie blokują UDP. Zobacz
Router domeny DDS do przekraczania odizolowanych sieci.
19. Jak uzyskać niskie opóźnienie?
- Użyj niezawodności
RELIABLEz historiąKEEP_LAST(1)po obu stronach, aby
retransmisje są minimalne. - Włącz transport w pamięci współdzielonej dla uczestników znajdujących się w tej samej lokalizacji.
- Przypinaj wątki Astute DDS z powinowactwem do procesora i korzystaj z harmonogramowania w czasie rzeczywistym
(SCHED_FIFO) w procesach wydawcy i subskrybenta. - Wyłącz protokół Nagle przy użyciu protokołu UDP (domyślnie).
- Zwiększ bufory gniazd (patrz pytanie 16), aby absorbować impulsy.
- Ustaw
LATENCY_BUDGET = 0, aby wyłączyć jakiekolwiek opóźnienie w przetwarzaniu wsadowym.
20. Dlaczego widzę skoki opóźnień przy publikowaniu dużych próbek?
Gdy próbki przekraczają domyślny bufor gniazda systemu operacyjnego (często 208 KB w systemie Linux),
jądro upuszcza pakiety, a niezawodny protokół musi je ponownie przesłać, co powoduje
kolce. Podniesienie net.core.rmem_max / net.core.wmem_max do co najmniej
Rozmiar próbki rozwiązuje ten problem. Rozważ fragmentację z mniejszym fragment_size
w sieciach stratnych.
21. Jak połączyć dwie domeny DDS?
Użyj routera domenowego Astute DDS — usługi łączącej dwa lub więcej
domeny i przekazuje skonfigurowane tematy między nimi, z opcjonalnym
Filtrowanie kluczy/treści i translacja QoS. Zobacz
Router domeny DDS .
22. Jakie powiązania językowe są dostępne?
| Język | Status | Notatki |
|---|---|---|
| C++20 | Stabilny | Główne API — libastutedds.a |
| C | Stabilny | Płaskie API C dla FFI, patrz include/astutedds/c/astutedds.h |
| Pyton | Stabilny | powiązania pybind11, CPython 3.10 – 3.13 |
| Rdza | Beta | skrzynia astutedds (bezpieczne opakowanie dla API C) |
23. Jakie platformy i wersje systemów operacyjnych są obsługiwane?
| Platforma | Wersje testowane |
|---|---|
| Linux | Ubuntu 22.04 / 24.04, RHEL 9 / 10, AlmaLinux 9 / 10, Debian 12 |
| Okna | Windows 10, Windows 11, Windows Server 2022 |
Koła Linux Python są oznaczone jako manylinux_2_28 (glibc ≥ 2.28) i uruchamiane
na każdej kompatybilnej dystrybucji.
24. Jak włączyć zabezpieczenia DDS?
- Zapewnij artefakty tożsamości (X.509) i uprawnień (podpisany plik XML).
- Skonfiguruj właściwość uczestnika QoS za pomocą uwierzytelniania, kontroli dostępu i
Właściwości wtyczki kryptograficznej (certyfikat CA, certyfikat/klucz tożsamości, plik uprawnień,
plik zarządzania). - Łącze do Astute DDS zbudowanego z
-DASTUTEDDS_ENABLE_SECURITY=ON.
Aby uzyskać szczegółowe instrukcje i informacje, zapoznaj się z dokumentem DDS Security.
szablon zarządzania/uprawnień.
25. Jak zachować dane po ponownym uruchomieniu?
Uruchom usługę trwałości obok swojej domeny. Subskrybuje ona
skonfigurowane tematy TRANSIENT / PERSISTENT , przechowuje próbki lokalnie
bazy danych (domyślnie SQLite) i ponownie je publikuje w celu późniejszego dołączenia
subskrybenci — w tym również ci, którzy dołączają po odejściu pierwotnego autora.
Zobacz Usługa trwałości .
26. Jak rejestrować i odtwarzać ruch drogowy?
Użyj dołączonego narzędzia astutedds-record , aby przechwycić domenę w
.astdb i astutedds-replay , aby opublikować go z możliwością dostosowania Skalowanie czasu. Nagrywanie jest zależne od typu i wewnętrznie wykorzystuje XCDR2. Zobacz
Nagrywanie i odtwarzanie .
27. Jak rozwijać typ danych, nie psując subskrybentów?
Dodaj adnotację do typu IDL za pomocą @extensibility(MUTABLE) (lub APPENDABLE ) i
Oznacz każdego członka tagiem @id(N) . Zmienne strumienie XCDR2 umożliwiają:
- Dodawanie nowych członków na obu końcach.
- Usuwanie członków opcjonalnych.
- Zmiana kolejności członków.
Niedopasowani członkowie są pomijani zgodnie z zasadami przypisywalności X-Types.
@extensibility(FINAL) blokuje układ i musi być używany w przypadku plików binarnychważna jest kompatybilność ze starszymi czytnikami XCDR1.
28. Jak korzystać z tematów filtrowanych według treści?
Utwórz temat ContentFilteredTopic ze zwykłego tematu z filtrem podobnym do SQL
wyrażenie i powiąż z nim DataReader :
std::vector params{"42"};
auto cft = dp->create_contentfilteredtopic(
"HighSeverity", topic, "severity > %0", params);
auto reader = sub->create_datareader(cft, DATAREADER_QOS_DEFAULT, nullptr, 0); Jeśli to możliwe, filtr jest oceniany po stronie zapisującej w celu zaoszczędzenia przepustowości.
29. Jak skonfigurować QoS z pliku XML?
Użyj XmlQosLoader do odczytania profilu DDS-XML i zastosowania go podczas tworzenia
podmioty:
XmlQosLoader loader;
loader.load_file("qos_profiles.xml");
auto qos = loader.get_datawriter_qos("MyLib", "ReliableProfile");
auto writer = pub->create_datawriter(topic, qos, nullptr, 0); Zobacz profile QoS DDS-XML , aby zapoznać się ze schematem i pracą
przykłady.
30. Jak debugować problemy związane ze współdziałaniem lub wykrywaniem?
- Uruchom
astutedds-inspectw domenie, aby wyświetlić odkryte elementy
uczestników, punktów końcowych i statusu dopasowania w czasie rzeczywistym. - Przechwyć ruch za pomocą
tcpdump -i any -w dds.pcap 'udp port 7400 or portrange 7400-7500'i otwórz go w programie Wireshark — analizatorze protokołu RTPS
dekoduje SPDP, SEDP i dane użytkownika. - Włącz dzienniki śledzenia:
ASTUTEDDS_LOG_LEVEL=trace ASTUTEDDS_LOG_FILE=/tmp/astutedds.log. - Zweryfikuj identyfikatory i porty jednostek:
- Nagrywarka/czytelniczka SPDP:
00:01:00:c2/00:01:00:c7 - Publikacja SEDP:
00:00:03:c2/00:00:03:c7 - Subskrypcja SEDP:
00:00:04:c2/00:00:04:c7 - Port bazowy:
7400 + 250 × domain_id.
- Nagrywarka/czytelniczka SPDP:
- Potwierdź, że obaj partnerzy reklamują zgodne identyfikatory dostawców i wersję protokołu
(DDSI-RTPS 2.5).